Tabela decyzyjna

Tabele decyzyjne to typ reguł biznesowych, które można modyfikować i zarządzać nimi. Tabele decyzyjne są zwykle używane, gdy istnieje spójna liczba warunków, które muszą być wartościowane, oraz konkretny zestaw działań, które należy wykonać, gdy warunki zostaną spełnione.

Tabele decyzyjne są podobne do drzew decyzyjnych, jednak są zrównoważone. Tabele decyzyjne zawsze mają tę samą liczbę warunków do wartościowania i działań, które mają zostać wykonane, bez względu na to, jaki zestaw gałęzi będzie miał wartość true. W drzewie decyzyjnym jedna gałąź może zawierać wiele warunków, które po wartościowaniu prowadzą do innej gałęzi.

Tabele decyzyjne są ustrukturyzowane jako drzewo węzłów i zdefiniowane jako klasa TreeBlock. Na klasę TreeBlock składają się różne węzły TreeNodes. Węzły TreeNodes mogą być węzłami warunków lub węzłami działań. Węzły warunków są gałęziami wartościującymi. Na końcach gałęzi znajdują się węzły działań zawierające odpowiednie działania drzewa, które zostaną wykonane, jeśli wszystkie warunki będą miały wartość true. Może być wiele poziomów węzłów warunków, ale tylko jeden poziom węzłów działań.

Ilustracja przedstawiająca tabelę decyzyjną

Dla tabel decyzyjnych można określić reguły inicjowania, które będą wywoływane przed rozpoczęciem sprawdzania warunków w tabeli.

Klasa DecisionTable udostępnia metody do obsługi następujących działań:

Rysunek 1. Diagram klasy DecisionTable i klas powiązanych
Class diagram of DecisionTable and related classes

Klasa TreeBlock tabeli decyzyjnej zawiera różne węzły warunków i działań. Każdy węzeł warunku (ConditionNode) zawiera definicję terminu (TreeConditionTermDefinition) i od jednego do n wariantów instrukcji case (CaseEdge). Definicja terminu zawiera lewy operand wyrażenia warunku. Warianty instrukcji case zawierają definicje wartości; są to różne prawe operandy, których można używać w wyrażeniu warunku. Na przykład w wyrażeniu (status == "złoty") „status” jest definicją terminu, a „złoty” jest definicją wartości w wariancie instrukcji case. Wszystkie warianty instrukcji case w węźle warunku współużytkują definicję terminu, różnią się jedynie wartościami (TreeConditionValueDefinition). W przykładzie inny wariant instrukcji case może mieć wartość „srebrny”. Ta wartość również może być używana w wyrażeniu (status == "srebrny"). Jedynym wyjątkiem od tego zachowania jest klauzula otherwise (w przeciwnym razie), która jest definiowana dla węzła warunku. Jeśli istnieje klauzula otherwise, nie ma definicji wartości, która zostanie użyta, gdy wszystkie pozostałe warianty instrukcji case będą miały wartość false. Jeśli klauzula otherwise nie jest wariantem instrukcji case, zawiera węzeł TreeNode, który można pobrać.

Węzeł warunku zawierający definicję terminu i warianty instrukcji case z definicjami wartości.

W przypadku definicji terminu w aplikacjach klienckich można pobierać i stosować prezentację użytkownika. Prezentacja definicji terminu jest zwykle jedyną reprezentacją lewego operandu (w naszym przykładzie jest to status) i nie zawiera żadnych obiektów zastępczych. Dla wariantu instrukcji case do zdefiniowania wartości (TreeConditionValueTemplate) można użyć szablonu. Instancja definicji szablonu wartości (TemplateInstanceExpression) zawiera wartości parametrów używane podczas wykonywania; można je modyfikować. Jeśli zostanie podjęta próba pobrania definicji szablonu wartości (dla klasy TreeConditionValueDefinition), która nie została zdefiniowana za pomocą szablonu, zostanie zwrócona wartość null. Nawet jeśli szablon nie został użyty do zdefiniowania warunku wartości, w aplikacjach klienckich można pobrać i wykorzystać prezentację użytkownika, jeśli została podana podczas tworzenia treści.

Klasa TreeBlock udostępnia metody do obsługi następujących działań:
Węzeł główny drzewa jest typu TreeNode; z tego miejsca można rozpocząć nawigowanie po tabeli decyzyjnej. Klasa TreeNode udostępnia metody do obsługi następujących działań:
Klasa ConditionNode udostępnia metody do obsługi następujących działań:
Klasa CaseEdge udostępnia metody do obsługi następujących działań:
Klasa TreeConditionTermDefinition udostępnia metody do obsługi następujących działań:
Klasa TreeConditionDefinition udostępnia metody do obsługi następujących działań:
Klasa TreeConditionValueDefinition udostępnia metody do obsługi następujących działań:
Klasa Template udostępnia metody do obsługi następujących działań:
Klasa TreeConditionValueTemplate udostępnia metody do obsługi następujących działań:
Klasa TemplateInstanceExpression udostępnia metody do obsługi następujących działań:
Rysunek 2. Diagram klasy TreeNode i klas powiązanych
Class diagram for TreeNode and related classes

Jeśli do węzła warunku jest dodawany nowy wariant instrukcji case, do definiowania wartości musi zostać użyty szablon. Jeśli na przykład do sprawdzania warunku „status” został dodany wariant instrukcji case „brązowy”, do utworzenia nowego wyrażenia TemplateInstanceExpression ustawiającego wartość parametru na „brązowy” powinien zostać użyty odpowiedni szablon (TreeConditionValueTemplate).

Podczas dodawania nowego wariantu instrukcji case automatycznie dodawany jest również podrzędny węzeł warunku. Będzie on zawierać warianty instrukcji case oparte na definicjach wariantów instrukcji case dla węzłów warunków na tym samym poziomie. Jeśli w wariantach instrukcji case są używane szablony lub wartości zakodowane na stałe, one także będą używane w wariantach instrukcji case podrzędnego węzła warunku. Podrzędny węzeł warunku dodawany automatycznie również będzie zawierał podrzędne węzły warunków utworzone automatycznie. Te podrzędne węzły warunków także będą zawierały podrzędne węzły warunków i tak dalej — aż do ponownego utworzenia wszystkich poziomów węzłów warunków.

Oprócz węzłów warunków tabela decyzyjna, a dokładniej blok drzewa, zawiera również poziom węzłów działań (ActionNode). Węzły działań są węzłami-liśćmi, stanowią zakończenia gałęzi warunków i wariantów instrukcji case. Aby można było dotrzeć do węzła działania, wszystkie wartości warunków na linii wariantów instrukcji case muszą przyjąć wartość true. Węzeł działania zawiera co najmniej jedno działanie (TreeAction). Dla działania są zdefiniowane termin i wartość. Podobnie jak w węzłach warunków, definicja terminu (TreeActionTermDefinition) znajduje się po lewej stronie wyrażenia, a definicja wartości (TemplateInstanceExpression) jest po prawej stronie wyrażenia. Na przykład w różnych węzłach warunków sprawdzanych pod kątem statusu mogą się znajdować działania definiujące upust. Dla warunku (status == "złoty") działanie może być następujące: (kwotaUpustu = 0,90). W tym działaniu „kwotaUpustu” jest definicją terminu, a „= 0,90” jest definicją wartości.

Definicja terminu działania drzewa jest współużytkowana z innymi działaniami drzewa, w innych węzłach działań. Ponieważ każda gałąź w wariantach instrukcji case kończy się działaniem, używane są te same definicje terminów. Definicje wartości mogą być różne dla różnych działań drzewa i węzłów działań. Na przykład kwotaUpustu dla statusu „złoty” może wynosić „0,90”, natomiast dla statusu „srebrny” może być równa „0,95”.

Węzły działań mogą zawierać wiele działań drzewa z odrębnymi definicjami terminu i definicjami wartości. Jeśli na przykład upust został określony dla wynajmowanego samochodu, oprócz kwoty upustu można przypisać konkretny poziom samochodu. Inne działanie drzewa można utworzyć, aby ustawić termin „rozmiarAuta” na wartość „maksymalna”, jeśli status jest równy „złoty”, oraz ustawić właściwość „kwotaUpustu” na wartość „0,90”.

Definicję wartości w działaniu drzewa można utworzyć z szablonu (TreeActionValueTemplate). Definicja szablonu zawiera wyrażenie (TemplateInstanceExpression) i jego parametry.

Oprócz zmiany parametrów można modyfikować całą definicję wartości, zastępując ją nową instancją definicji wartości utworzoną przy użyciu innego szablonu zdefiniowanego dla działania drzewa.

Jeśli definicja wartości nie została utworzona za pomocą szablonu, nie można jej zmieniać. W przypadku aplikacji klienckich można użyć prezentacji użytkownika, jeśli została podana podczas tworzenia treści.

W przypadku definicji terminów w działaniach drzewa, jeśli prezentacja użytkownika została podana, może być używana w aplikacjach klienckich.

Podczas dodawania do węzła warunku nowego wariantu instrukcji case i tworzenia nowych, innych, węzłów warunków tworzone są również węzły działań. Inaczej niż węzły warunków i warianty instrukcji case tworzone na podstawie definicji wariantów instrukcji case wcześniej zdefiniowanych dla tego poziomu, węzły działań nie dziedziczą automatycznie istniejącego wzorca. W węźle działania są tworzone jedynie puste obiekty zastępcze TreeActions. Należy użyć szablonu (TreeActionValueTemplate), aby zakończyć definicję działania, tworząc wyrażenie TemplateInstanceExpression dla przynajmniej jednej definicji terminu w węźle działania. Jeśli działanie drzewa zostanie ustawione przy użyciu wyrażenia TemplateInstanceExpression, wartości prezentacji użytkownika i instancji szablonu będą równe null.

Podczas tworzenia nowego warunku wymagającego nowych węzłów działań, węzły te są dodawane do najbliższego bezpośredniego węzła warunku na prawo od istniejących działań. Jeśli na przykład do tabeli decyzyjnej zostanie dodany status „rubinowy” z konkretnym upustem, warunek sprawdzania statusu zostanie dodany na prawo od wartości „złoty”, „srebrny” i „brązowy”. Węzeł działania dla upustu dla wartości „rubinowy” zostanie dodany na prawo od węzłów działań odpowiadających wariantom instrukcji case „złoty”, „srebrny” i „brązowy”.

Podczas ustawiania nowych działań drzewa dla węzłów działań algorytm, który wyszukuje pierwszy węzeł działania od prawej strony, w najniższym wariancie instrukcji case, zwraca węzeł działania z pustym działaniem drzewa. Można również sprawdzić, czy w działaniu drzewa wartości prezentacji użytkownika i instancji szablonu są równe null. Bezpośrednio po uzyskaniu działania drzewa można ustawić poprawną instancję klasy TreeActionValueTemplate.

Ilustracja węzłów działania z działaniami drzewa
Klasa ActionNode udostępnia metody do obsługi następujących działań:
Klasa TreeAction udostępnia metody do obsługi następujących działań:
Klasa TreeActionTermDefinition udostępnia metody do obsługi następujących działań:
Klasa Template udostępnia metody do obsługi następujących działań:
Klasa TreeActionValueTemplate udostępnia metody do obsługi następujących działań:
Klasa TemplateInstanceExpression udostępnia metody do obsługi następujących działań:
Rysunek 3. Diagram klasy TreeAction i klas powiązanych
Class diagram of TreeAction and related classes

Definicja reguły inicjowania w tabeli decyzyjnej ma taką samą strukturę, jak reguła w zestawie reguł. Regułę inicjowania można zdefiniować za pomocą szablonu (DecisionTableRuleTemplate).

Jeśli reguła inicjowania nie została utworzona podczas tworzenia treści, nie można jej dodać po wdrożeniu reguły.

Klasa Rule udostępnia metody do obsługi następujących działań:
Klasa DecisionTableRule udostępnia metody do obsługi następujących działań:
Klasa DecisionTableRuleTemplate udostępnia metody do obsługi następujących działań:
Rysunek 4. Diagram klasy DecisionTableRule i klas powiązanych
Class diagram of DecisionTableRule and related classes