Как организовать сложную бизнес-логику?

Привет, друзья! Пишу программу и застрял вроде бы на простых вещах: есть форма где размещается четыре контрола, первые три это - выпадающий список (combobox), а последний это текстовое поле (textbox). Что необходимо: при выборе значения в первом combobox - во втором отображается список связный с первым значением, соответственно когда во втором combobox меняется значение, то в третьем combobox отображается список связный со вторым значением. Т.е. получается такая древовидная структура, но проблем в ее отображении нет. Проблема в том, что при выборе разных значений, должны произовиться разные действия.

Например:

Если первый combobox имеет "Значение_1", а второй combobox имеет "Значение_5", то третий combobox должен быть блокирован с выбором значения "Значение_7" и в textbox записано значение рассчитанное по алгоритму "Алгоритм_23", которое не может быть изменено вручную.

Т.е. получается что при выборе разных значений, должен не только меняться UI, но и также правила расчета алгоритма. Алгоритмы здесь не однотипные, которые можно абстагировать паттерном СТРАТЕГИЯ, а каждый имеет свои зависисмости(репозитории и т.д.).

UI реализован так: View работает с Presenter'ом, и например, при выборе значения из списка - вызывает его метод. В методе получается очень много if'ов, которые проверяют выбраны ли значения, если да, то какие. Комбинаций всех значений и действий связных с ними очень много. Действи касаются не только изменений отображаемой информации в UI, но и расчеты в бизнес-области. Так как работа метода зависит от состояния, я пытался применить паттерн состояние - как-то не очень понравилось, много действий повторяются и приходится придумывать имена каждому состоянию, например какое имя дать этому состоянию, когда выбраны значения: "Значение_1", "Значение_5" и "Значение_7"...

Видел программы, где на форме около 20 контролов, и все между собой "переплетены"... Думаю что должен быть какой-то общий подход к организации такой логики...
  • Вопрос задан
  • 579 просмотров
Пригласить эксперта
Ответы на вопрос 4
Таблица возможных значений.

Таблица значений ComboBox_1. Всегда доступно все.
---------------------------------------------
ComboBox_1
CB1_Item_01
CB1_Item_02
CB1_Item_03
...
---------------------------------------------

Таблица значений ComboBox_2. Доступно то что со знаком "+", зависит от выбранного CB1_Item_хх.
---------------------------------------------
         -           CB2_Item_01  CB2_Item_02  CB2_Item_03
CB1_Item_01          +                     +                    +
CB1_Item_02          -                      +                    +
CB1_Item_03          -                      +                    +
...

Таблица значений ComboBox_3
---------------------------------------------
         -                      -          CB3_Item_01  CB3_Item_02  CB3_Item_03
CB1_Item_01   CB2_Item_01          +                     +                    +
CB1_Item_01   CB2_Item_02          -                      +                    +
CB1_Item_01   CB2_Item_03          -                      +                    +
...
CB1_Item_02   CB2_Item_02           -                      +                    +
CB1_Item_02   CB2_Item_03           -                      +                    +


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

Другими словами работа с множествами.
1-ое доступно целиком.
2-ое умножается на первое, и решение указано на пересечении.
3-е умножается на первое и второе множества, решение указано на пересечении.
Ответ написан
Ptolemy_master
@Ptolemy_master
Постарайтесь уйти от императивной логики к декларативной.
Скажем набор правил - это массив некоторых объектов, в полях которых вы задаете какие-то формулы и ссылки на другие объекты, данные которых надо использовать. И отдельно существует некая логика, которая читает эти объекты, читает элементы интерфейса и в соответствии с ними делает ветвления и вычисления. Достаточно один раз задать общие правила на чтение объекта и формирование действий и потом вам придется только задавать свои правил в массиве.
Ответ написан
Nipheris
@Nipheris Куратор тега C#
Такой подход называется реактивное программирование. и реализован в библиотеках Rx.NET и ReactiveUI. Бизнес-логику он вам проще не сделает, но организовать зависимости между тем какие значения как вычисляются - поможет (благодаря декларативному подходу к описанию зависимостей).
Ответ написан
Комментировать
В методе получается очень много if'ов, которые проверяют выбраны ли значения, если да, то какие.

switch(combobox1)
{
case "1":
enable_someOne_in_combobox2();
break;
case "2":
enable_someTwo_in_combobox2();
break;
}
switch(combobox2)
{
case "1":
enable_someOne_in_combobox3();
break;
case "2":
enable_someTwo_in_combobox3();
break;
}
switch(combobox3)
{
case "1":
doAction1();
break;
case "2":
doAction2();
break;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы