Метод, который работает приятно в Safari. Также работы в Firefox и Opera, но с предупреждением.
Location: http://logout@yourserver.example.com/
Это говорит браузеру открывать URL с новым именем пользователя, переопределяя предыдущее.
Я бы написал общий конечный автомат, который питается списками вещей для сравнения.
Хороший вопрос. «Условная сложность» - это запах кода. Полиморфизм - ваш друг.
Условная логика невинна в зачаточном состоянии, когда ее просто понять и содержать в несколько строк кода. К сожалению, он редко стареет хорошо. Вы внедряете несколько новых функций и 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.
Объектно-ориентированный способ сделать это - иметь несколько классов скидок, реализующих общий интерфейс:
dicsount.apply(order)
Поместите логику для определения того, соответствует ли заказ критериям скидки в рамках классов скидок.
Использование защитных предложений может некоторым помочь.
Моя первая мысль заключается в том, что это невозможно проверить, что приводит меня к решение, чтобы его можно было проверить.
if (discount.isPercentage) {
callFunctionOne(...);
} else if (discount.isValue) {
callFunctionThree(...);
} else if (discount.isXXX) {
callFunctionTwo(...);
}
Затем вы можете сделать каждый вложенный оператор if отдельным вызовом. Таким образом, вы можете тестировать их индивидуально, а когда вы тестируете большую группу, вы знаете, что работает каждый в отдельности.
FWIW, я очень успешно использовал Hamcrest для такого рода вещей. Думаю, можно сказать, что он реализует шаблон спецификации, о котором говорил @Arnis.
Создайте методы, проверяющие конкретный случай.
bool IsValueNormalAndRequiresCoopon (Скидка со скидкой) {...}
bool IsValueNormalAndRequiresCoupon (Скидка со скидкой) {...}
и т. д.
Как только вы начнете это делать, станет легче увидеть, где вы можете абстрагироваться от общей логики между вариантами. Затем вы можете перейти оттуда.
Для сложных решений я часто получаю класс, который обрабатывает возможные состояния.
Шаблон спецификации может быть тем, что вы ищете.
Резюме:
В компьютерном программировании шаблон спецификации - это особый шаблон проектирования программного обеспечения, посредством которого бизнес-логика может быть рекомбинированы путем объединения бизнес-логики вместе с использованием логической логики.