Как упростить сложный бизнес “ЕСЛИ” логика?

Метод, который работает приятно в Safari. Также работы в Firefox и Opera, но с предупреждением.

Location: http://logout@yourserver.example.com/

Это говорит браузеру открывать URL с новым именем пользователя, переопределяя предыдущее.

14
задан Bill the Lizard 29 May 2010 в 20:53
поделиться

8 ответов

Я бы написал общий конечный автомат, который питается списками вещей для сравнения.

4
ответ дан 1 December 2019 в 09:01
поделиться

Хороший вопрос. «Условная сложность» - это запах кода. Полиморфизм - ваш друг.

Условная логика невинна в зачаточном состоянии, когда ее просто понять и содержать в несколько строк кода. К сожалению, он редко стареет хорошо. Вы внедряете несколько новых функций и suddenly your conditional logic becomes complicated and expansive. [Joshua Kerevsky: Refactoring to Patterns]

One of the simplest things you can do to avoid nested if blocks is to learn to use Guard Clauses.

double getPayAmount() {
if (_isDead) return deadAmount();
if (_isSeparated) return separatedAmount();
if (_isRetired) return retiredAmount();
return normalPayAmount();
};  

The other thing I have found simplifies things pretty well, and which makes your code self-documenting, is Consolidating conditionals.

double disabilityAmount() {
    if (isNotEligableForDisability()) return 0;
    // compute the disability amount

Other valuable refactoring techniques associated with conditional expressions include Decompose Conditional, Replace Conditional with Visitor, and Reverse Conditional.

12
ответ дан 1 December 2019 в 09:01
поделиться

Объектно-ориентированный способ сделать это - иметь несколько классов скидок, реализующих общий интерфейс:

dicsount.apply(order)

Поместите логику для определения того, соответствует ли заказ критериям скидки в рамках классов скидок.

2
ответ дан 1 December 2019 в 09:01
поделиться

Использование защитных предложений может некоторым помочь.

1
ответ дан 1 December 2019 в 09:01
поделиться

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

if (discount.isPercentage) {
  callFunctionOne(...);
} else if (discount.isValue) {
  callFunctionThree(...);
} else if (discount.isXXX) {
  callFunctionTwo(...);
}

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

0
ответ дан 1 December 2019 в 09:01
поделиться

FWIW, я очень успешно использовал Hamcrest для такого рода вещей. Думаю, можно сказать, что он реализует шаблон спецификации, о котором говорил @Arnis.

1
ответ дан 1 December 2019 в 09:01
поделиться

Создайте методы, проверяющие конкретный случай.

bool IsValueNormalAndRequiresCoopon (Скидка со скидкой) {...}

bool IsValueNormalAndRequiresCoupon (Скидка со скидкой) {...}

и т. д.

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

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

0
ответ дан 1 December 2019 в 09:01
поделиться

Шаблон спецификации может быть тем, что вы ищете.

Резюме:

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

9
ответ дан 1 December 2019 в 09:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: