Какой шаблон лучше подходит для избавления от множества if? Привет
В программе есть куча обьектов различных классов (самолеты, катера, вертолеты, танки, машины, грузовики), которые подключают различные
интерфейсы (ехать, лететь, стрелять, перевозить). Соответсвенно в коде надо использовать кучу условий чтобы понять что за обьекто
и какой метод можно вызвать:foreach($vehicles as $vehicle) {
switch($vehicle->type)
{
case 'car':
$vehicle->move();
$vehicle->closeDoor();
break;
case 'ship':
$vehicle->move();
$vehicle->swim();
break;
case 'airplane':
$vehicle->fly();
$vehicle->landing();
break;
case 'tank':
$vehicle->move();
$vehicle->stop();
$vehicle->fire();
break;
}
$vehicle->stop();
}
Не могу понять какую лучше использовать технику чтобы избавится от кучи if в программе ? тк методы у обьекта могут быть разные полиморфизм не подходит, надо точно знать
обьект какого класса используется.

21 Авг 2019 в 07:01
172 +1
0
Ответы
1

Для избавления от множества if-ов в данном случае можно применить паттерн "Стратегия" (Strategy).

Суть этого паттерна заключается в том, что каждый тип вида перевозки (автомобиль, корабль, самолет, танк и т.д.) имеет свой собственный класс, реализующий один интерфейс, например, интерфейс "TransportStrategy". В этом интерфейсе есть методы, общие для всех видов транспорта, например, move(), stop(), fire(), swim() и т.д.

Каждый класс транспорта (автомобиль, корабль, самолет, танк и т.д.) реализует свою конкретную стратегию этих методов. Например, у класса "Car" метод move() будет реализован для езды по дороге, у класса "Ship" метод move() будет реализован для плавания по воде и т.д.

Теперь в вашем коде можно использовать этот паттерн следующим образом:

foreach($vehicles as $vehicle) {
$strategy = new TransportStrategyFactory($vehicle);
$strategy->move();
$strategy->stop();
$strategy->executeSpecificAction();
}

Таким образом, при добавлении новых классов транспорта и методов, вам не придется изменять большое количество if-ов, а просто добавить новую конкретную стратегию в соответствующем классе.

Этот подход также позволяет легко тестировать каждый класс транспорта отдельно и обеспечивает гибкость и расширяемость вашей системы.

20 Апр в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 95 117 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир