@Speakermen

Если заменить условный оператора полиморфизмом в чём суть?

В чём фишка замены? Если сделать FactoryMethod (Фабричный метод) преимущества в том что я могу дергать методы или создавать классы по названиям например?

class Bird
{
  public function getSpeed($type)
  {
    switch ($type) {
      case 'EUROPEAN':
        return 'EUROPEAN';
      case 'AFRICAN':
        return 'AFRICAN';
      case 'NORWEGIAN_BLUE':
        return 'NORWEGIAN_BLUE';
    }
    throw new Exception('Should be unreachable');
  }
}

echo (new Bird())->getSpeed('AFRICAN');


abstract class Bird
{
  abstract function getSpeed();
}

class European extends Bird
{
  public function getSpeed()
  {
    return 'EUROPEAN';
  }
}
class African extends Bird
{
  public function getSpeed()
  {
    return 'AFRICAN';
  }
}
class NorwegianBlue extends Bird
{
  public function getSpeed()
  {
    return 'NORWEGIAN_BLUE';
  }
}

echo (new NorwegianBlue())->getSpeed();


Вроде фабрика если что поправьте я новичок

class BirdFactory
{
  public function create($type)
  {
    switch ($type) {
      case 'EUROPEAN':
        return new European();
      case 'AFRICAN':
        return new African();
      case 'NORWEGIAN_BLUE':
        return new NorwegianBlue();
    }
    throw new Exception('Should be unreachable');
  }
}

abstract class Bird
{
  abstract function getSpeed();
}

class European extends Bird
{
  public function getSpeed()
  {
    return 'EUROPEAN';
  }
}
class African extends Bird
{
  public function getSpeed()
  {
    return 'AFRICAN';
  }
}
class NorwegianBlue extends Bird
{
  public function getSpeed()
  {
    return 'NORWEGIAN_BLUE';
  }
}

echo (new BirdFactory())->create('EUROPEAN')->getSpeed();
  • Вопрос задан
  • 227 просмотров
Решения вопроса 1
Stalker_RED
@Stalker_RED
Суть в том, что ООП - это подход для того, чтобы уменьшить сложность СЛОЖНЫХ программ.
Поэтому когда вы берете простой пример с тремя птичками или "cat says meow, doggy says bark", то разница не видна. В особо тяжелых случаях ООП код будет даже казаться более сложным, чем обычный if или switch.

Представьте себе код какой-нибудь игры, масштаба warcraft, например. Там где есть несколько десятков разновидностей юнитов - всякие эльфы, орки, люди, палладины, лучники, снайперы, драконы, катапульты...
Все они основаны на одном классе Unit, у всех есть много общего кода - методы получения координат, получение урона, отображение хелсбара, команды типа "держать позицию", "патрулировать" "атаковать"...
При этом есть и различия в поведении - разная скорость, разные показатели урона, здоровья, брони, размера. Даже алгоритмы поиска пути могут отличаться, т.к. часть юнитов могут пройти в узком проходе, другие не могут, а кто-то вообще может летать,

И если написать это на ООП, то у вас будет класс Unit с общими методами, и несколько десятков классов
Paladin extends Unit
GoblinTechies extends Unit
GoldenDragon extends Unit
в каждом из которых учтены особенности конкретного типа юнитов.

А если без ООП, то у вас остаются условные операторы. Десятки условий для здоровья, еще десятки для брони, еще десятки для скорости, и в итоге каша такого размера и сложности, что работать с этим в какой-то момент станет невыносимо.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы