Так как вы долго отвечаете и в принципе, отвечаете так как я и предпологал, то я написал пример вашего кода и моего, резултат их работы одинаков.
Ваш код(форматированый и дописаный)
<?php
class Enimals_Sounds
{
public static function кошка()
{
echo 'мяу';
}
public static function собака()
{
echo 'гав';
}
public static function селедка()
{
echo '...';
}
}
class Enimals_Jump
{
public static function кошка()
{
}
public static function собака()
{
}
public static function селедка()
{
}
}
class Enimals_MoveTail
{
public static function кошка()
{
}
public static function собака()
{
}
public static function селедка()
{
}
}
class My_Enimals_Sounds extends Enimals_Sounds
{
public static function лошадка()
{
echo 'игого';
}
}
class My_Enimals_Jump extends Enimals_Jump
{
public static function лошадка()
{
}
}
class My_Enimals_MoveTail extends Enimals_MoveTail
{
public static function лошадка()
{
}
}
class Zoo
{
public static $Зверушки = array();
public static function run($action)
{
if (!class_exists($action))
throw new Exception();
foreach (self::$Зверушки as $Животина) {
$action::$Животина();
}
}
}
Zoo::$Зверушки = array('кошка', 'собака', 'лошадка');
Zoo::run('My_Enimals_Sounds');
Zoo::$Зверушки = array('кошка', 'собака', 'селедка', 'лошадка');
Zoo::run('My_Enimals_Jump');
Zoo::run('My_Enimals_MoveTail');
итого 114 строк
Минусы:
- Вы меняли код класса Zoo в методе run
- Сомнительный подход с наследованием классов действий, можно характеризовать как "костыль", по той парадигме которой вы выбрали, лучше бы было добавить метод "лошадка" в существующие классы(но это приведет к изменению классов)
мой код
<?php
class Animal
{
protected $voice;
public function doVoice()
{
echo $this->voice;
}
public function doJump()
{
}
public function doMoveTail()
{
}
}
class AnimalFactory
{
@return @param
static public function newAnimal($animal)
{
$className = ucfirst($animal);
if (!class_exists($className)) {
throw new Exception(sprintf('class for %s not found', $animal));
}
return new $className;
}
}
class Horse extends Animal
{
protected $voice = 'Игого';
}
class Cat extends Animal
{
protected $voice = 'мяу';
}
class Dog extends Animal
{
protected $voice = 'гав';
}
class Fish extends Animal
{
protected $voice = 'буль-буль';
}
class Zoo
{
protected $animals = array();
public function addAnimal(\Animal $animal)
{
$this->animals[] = $animal;
}
public function doIt(\AbstractAction $action)
{
foreach ($this->animals as $animal) {
$action->action($animal);
}
}
}
abstract class AbstractAction
{
abstract public function action(\Animal $animal);
}
class JumpAction extends AbstractAction
{
public function action(\Animal $animal)
{
$animal->doJump();
}
}
class VoiceAction extends AbstractAction
{
public function action(\Animal $animal)
{
$animal->doVoice();
}
}
class MoveTailAction extends AbstractAction
{
public function action(\Animal $animal)
{
$animal->doMoveTail();
}
}
class AllAction extends AbstractAction
{
public function action(\Animal $animal)
{
$animal->doJump();
if (!($animal instanceof Fish)) {
$animal->doVoice();
}
$animal->doMoveTail();
}
}
$zoo = new \Zoo;
$zoo->addAnimal(AnimalFactory::newAnimal('cat'));
$zoo->addAnimal(AnimalFactory::newAnimal('dog'));
$zoo->addAnimal(AnimalFactory::newAnimal('fish'));
$zoo->addAnimal(AnimalFactory::newAnimal('horse'));
$action = new \AllAction;
$zoo->doIt($action);
149 строк
Минусы:
- Больше классов
- Больше потребляет ресурсов
Выводы(на данный момент): Ваш код более производительный, но при этом для изменения поведения нужно править существующий код, в моем же случае с производительностью беда, но классы я не правил, а добавлял новые. При том количество строк не различается в разы, заметьте это.
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации