Приветствую!
Посоветуйте, пожалуйста, подход для реализации сложных условий с большим количеством вариантов.
Нужно реализовать метод. Что-то типа такого.
public Color findDefault(boolean dark, boolean saturated, boolean positive);
В реальности там не только булеан с двумя значениями, но и энумы по 3-4 значения. И параметров больше чем 3.
Производительность не критичная. Важно простота понимания и модификации.
Тривиальный подход if..else
if(dark){
if(saturated){
if(positive){
return Color.C1;
}else{
return Color.C2;
}
}else{
if(positive){
return Color.C3;
}else{
return Color.C2;
}
}
}else{
if(saturated){
if(positive){
return Color.C4;
}else{
return Color.C4;
}
}else{
if(positive){
return Color.C4;
}else{
return Color.C1;
}
}
}
Такой код плохо читается и ещё хуже модифицируется.
Переделал на таблицу (значения не соответствуют, просто иллюстрация)
//Инициализация
map.put(new Key(0, 0, 0), Color.1);
map.put(new Key(0, 0, 1), Color.2);
map.put(new Key(0, 1, 0), Color.1);
map.put(new Key(0, 1, 1), Color.4);
map.put(new Key(1, 0, 0), Color.3);
map.put(new Key(1, 0, 1), Color.3);
map.put(new Key(1, 1, 0), Color.1);
map.put(new Key(1, 1, 1), Color.3);
//Сам метод:
map.get(new Key(dark, saturated, positive));
Смущает то что самих вариантов результата не так много. И существую пересечения. Таблицу с десятками комбинаций всё ещё не так легко поддерживать.
Теперь думаю над таким варинтом.
//Инициализация
Color.1 = new Color("dark/*/positive");
Color.2 = new Color("dark/saturate/positive");
Color.3 = new Color("!dark/!saturate/*");
//Сам метод:
for (Color c : colors){
if(c.match(dark, saturate, positive)){
return c;
}
}
Смущает полный перебор (хотя и не критично). Ещё как-то малой кровью надо реализовать синтаксис шаблонов. Может через regexp сделать?
Какое существует общепринятое решение и по каким ключевым словам гуглить?
Спасибо.