Какой правильный шаблон проектирования для сложной системы принятия решений - PullRequest
4 голосов
/ 12 ноября 2010

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

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

Проблема проекта может быть упрощена как:

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

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

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 12 ноября 2010

Может быть, вам нужен механизм правил Rete. Попробуй слюни.

Или таблица решений на основе данных.

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

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

0 голосов
/ 12 ноября 2010

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

0 голосов
/ 12 ноября 2010

Используйте n-мерный массив и ищите / запрашивайте / изменяйте свои решения таким образом.

...