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:
Na zakończenie standardowo przedstawiam zalety i wady, które uważam za istotne:
Zalety:
- Prosta implementacja,
- Zapobiega duplikacji logiki biznesowej poprzez jawny podział klas,
- Podobnie jak w przypadku TS, środowiska programistyczne ułatwiają jego implementacje (np. poprzez klasy DataRow, bezpołączeniowy model dostępu do danych).
Wady:
- Wzorzec zorientowany na dane – klasa tworzona na każdą tabele w bazie danych. Może to spowodować zbyt wielkie rozdrobnienie klas,
- 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”,
- 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).