Warstwa biznesowa – moduł tabeli (table module pattern)

Moduł tabeli (TM – table module) jest również wzorcem proceduralnym (podobnie jak TS). Rozwiązuje jednak podstawowy problem TS – brak zdefiniowania metody podziału logiki biznesowej na klasy. W przypadku TS sam wzorzec nie określał ile klas należy stworzyć. Wszystko zależało od programisty. Mógł on stworzyć jedną klasę zarządzającą zarówno zamówieniami jak i produktami. Moduł tabeli mówi po prostu, że należy stworzyć osobną klasę dla każdej tabeli w bazie danych. Czyli w przypadku gdy mamy tabele “Orders, Products, Invoices” będziemy potrzebować trzech klas TM. Warto jeszcze raz podkreślić, że wzorce proceduralne zarządzają całymi tabelami a nie pojedynczymi wierszami. Innymi słowy klasy TS lub TM dla zamówienia powinny być w następującej postaci:

public class OrderManager
{
    public void AddOrder(DataRow order)
    {
        // dodaj nowy wiersz do tabeli
    }
    public void RemoveOrder(Guid id)
    {
        // usuń wiersz o podanym ID
    }
    public DataRow GetOrderById(Guid id)
    {
        // znadź dany wiersz
    }    
}

a nie:

public class Order
{
    public DateTime OrderDateTime {get;set}
    public OrderItems[] OrderItems {get;set;}
    public Client Client {get;set;}
}

Pierwsza klasa jak widać zarządza całymi wierszami. Z kolei druga zawiera konkretne informacje dla pojedynczego wiersza.

Diagram klas wygląda bardzo podobnie jak diagram TS:

image

Na zakończenie standardowo przedstawiam zalety i wady, które uważam za istotne:

Zalety:

  1. Prosta implementacja,
  2. Zapobiega duplikacji logiki biznesowej poprzez jawny podział klas,
  3. Podobnie jak w przypadku TS, środowiska programistyczne ułatwiają jego implementacje (np. poprzez klasy DataRow, bezpołączeniowy model dostępu do danych).

Wady:

  1. Wzorzec zorientowany na dane – klasa tworzona na każdą tabele w bazie danych. Może to spowodować zbyt wielkie rozdrobnienie klas,
  2. Ze względu na zbyt duże rozdrobnienie, wzorzec nie nadaje się bezpośrednio do wyeksponowania przez np. usługę sieciową. W przypadku TS często występuje tylko jedna klasa, która może bezpośrednio być wyeksponowana ponieważ stanowi ona tak naprawdę implementację wzorca “remote facade”,
  3. Wzorzec moim zdaniem jest dość niewygodny w użyciu w przypadku zaawansowanych środowisk programistycznych, wspierających narzędzia typu ORM. Dzisiaj dla średnich projektów znacznie łatwiej użyć wzorca aktywny rekord (opiszę go w następnym poście).

Leave a Reply

Your email address will not be published.