реклама
разместить

Перестаньте использовать операторы if-else

Перестаньте использовать операторы  if-else

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

Возможно вы даже используете if-else по умолчанию, но давайте положим этому конец и заменим его объектами состояния.

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

Даже если вы слышали о шаблоне состояния, вы можете задаться вопросом, как он реализуется в готовом к работе коде.

Для тех, кто все еще в неведении, вот очень краткое вступление:

Вы будете усложнять читаемость кода с каждым новым условным требованием, реализованным с помощью If-Else.

Применяя шаблон состояний, вы просто изменяете поведение объектов, используя специализированные объекты состояний вместо операторов If-Else.

Прошли те дни, когда код выглядел так:

Перестаньте использовать операторы  if-else

Вы, конечно, уже писали более сложные ветки. Уверен, что несколько лет назад.

Логика ветвления выше даже не очень сложна - но попробуйте добавить новые условия, и вы увидите, как эта штука взорвётся.

Также, если вы думаете, что создание новых классов вместо простого использования ветвлений звучит раздражающе, подождите, пока увидите это в действии. Это лаконично и элегантно.

Еще лучше, это сделает вашу кодовую базу более солидной.

"Ладно, я убежден, что If-else - зло, а теперь покажите мне, как избежать кода разветвления”.

Мы рассмотрим, как я заменю If-Else ветвление в коде, готовом к производству. Это вымышленный пример, но этот подход я использовал, работая с крупными клиентами.

Давайте создадим очень простой Booking class, в котором есть пара состояний.Также у него будет два открытых метода: Accept( ) и Cancel( ).

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

Перестаньте использовать операторы  if-else

Рефакторинг логики ветвления из нашего кода - это трехступенчатый процесс:

1.Создайте абстрактный базовый класс состояния

2.Реализуйте каждое состояние как отдельный класс, наследуемый от базового состояния.

3.Пусть класс "Booking" имеет частный или внутренний метод, который принимает в качестве параметра базовый класс состояния

Demo time.

Во-первых, нам нужен класс базового состояния, от которого унаследуют все состояния.

Перестаньте использовать операторы  if-else

Обратите внимание, что в этом базовом классе также есть два метода, Accept и Cancel - хотя здесь они помечены как внутренние.

Кроме того, базовое состояние имеет "специальный" метод EnterState . Он вызывается всякий раз, когда объекту Booking присваивается новое состояние.

Во-вторых, мы делаем отдельные классы для каждого состояния, которое мы хотим представить.

Перестаньте использовать операторы  if-else

Обратите внимание, что каждый класс представляет состояние, как описано на красивой диаграмме выше. Кроме того, CancelledState не позволит нашему резервированию перейти в новое состояние. Этот класс очень похож по духу на Null Object Pattern.

Наконец, сам класс Booking.

Перестаньте использовать операторы  if-else

Видите, как класс Booking просто делегирует реализацию Accept and Cancel своему объекту состояния?

Это позволяет снять большую часть условной логики и позволяет каждому состоянию сосредоточиться только на том, что важно для него самого - текущее состояние также имеет возможность перевести booking в новое состояние.

Как справляться с новыми условными характеристиками?

Если новая функция обычно реализовывалась с помощью некоторой условной проверки, то теперь можно просто создать новый класс состояния.

Это так же просто. Вам больше не придется иметь дело с громоздкими операторами if-else.

Как сохранить объект состояния в базе данных?

Никак.

Объект состояния не важен при сохранении объекта, например, в базу данных SQL или NoSQL. Важно только знать состояние объекта и то, как он должен быть отображен в столбце.

Вы можете сопоставить состояние с именем дружественного типа, перечислением или целым числом. Что бы вам ни было удобно, при условии, что у вас есть какой-нибудь способ преобразования сохраненного значения обратно в объект состояния.

Это много дополнительных классов!

Да уж. Как я уже упоминал в другой статье, сложность заключается не в количестве классов, а в обязанностях, которые эти классы берут на себя.

Наличие множества специализированных классов сделает вашу кодовую базу более читабельной, удобной в обслуживании и просто более приятной для работы.

Автор:Nicklas Millard.

Перевод:Федоров Матвей.

Еще больше полезной и нужной информации вы найдете в нашем Телеграм-канале по ссылке:

22
реклама
разместить
3 комментария

Пример Java головного мозга, относительно простая функция, понимание которой не требует даже комментариев, раздулась до нескольких классов в которых без документации и пояснений не разобраться. 

Впечатление на неопытных конечно производит и кодовая база действительно выглядит СОЛИДНОЙ, но людей с таким стремлением к усложнениям даже близко нельзя подпускать к реальным проектам )

8

Комментарий недоступен

4

Поддерживаю полностью! Встречались подобные проекты. Когда сидишь и втыкаешь во все это и почти слышишь голос автора этого чуда -"смотри как я могу. И вот тут ещё... И вот здесь."

Сорян. Нахлынуло

1

Комментарий недоступен

4

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

3

Комментарий недоступен

1
80 нейросетей, которые помогут тебе разобраться в теме и проанализируют десятки источников. Залил в одну табличку + краткое описание — эпичная подборка
80 нейросетей, которые помогут тебе разобраться в теме и проанализируют десятки источников. Залил в одну табличку + краткое описание — эпичная подборка
7979
33
33
22
Мне нужна нейросеть чтобы разобраться в подборке из 80 нейросетей
реклама
разместить
HR-менеджер в Китае «пристроил» 22 «мёртвые души» и присвоил себе причитающиеся им $2,2 млн

Ему удалось оставаться незамеченным восемь лет.

Источник фото: La Hoguera Mx
2424
66
44
33
Азия-с. Поскреби любую управу в у нас в городе на наличие существующих на бумаге и реальных дворников и будешь удивлен.
Улицы будущего: как ДПК меняет городскую среду

На городских улицах и в парках всё чаще стали встречаться объекты и элементы благоустройства из необычных материалов. В некоторых городах проводят испытания (и довольно успешно) древесно-полимерного композита.

Городская сцена из ДПК  
22
11
11
11
Минпромторг России попросил бизнес рассказать, снятия каких санкций он бы хотел в первую очередь — Reuters

Самыми «обременительными» собеседники издания называют ограничения, связанные с платежами.

2121
33
22
11
Баян, но разве санкции не на пользу?
«Алмаз-Антей» заморозил проект электромобиля E-Neva — «Ъ»

Для оборонного предприятия электрокар — не приоритет, говорят источники издания.

Прототип E-Neva. Источник: Минпромторг
3030
44
Климат у нас такой. Полгода зима. Вот многие проекты и замораживаются.
S7 запланировала сменить базовый аэропорт с Домодедово на Внуково или Шереметьево — «Ъ»

Это может лишить авиагавань значительной части выручки.

Источник фото: : Кирилл Кухмарь / ТАСС
1111
Игорь Рыбаков меняет формат традиционной школы: в сентябре откроется уникальный «Центр Образования Силы Сообществ» на Ботаническом саду

Рыбаков Фонд, частная филантропическая организация Игоря и Екатерины Рыбаковых, уже 10 лет формирует идею меценатства как новой нормы. В связи с этим новый образовательный проект, который будет запущен в сентябре 2025 года на месте коммерческой школы Брукс, трансформируется из платной школы в Центр образования, полностью финансируемый меценатами.

Игорь Рыбаков меняет формат традиционной школы: в сентябре откроется уникальный «Центр Образования Силы Сообществ» на Ботаническом саду
Сооснователь файлообменника The Pirate Bay Карл Лундстрём погиб в авиакатастрофе

Ему было 64 года.

Сооснователь файлообменника The Pirate Bay Карл Лундстрём погиб в авиакатастрофе
3030
44
[]