2010-11-12 2 views
4

я работаю над дизайном системы принятия решений, которая вызывает усложнять логику, потенциально мне нужно будет использовать много вложенных если/иначе,, что это правильный шаблон дизайна для усложняет принятие решений системы

Я хочу чтобы увидеть, есть ли лучший дизайн, чем может помочь мне упростить структуру системы и обеспечить определенную расширяемость для будущего улучшения.

Проблема проекта может быть Simpified как:

Мы теперь должны принимать решение для запроса, который имеет 3 типа свойств и потенциально более. Это PricePolicy (Contract/WholeSale/Retail/Discount), RequestType (покупка/продажа) и ProductType (мода/быт/игрушки).

Каждое решение основано на всех трех свойствах запроса, поскольку тип ценовой политики может измениться в будущем, и в процесс принятия решений будет добавлено больше свойств.

Таким образом, я стараюсь избегать создания большого оператора switch, который является уродливым и изощренным для будущих расширений. Такие как:

switch(ProductType) { 
case Fashion: 
    switch(PricePolicy) { 
    case Contract: 
     if(Request == Buy) { 
     // making a decision. 
     } else { 
     } 
    } 
    } 
} 

Пожалуйста, поделитесь идеей и предложениями Спасибо.

Приветствия, Боб

+0

Для таких систем Prolog - ваш друг – Enrique

ответ

6

Может быть, вы хотите RETE правила двигателя. Попробуйте Drools.

Или таблица решений, управляемая данными.

Если вы хотите решение класса, подумайте о полиморфизме. Замените все эти случаи if/then/else такими классами, как Strategy или Visitor.

Ключ - это стабильные интерфейсы. Если вы можете сохранить эту стабильную структуру и изменить ее реализацию, вы ее получите.

+0

Мне нравится полиморфизм, но он увеличивает вертикальную зависимость, поэтому, если я хочу изменить сигнатуру метода базового класса. Все классы наследования должны измениться. – Bob

+0

Я думаю, если мы сможем уменьшить вертикальную зависимость ... – Bob

+0

+1 для упоминания Drools – mgv

0

Использование n-мерного массива и поиск/запрос/изменение ваших решений таким образом.

+0

Это умный способ избежать оператора switch, но с точки зрения дизайна, я считаю, что мы все еще используем один и тот же оператор switch, просто умнее. , и нам нужно жестко закодировать действие в индекс. Ты так думаешь... – Bob

0

Как предложил ziplin, я бы рассмотрел 3D-массив, если есть решение для каждой комбинации (т. Е. Не «редкое» распределение решений - я думаю, что это правильный термин). Это потребует, чтобы вы могли инкапсулировать логику решения в выражении, которое может быть сохранено в массиве. С редким распределением список смежности можно использовать аналогичным образом.

Смежные вопросы