Комбинации значений
От: Blazkowicz Россия  
Дата: 06.12.12 12:15
Оценка:
Приветствую!

Посоветуйте, пожалуйста, подход для реализации сложных условий с большим количеством вариантов.
Нужно реализовать метод. Что-то типа такого.
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 сделать?

Какое существует общепринятое решение и по каким ключевым словам гуглить?

Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.