Каковы хорошие способы обработки сложной бизнес-логики, которая с первого взгляда требует много вложенных операторов if?
Пример:
Купон на скидку. может быть:
1а) Значение скидки
1b) Процентная скидка
2а) Обычная скидка
2b) Прогрессивная скидка
3a) Требуется купон на доступ
3b) Не требуется купон доступа
4a) Применяется только к клиенту, который уже купил до
4b) Применимо к любому клиенту
5a) Применяется только для клиентов из стран (X, Y,…)
Это требует еще более сложного кода:
if (discount.isPercentage) {
if (discount.isNormal) {
if (discount.requiresAccessCoupon) {
} else {
}
} else if (discount.isProgressive) {
if (discount.requiresAccessCoupon) {
} else {
}
}
} else if (discount.isValue) {
if (discount.isNormal) {
if (discount.requiresAccessCoupon) {
} else {
}
} else if (discount.isProgressive) {
if (discount.requiresAccessCoupon) {
} else {
}
}
} else if (discount.isXXX) {
if (discount.isNormal) {
} else if (discount.isProgressive) {
}
}
Даже если вы замените IF для переключения / дела, это все равно слишком сложно.
Как можно сделать его читабельным, понятным, более тестируемым и простым для понимания?