@onami

Как избавиться от кучи if в методе?

На собеседование задали такой вопрос: имеется метод, который занимается подтверждением заказов. Потом от бизнеса приходит требование: при подтверждении заказа на сумму более 1000 рублей выдавать этому клиенту скидочный купон на новые покупки. Далее от бизнеса приходит требование для заказов от 10 000 рублей выдавать клиенту постоянную скидку, и так далее.

Вопрос в следующем: как мы можем реализовать эту логику, не превращая метод в кучу if-ов?

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

Мне кажется, интервьюер ожидал другого ответа. Может быть, надо было упомянуть какой-нибудь шаблон проектирования (какой, кстати)?

Как бы вы ответили на этот вопрос? Интересно узнать ваше мнение.
  • Вопрос задан
  • 854 просмотра
Пригласить эксперта
Ответы на вопрос 7
xez
@xez
TL Junior Roo
Похоже на chain of responsibility.
Смысл в том чтобы создавать обработчики заказа, которые будут передавать его друг-другу по цепочке пока в каком-то из них он не будет обработан.
Ответ написан
@AlexSku
не буду отвечать из-за модератора
Обычно вместо кучи if делают swich case.
Ответ написан
vabka
@vabka
Токсичный шарпист
Я думаю, интервьюер чуть более конкретный и развёрнутый ответ, тк таблица сама скидки не назначит и статус клиента не поменяет - этим должен заниматься какой-то вполне определённый код.
И опять же - как должны в эту таблицу условия и действия записываться?
Ответ написан
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Может хотел от вас услышать, что по таблице можно искать бинарным поиском.
Ответ написан
Комментировать
Therapyx
@Therapyx
Data Science
именно в данном случае в голвоу полезло следующее, где будет один иф :)
Во первых этот список должен кем-то заполняться и изменяться и уж точно не программистом в хард-коде.
т.е. должна быть там блица по типу key value
1000 - плюшка
10000 - другая плюшка
20000 - ...
n - m

делаем некий адаптер, куда будет передана сумма заказа - загружаем в нём к примеру в сет, который будет отсортирован с этой таблицей.
после чего ищем число которое и через итерацию проверяяем
если число больше, чем текущий индекс и меньше, чем индекс +1 значит это наш range откуда надо достать плюшку из value.

А чего ожидал интервьювер, увы не знаю.
Ответ написан
vitaly_74
@vitaly_74
Я думаю это декоратор или цепочка обязанностей.
Но т.к. у вас речь ведется вокруг одного объекта (заказа) то я думаю это декоратор.
Обработчики в Цепочке обязанностей могут выполнять произвольные действия, независимые друг от друга, а также в любой момент прерывать дальнейшую передачу по цепочке. С другой стороны Декораторы расширяют какое-то определённое действие, не ломая интерфейс базовой операции и не прерывая выполнение остальных декораторов.

Декоратора и цепочка обязанностей очень похожи друг на друга. Подробней о декораторах .
Ответ написан
Комментировать
@itPiligrim
Front-end разработчик + 1С
Просто создаются методы вроде "ВыдатьСкидку", "ВыдатьПостояннуюСкиду", "ВыдатьКупон" и вызываются последовательно. Логика каждого метода зашита в методе. В корневом методе никаких if нет. Код читается сверху вниз линейно. Каждый метод в начале имеет проверку условий и если условия не удовлетворяются, то метод сразу выходит. Сложнее будет, если методы будут взаимосвязаны, но это уже другая история.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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