Каковы хорошие способы обработки сложной бизнес-логики, которая с первого взгляда требует множества вложенных операторов if?
Пример:
Скидка. может быть:
1a) Скидка стоимости
1b) Процентная скидка
2a) Нормальная скидка
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) {
}
}
Даже если вы замените IFs на переключатель /case, это все еще слишком сложно. Каковы способы сделать его читабельным, ремонтопригодным, более проверяемым и понятным?