Рефакторинг кода. Как оптимизировать количество if? Есть код, который принимает json данные и в зависимости от типа выполнить определённые действия. Весь код обработки находится в if'ах, добавление новых типов оказалось неудобным. Сейчас планирую вынести обработку в отдельные сервисы под каждый тип, а информацию передавать с помощью DTO. Но, это все равно не избавляет от сложности и количество if. Рассматривал возможность заменить на switch/match, но, такой вариант кажется не совсем верным. С похожей проблемой столкнулся и в другой части кода, где нужно обрабатывать по-разному в зависимости от состояния.if ('text' === $message->getType()) { // code } if ('poll' === $message->getType()) { // code } if ('image' === $message->getType()) { // code } С ООП немного знаком в теории, на практике, осмысленно, применять получается редко. Насколько я знаю в решении проблемы должен помочь полиморфизм, но, как правильно его применить не пойму.
Для оптимизации количества if-ов можно использовать паттерн проектирования "Стратегия".
Выносите обработку каждого типа сообщения в отдельный класс (стратегию) и создайте интерфейс для этих классов. Затем создайте фабрику, которая будет создавать нужный объект-стратегию в зависимости от типа сообщения.
Примерно так это может выглядеть:
interface MessageStrategy { public function handle($message); } class TextMessageStrategy implements MessageStrategy { public function handle($message) { // код обработки текстового сообщения } } class PollMessageStrategy implements MessageStrategy { public function handle($message) { // код обработки опросного сообщения } } class ImageMessageStrategy implements MessageStrategy { public function handle($message) { // код обработки изображения } } class MessageStrategyFactory { public static function create($type) { switch ($type) { case 'text': return new TextMessageStrategy(); case 'poll': return new PollMessageStrategy(); case 'image': return new ImageMessageStrategy(); default: throw new Exception('Unknown message type'); } } } $message = // получение сообщения из JSON $strategy = MessageStrategyFactory::create($message->getType()); $strategy->handle($message);
Таким образом, вы избавляетесь от большого количества if-ов и делаете код более расширяемым, так как легко добавить новый тип сообщения, просто добавив новую стратегию и обновив фабрику.
Для оптимизации количества if-ов можно использовать паттерн проектирования "Стратегия".
Выносите обработку каждого типа сообщения в отдельный класс (стратегию) и создайте интерфейс для этих классов. Затем создайте фабрику, которая будет создавать нужный объект-стратегию в зависимости от типа сообщения.
Примерно так это может выглядеть:
interface MessageStrategy {public function handle($message);
}
class TextMessageStrategy implements MessageStrategy {
public function handle($message) {
// код обработки текстового сообщения
}
}
class PollMessageStrategy implements MessageStrategy {
public function handle($message) {
// код обработки опросного сообщения
}
}
class ImageMessageStrategy implements MessageStrategy {
public function handle($message) {
// код обработки изображения
}
}
class MessageStrategyFactory {
public static function create($type) {
switch ($type) {
case 'text':
return new TextMessageStrategy();
case 'poll':
return new PollMessageStrategy();
case 'image':
return new ImageMessageStrategy();
default:
throw new Exception('Unknown message type');
}
}
}
$message = // получение сообщения из JSON
$strategy = MessageStrategyFactory::create($message->getType());
$strategy->handle($message);
Таким образом, вы избавляетесь от большого количества if-ов и делаете код более расширяемым, так как легко добавить новый тип сообщения, просто добавив новую стратегию и обновив фабрику.