Académique Documents
Professionnel Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Architektura systemw
zarzdzania przedsibiorstwem.
Wzorce projektowe
Autor: Martin Fowler
Tumaczenie: Pawe Koronkiewicz (wstp, rozdz. 1 12),
Piotr Rajca (rozdz. 13 18, dod. A)
ISBN: 83-7361-715-9
Tytu oryginau: Patterns of Enterprise Application Architecture
Format: B5, stron: 496
Spis treci
Przedmowa.............................................................................................................13
Wstp .....................................................................................................................19
Architektura .....................................................................................................................................................19
Aplikacje korporacyjne ....................................................................................................................................20
Rodzaje aplikacji dla przedsibiorstw..............................................................................................................22
Wydajno .......................................................................................................................................................23
Wzorce .............................................................................................................................................................25
Struktura opisu wzorcw ...........................................................................................................................27
Ograniczenia wzorcw projektowych........................................................................................................28
Cz I Wprowadzenie
29
1.
Warstwy aplikacji ..................................................................................................31
Podzia warstwowy w aplikacjach dla przedsibiorstw....................................................................................32
Trzy gwne warstwy.......................................................................................................................................33
Ukad warstw ...................................................................................................................................................35
2.
Porzdkowanie logiki dziedziny ............................................................................37
Wybr wzorca..................................................................................................................................................40
Warstwa usug..................................................................................................................................................42
3.
Mapowanie do relacyjnych baz danych.................................................................43
Wzorce architektury.........................................................................................................................................43
Problem zachowa ...........................................................................................................................................47
Odczyt danych .................................................................................................................................................48
SPIS TRECI
4.
Prezentacja w sieci WWW ....................................................................................59
Wzorce widoku ................................................................................................................................................62
Wzorce kontrolera danych wejciowych..........................................................................................................64
Warto przeczyta .............................................................................................................................................64
5.
Przetwarzanie wspbiene....................................................................................65
Problemy przetwarzania wspbienego ..........................................................................................................66
Konteksty przetwarzania..................................................................................................................................67
Izolacja i niezmienno....................................................................................................................................68
Optymistyczne i pesymistyczne sterowanie wspbienoci..........................................................................68
Zapobieganie niespjnym odczytom..........................................................................................................69
Zakleszczenia.............................................................................................................................................70
Transakcje........................................................................................................................................................71
ACID .........................................................................................................................................................72
Zasoby transakcyjne ..................................................................................................................................72
Zwikszanie ywotnoci przez ograniczanie izolacji.................................................................................73
Transakcje biznesowe i systemowe ...........................................................................................................74
Wzorce sterowania wspbienoci w trybie offline ......................................................................................76
Serwery aplikacji .............................................................................................................................................77
Warto przeczyta .............................................................................................................................................78
6.
Stan sesji ................................................................................................................79
Zalety sesji bezstanowej...................................................................................................................................79
Stan sesji ..........................................................................................................................................................80
Metody przechowywania danych stanu sesji .............................................................................................81
7.
Obiekty rozproszone ..............................................................................................85
Zwodnicze obiekty rozproszone ......................................................................................................................85
Interfejsy lokalne i interfejsy zdalne ................................................................................................................86
Kiedy stosowa architektur rozproszon........................................................................................................87
Granice dystrybucji ..........................................................................................................................................88
Interfejsy dystrybucji .......................................................................................................................................89
SPIS TRECI
8.
Podsumowanie .......................................................................................................91
Warstwa dziedziny, czyli pocztek ..................................................................................................................92
Warstwa rda danych, czyli krok drugi.........................................................................................................93
rdo danych dla schematu Transaction Script (110) ..............................................................................93
rdo danych dla schematu Table Module (125) .....................................................................................93
rdo danych dla schematu Domain Model (116)....................................................................................94
Warstwa prezentacji.........................................................................................................................................94
Wzorce a technologia.......................................................................................................................................95
Java i J2EE.................................................................................................................................................95
.NET ..........................................................................................................................................................96
Procedury przechowywane ........................................................................................................................97
Usugi WWW ............................................................................................................................................97
Inne systemy warstw aplikacji .........................................................................................................................98
Cz II Wzorce
101
9.
Wzorce logiki dziedziny ......................................................................................103
Transaction Script (Skrypt transakcji)............................................................................................................103
Na czym polega .......................................................................................................................................103
Kiedy uywamy .......................................................................................................................................105
Problem obliczania przychodu.................................................................................................................105
Domain Model (Model dziedziny).................................................................................................................109
Na czym polega .......................................................................................................................................109
Kiedy uywamy .......................................................................................................................................111
Warto przeczyta .....................................................................................................................................112
Przykad: uznanie przychodu (Java) ........................................................................................................112
Table Module (Modu tabeli) .........................................................................................................................117
Na czym polega .......................................................................................................................................118
Kiedy uywamy .......................................................................................................................................120
Przykad: uznanie przychodu (C#)...........................................................................................................120
Service Layer (Warstwa usug) ......................................................................................................................124
Na czym polega .......................................................................................................................................125
Kiedy uywamy .......................................................................................................................................127
Warto przeczyta .....................................................................................................................................127
Przykad: uznanie przychodu (Java) ........................................................................................................127
10.
Wzorce architektury rda danych .....................................................................133
Table Data Gateway (Brama danych tabeli) ..................................................................................................133
Na czym polega........................................................................................................................................133
Kiedy uywamy .......................................................................................................................................134
Warto przeczyta .....................................................................................................................................135
Przykad: brama tabeli osb (C#) ............................................................................................................135
Przykad: brama oparta na zbiorach danych ADO.NET (C#) ..................................................................137
SPIS TRECI
11.
Wzorce zachowa dla mapowania obiektowo-relacyjnego.................................169
Unit of Work (Jednostka pracy) .....................................................................................................................169
Na czym polega .......................................................................................................................................170
Kiedy uywamy .......................................................................................................................................173
Przykad: rejestracja przez obiekt (Java)..................................................................................................174
Identity Map (Mapa tosamoci)....................................................................................................................178
Na czym polega .......................................................................................................................................178
Kiedy uywamy .......................................................................................................................................180
Przykad: metody mapy tosamoci (Java) ..............................................................................................181
Lazy Load (Opnione adowanie) ................................................................................................................182
Na czym polega .......................................................................................................................................182
Kiedy uywamy .......................................................................................................................................184
Przykad: opniona inicjalizacja (Java)..................................................................................................185
Przykad: wirtualny porednik (Java).......................................................................................................185
Przykad: uchwyt wartoci (Java) ............................................................................................................187
Przykad: widmo (C#)..............................................................................................................................188
12.
Wzorce struktury dla mapowania obiektowo-relacyjnego ..................................197
Identity Field (Pole tosamoci).....................................................................................................................197
Na czym polega .......................................................................................................................................197
Kiedy uywamy .......................................................................................................................................201
Warto przeczyta .....................................................................................................................................201
Przykad: liczba cakowita jako klucz (C#)..............................................................................................201
Przykad: tabela kluczy (Java) .................................................................................................................203
Przykad: klucz zoony (Java) ................................................................................................................205
Foreign Key Mapping (Odwzorowanie do klucza obcego)............................................................................216
Na czym polega .......................................................................................................................................216
Kiedy uywamy .......................................................................................................................................218
Przykad: odwoanie jednowartociowe (Java) ........................................................................................219
Przykad: wyszukiwanie w wielu tabelach (Java) ....................................................................................222
Przykad: kolekcja odwoa (C#).............................................................................................................223
SPIS TRECI
13.
Wzorce odwzorowa obiektw i relacyjnych metadanych .................................277
Metadata Mapping (Odwzorowanie metadanych) .........................................................................................277
Na czym polega .......................................................................................................................................277
Kiedy uywamy .......................................................................................................................................279
Przykad: uycie metadanych i odzwierciedlania (Java)..........................................................................280
Query Object (Obiekt zapytania) ...................................................................................................................287
Na czym polega .......................................................................................................................................287
Kiedy uywamy .......................................................................................................................................288
Warto przeczyta .....................................................................................................................................289
Przykad: prosty wzorzec Obiekt zapytania (Java) ..................................................................................289
Repository (Magazyn)....................................................................................................................................293
Na czym polega .......................................................................................................................................294
Kiedy uywamy .......................................................................................................................................295
Warto przeczyta .....................................................................................................................................296
Przykad: odnajdywanie osb utrzymywanych przez podan osob (Java) .............................................296
Przykad: zamiana strategii wzorca Repository (Java).............................................................................297
10
SPIS TRECI
14.
Wzorce prezentacji internetowych.......................................................................299
Model View Controller (Model kontrolera widoku) ......................................................................................299
Na czym polega .......................................................................................................................................299
Kiedy uywamy .......................................................................................................................................301
Page Controller (Kontroler strony) ................................................................................................................302
Na czym polega .......................................................................................................................................302
Kiedy uywamy .......................................................................................................................................303
Przykad: prosta prezentacja z serwletem penicym funkcj kontrolera
oraz stron JSP penic rol widoku (Java) ........................................................................................304
Przykad: zastosowanie strony JSP do obsugi dania (Java).................................................................306
Przykad: mechanizm obsugi stron wykorzystujcy kod schowany (C#) ............................................309
Front Controller (Kontroler fasady) ...............................................................................................................313
Na czym polega .......................................................................................................................................313
Kiedy uywamy .......................................................................................................................................315
Warto przeczyta .....................................................................................................................................315
Przykad: prosta prezentacja (Java)..........................................................................................................315
Template View (Szablon widoku)..................................................................................................................318
Na czym polega .......................................................................................................................................318
Kiedy uywamy .......................................................................................................................................322
Przykad: wykorzystanie JSP jako widoku wraz z osobnym kontrolerem (Java) .....................................322
Przykad: strona ASP.NET (C#) ..............................................................................................................325
Transform View (Widok przeksztacajcy)....................................................................................................328
Na czym polega .......................................................................................................................................328
Kiedy uywamy .......................................................................................................................................329
Przykad: proste przeksztacenie (Java) ...................................................................................................330
Two Step View (Widok dwuetapowy)...........................................................................................................332
Na czym polega .......................................................................................................................................332
Kiedy uywamy .......................................................................................................................................333
Przykad: dwuetapowe przeksztacenie XSLT (XSLT) ...........................................................................338
Przykad: JSP i znaczniki niestandardowe (Java) ....................................................................................340
Application Controller (Kontroler aplikacji)..................................................................................................345
Na czym polega .......................................................................................................................................345
Kiedy uywamy .......................................................................................................................................347
Warto przeczyta .....................................................................................................................................347
Przykad: kontroler aplikacji obsugujcy model stanu (Java) .................................................................347
15.
Wzorce dystrybucji ..............................................................................................353
Remote Facade (Zdalna fasada) .....................................................................................................................353
Na czym polega .......................................................................................................................................354
Kiedy uywamy .......................................................................................................................................357
Przykad: zastosowanie komponentu session bean i zdalnej fasady (Java)..............................................357
Przykad: usuga WWW (C#) ..................................................................................................................360
Data Transfer Object (Obiekt transferu danych) ............................................................................................366
Na czym polega .......................................................................................................................................366
Kiedy uywamy .......................................................................................................................................370
Warto przeczyta .....................................................................................................................................371
Przykad: przekazywanie informacji o albumach (Java)..........................................................................371
Przykad: serializacja danych do postaci XML (Java) .............................................................................375
SPIS TRECI
11
16.
Wzorce wspbienoci autonomicznej...............................................................379
Optimistic Offline Lock (Optymistyczna blokada autonomiczna) .................................................................379
Na czym polega .......................................................................................................................................380
Kiedy uywamy .......................................................................................................................................383
Przykad: warstwa dziedziny i wzorzec Data Mappers (165) (Java).............................................................384
Pessimistic Offline Lock (Pesymistyczna blokada autonomiczna) ................................................................389
Na czym polega .......................................................................................................................................390
Kiedy uywamy .......................................................................................................................................393
Przykad: prosty meneder blokad (Java) ................................................................................................394
Coarse-Grained Lock (Blokada gruboziarnista).............................................................................................400
Na czym polega .......................................................................................................................................400
Kiedy uywamy .......................................................................................................................................402
Przykad: wsplna blokada Optimistic Offline Lock (416) (Java)...........................................................403
Przykad: wsplna blokada Pessimistic Offline Lock (426) (Java)..........................................................408
Przykad: blokowanie korzenia przy uyciu blokady Pessimistic Offline Lock (416) (Java) ...................409
Implicit Lock (Blokada domylna) ................................................................................................................410
Na czym polega .......................................................................................................................................411
Kiedy uywamy .......................................................................................................................................412
Przykad: niejawna blokada Pessimistic Offline Lock (426) (Java).........................................................412
17.
Wzorce stanu sesji................................................................................................415
Client Session State (Stan sesji klienta) .........................................................................................................415
Na czym polega .......................................................................................................................................415
Kiedy uywamy .......................................................................................................................................416
Server Session State (Stan sesji serwera) .......................................................................................................418
Na czym polega .......................................................................................................................................418
Kiedy uywamy .......................................................................................................................................420
Database Session State (Stan sesji bazy danych) ...........................................................................................421
Na czym polega .......................................................................................................................................421
Kiedy uywamy .......................................................................................................................................423
18.
Wzorce podstawowe ............................................................................................425
Gateway (Brama) ...........................................................................................................................................425
Na czym polega .......................................................................................................................................426
Kiedy uywamy .......................................................................................................................................426
Przykad: brama poredniczca w korzystaniu z usugi rozsyania komunikatw (Java).........................427
Mapper (Odwzorowanie) ...............................................................................................................................432
Na czym polega .......................................................................................................................................432
Kiedy uywamy........................................................................................................................................433
Layer Supertype (Typ bazowy warstwy) .......................................................................................................434
Na czym polega .......................................................................................................................................434
Kiedy uywamy .......................................................................................................................................434
Przykad: obiekt domeny (Java)...............................................................................................................434
Separated Interface (Interfejs oddzielony) .....................................................................................................435
Na czym polega .......................................................................................................................................435
Kiedy uywamy .......................................................................................................................................437
12
SPIS TRECI
Dodatki
469
Bibliografia ..........................................................................................................471
Skorowidz ............................................................................................................477
Prac wikszoci aplikacji biznesowych mona rozpatrywa jako przetwarzanie sekwencji transakcji. Transakcja moe polega na przegldaniu danych w pewien okrelony sposb lub wprowadzaniu w nich zmian. Kada interakcja midzy systemem klienckim a systemem serwera obejmuje
pewn cz logiki aplikacji. W pewnych przypadkach interakcja moe by tak prosta jak wywietlanie przechowywanych w bazie danych. W innym moe wymaga wielu operacji sprawdzania poprawnoci i oblicze.
Wzorzec Transaction Script porzdkuje logik takiej interakcji jako, oglnie rzecz biorc,
pojedyncz procedur, ktra wywouje baz danych bezporednio lub za porednictwem prostego
kodu osaniajcego. Kada transakcja ma wasny skrypt. Dodatkow optymalizacj moe by czenie wsplnych fragmentw kodu w podprocedury.
Na czym polega
Gdy stosujemy wzorzec Transaction Script, logika domeny porzdkowana jest zasadniczo wedug
wykonywanych w systemie transakcji. Gdy celem transakcji jest wprowadzenie rezerwacji pokoju
hotelowego, kod pojedynczej procedury Zarezerwuj Pokj obejmuje sprawdzenie dostpnoci pokoi, okrelenie wysokoci opaty i zaktualizowanie bazy danych.
104
W prostych przypadkach sposb porzdkowania skryptw transakcji jest naturalny. Oczywicie, podobnie jak w kadym programie, powinnimy wprowadzi przejrzyst struktur moduw.
O ile transakcja nie jest szczeglnie skomplikowana, jest to bardzo proste. Jedn z zalet skryptw
transakcji jest to, e nie ma dla nich znaczenia, jakie operacje wykonuj inne transakcje. Zadaniem
implementowanego kodu jest przyjcie danych wejciowych, odczytanie danych z bazy, przeksztacenie ich, a nastpnie zapisanie wynikw w bazie.
O tym, gdzie umiecimy skrypt transakcji, decyduje przyjty system warstw aplikacji. Lokalizacj tak moe by strona serwera, skrypt CGI lub rozproszony obiekt sesji. Dobrze jest rozdziela skrypty tak dalece, jak to moliwe. Absolutnym minimum s osobne procedury. Jeszcze
lepsze s klasy, oddzielone rwnie od kodu prezentacji i rda danych. Dodatkowo, w skryptach
transakcji nie wprowadzamy adnych wywoa logiki prezentacji. Uatwia to ich modyfikowanie
i testowanie.
Skrypty transakcji mona porzdkowa w klasy dwoma sposobami. Najbardziej typowym
podejciem jest czenie w jednej klasie grupy skryptw. Kada klasa odpowiada wtedy pewnemu
zakresowi tematycznemu. Ukad taki jest przejrzysty i sprawdza si w praktyce. Inn moliwoci
jest umieszczanie kadego skryptu w osobnej klasie (patrz rysunek 9.1). Odpowiada to wzorcowi
Command Gang of Four. Definiujemy wtedy rwnie supertyp takich polece, ktry okrela pewn metod uruchamiania skryptw. Pozwala to operowa skryptami jako obiektami. Trzeba przyzna, e potrzeba taka pojawia si stosunkowo rzadko, ze wzgldu na prostot systemw, gdzie
stosuje si wzorzec Transaction Script. Oczywicie, wiele jzykw pozwala zapomnie o klasach
i definiowa funkcje globalne. Nie mona jednak zapomina, e tworzenie egzemplarzy obiektw
pomaga izolowa dane rnych wtkw przetwarzania.
Termin skrypt transakcji jest o tyle uzasadniony, e w wikszoci przypadkw kady z nich
odpowiada pojedynczej transakcji bazy danych. Nie jest to regua obowizujca we wszystkich
przypadkach, ale jest stosunkowo dobrym przyblieniem.
105
Kiedy uywamy
Wielk zalet skryptw transakcji jest ich prostota. Porzdkowanie logiki przy ich uyciu jest bardzo naturalne, gdy caa aplikacja zawiera niewiele kodu. Nie wprowadzamy dodatkowych poziomw zoonoci ani elementw obniajcych wydajno.
Gdy logika biznesowa staje si bardziej skomplikowana, utrzymanie porzdku w skryptach
transakcji staje si coraz bardziej skomplikowane. Podstawowym problemem s powtrzenia kodu. Poniewa kady skrypt ma obsuy dokadnie jedn transakcj, powtrne wprowadzanie takich samych lub podobnych fragmentw jest nieuniknione.
Uwany programista uniknie wikszoci takich problemw, jednak wiksze aplikacje wymagaj zbudowania modelu dziedziny. Wzorzec Domain Model (109) zapewnia znacznie wicej opcji
strukturalizowania kodu, wiksz przejrzysto i ograniczenie problemu powtrze.
Trudno okreli poziom zoonoci, na ktrym skrypty transakcji nie mog by zastosowane.
Bdzie to jeszcze trudniejsze, jeeli przyzwyczailimy si do jednego z wzorcw. Mona oczywicie
przeksztaci skrypty transakcji w model dziedziny, ale nie jest to zmiana prosta, wic dobrze byoby zastanowi si nad waciwym podejciem ju na samym pocztku.
Bez wzgldu na to, jak bardzo lubimy podejcie obiektowe, nie powinnimy skrela wzorca
Transaction Script. Jest wiele prostych problemw i stosowanie dla nich prostych rozwiza pozwala szybciej zakoczy prac.
106
RYSUNEK 9.2. Uproszczony model obliczania przychodu. Kada umowa obejmuje wiele wartoci
przychodu, powizanych z okreleniem, kiedy rne czci przychodu trafiaj do ksig
Pierwszy skrypt oblicza kwot uznania na dany dzie. Mona j wyliczy w dwch krokach: w pierwszym wybieramy wiersze tabeli uzna przychodu, w drugim sumujemy kwoty.
Projekty oparte na wzorcu Transaction Script korzystaj czsto ze skryptw, ktre operuj
bezporednio na bazie danych, wykorzystujc kod SQL. W tym przykadzie korzystamy z prostej
bramy Table Data Gateway (133) jako osony zapyta SQL. Ze wzgldu na prostot przykadu,
uyjemy tylko jednej, wsplnej bramy, nie tworzc osobnych dla kadej tabeli. Definiujemy w jej
obrbie odpowiedni metod wyszukiwania, (!)
.
*+,,,
-
(!)
!
%((
+ ./ 0
$
1-,
(! 2
,!3
2
,4(, 52
1,/
.
2
2
6
(
!(! 1
7
78
7)#%
!78
79:
1;<
!"#=1;72
-2
107
W przypadku tak prostych oblicze, procedura w jzyku Java mogaby rwnie zosta zastpiona
wywoaniem SQL, ktre sumuje wartoci przy uyciu funkcji agregujcej.
Podobny podzia stosujemy przy obliczaniu uzna przychodu dla wybranej umowy. Skrypt
warstwy dziedziny realizuje logik biznesow.
!
,,,
-
!!
<
-
0
0
1-,(
<
-
2
,/2
%
1%,
,!!7
72
%(
!1+%(
,!7 !72
! 1
,!
!7 72
( ,5
7 70
%?@1
,A2
-,
!
<
-
?>@
!2
-,
!
<
-
?3@
!,B>2
-,
!
<
-
?4@
!,C>2
6( ,5
7970
-,
!
<
-
!2
6( ,5
770
%?@1
,A2
-,
!
<
-
?>@
!2
-,
!
<
-
?3@
!,A>2
-,
!
<
-
?4@
!,B>2
6
6 ./ 0
++ / 2
6
6
108
Zwrmy uwag na uycie klasy Money (446) do alokacji. Zapobiega ona gubieniu pojedynczych
groszy (lub centw), o co atwo przy dzieleniu kwot pieninych przez trzy.
Obsuga SQL jest zrealizowana w formie wzorca Table Data Gateway (133). Pierwsza procedura
znajduje umow.
*+,,,
-
(
!
+ ./ 0
$
1-,
(
2
,!3
2
1,/
.
2
2
6
(
!(
1
7 D78
7)#%
78
79:1;<,
1 ,72
Gdy uywamy jzyka Java, usuga obliczania uzna dochodu moe mie posta tradycyjnej klasy
lub obiektu bean sesji.
Czytelnik, ktry nie jest przyzwyczajony do modelowania dziedziny, uzna prawdopodobnie
przedstawion tu implementacj za znacznie prostsz ni przedstawiona w opisie wzorca Domain
Model (109). Niestety, nieco trudniej w zwizy sposb przedstawi (lub wyobrazi sobie), co stanie si, gdy reguy biznesowe bd bardziej skomplikowane. Stosowane w praktyce reguy obliczania uzna przychodu nie s proste, a rnice midzy nimi wyznacza nie tylko produkt, ktrego
dotycz, ale i data operacji (jeeli umowa zostaa podpisana przed 15 kwietnia, obowizuje taka
a taka regua). Gdy poziom zoonoci jest duy, utrzymanie spjnej konstrukcji skryptw transakcji jest bardzo trudne, co doskonale uzasadnia przywizanie mionikw podejcia obiektowego
do stosowania modeli dziedziny.
109
Logika biznesowa moe osign bardzo duy poziom zoonoci. Reguy i logika opisuj wiele
rnych przypadkw i wariantw zachowa, a wanie rozwizanie problemu zoonoci byo
gwn przesank stworzenia koncepcji obiektw. Model dziedziny to sie takich poczonych ze
sob obiektw, gdzie kady obiekt reprezentuje pewien znaczcy element lub czynnik. Elementy
te mog by tak znaczne jak przedsibiorstwo lub tak niewielkie jak pojedynczy wiersz formularza
zamwienia.
Na czym polega
Wprowadzenie w aplikacji wzorca Domain Model (109) wymaga stworzenia do rozbudowanej
koncepcyjnie warstwy obiektw, ktre modeluj rozwizywany problem. Nale do nich obiekty
reprezentujce dane przedsibiorstwa i obiekty odpowiadajce reguom jego pracy. Dane i procesy
najczciej czy si ze sob, aby skupi czynnoci przetwarzania i informacje, ktrymi operuj.
Obiektowy model dziedziny moe przypomina model bazy danych, zawsze jednak dziel je
istotne rnice. Model dziedziny czy dane i procesy, ma wielowartociowe atrybuty, zoon
sie asocjacji i wykorzystuje dziedziczenie.
Mona wyrni dwa rodzaje modeli dziedziny. Prosty model przypomina projekt bazy danych i dominuje w nim ukad jeden obiekt modelu-jedna tabela bazy danych. Rozbudowany
model dziedziny znacznie odbiega od struktury bazy i wykorzystuje dziedziczenie, strategie i inne
wzorce Gang of Four, jak rwnie zoone sieci niewielkich, poczonych ze sob obiektw. Takie
110
podejcie jest lepsze, gdy logika jest bardziej skomplikowana, trudniej jednak wwczas przeprowadzi mapowanie do bazy. W prostym modelu mona korzysta z aktywnych rekordw (Active
Record (147)), rozbudowany wymaga mechanizmu Data Mapper (152).
Poniewa funkcje biznesowe wymagaj zawsze wielu pniejszych zmian, wana jest moliwo atwego modyfikowania, kompilowania i testowania warstwy, w ktrej s implementowane.
Musimy wic dba o to, aby sprze midzy modelem a innymi warstwami systemu byo jak
najmniej. atwo zauway, e podstaw wielu wzorcw ukadu warstwowego jest wanie utrzymanie jak najmniejszej zalenoci midzy warstw dziedziny a innymi.
Rozwizania obsugi modelu dziedziny mog by rne. Najprostszym przypadkiem jest
aplikacja dla jednego uytkownika, gdzie cay graf obiektw zostaje odczytany z pliku i zaadowany do pamici. O ile sprawdza si to w przypadku aplikacji biurowych, nie jest raczej stosowane w wielowarstwowych aplikacjach systemw informacyjnych z tej prostej przyczyny, e obiektw
jest wtedy zbyt wiele. Pami jest zbyt maa, aby takie obcienie byo uzasadnione, a samo adowanie obiektw trwa zbyt dugo. Urok obiektowych baz danych polega wanie na tym, e zapewniaj
iluzj wykonywania takiej operacji, podczas gdy w rzeczywistoci jedynie zarzdzaj przenoszeniem
obiektw pomidzy pamici a dyskiem.
Brak obiektowej bazy danych zmusza do samodzielnego projektowania podobnych rozwiza.
W typowym przypadku w kadej sesji adowany jest graf obiektw, ktrych ta sesja wymaga. Nie
s to jednak nigdy wszystkie obiekty aplikacji i zazwyczaj nie wszystkie stosowane klasy. Przykadowo, gdy przegldany jest zbir umw, z dysku adowane s tylko obiekty odpowiadajce produktom, do ktrych te umowy si odwouj. Gdy przeprowadzane s obliczenia operujce umowami
i uznaniami przychodu, obiekty reprezentujce produkty mog nie by adowane w ogle. O tym,
co zostanie zaadowane do pamici, decyduj obiekty zarzdzajce mapowaniem do bazy danych.
Gdy pojawia si potrzeba utrzymania tego samego grafu obiektw pomidzy kolejnymi wywoaniami serwera, niezbdne jest zachowanie danych stanu. To zagadnienie omawiamy w rozdziale powiconym stanowi sesji (strona 79).
Typowym problemem zwizanym z logik dziedziny jest nadmierne puchnicie obiektw.
W trakcie projektowania ekranu do zarzdzania zamwieniami moemy zauway, e niektre
funkcje zamwie su wycznie do jego obsugi. Przypisanie tych funkcji zamwieniu moe
doprowadzi do niepotrzebnej rozbudowy odpowiedniej klasy. Niepotrzebnej, poniewa wiele
funkcji wykorzystanych zostaje tylko w jednym przypadku uycia. Wielu programistw zwraca
wic pilnie uwag na to, czy pewne funkcje maj charakter oglny (i mog by implementowane
w klasie Zamwienie), czy s specyficzne dla okrelonych operacji. W tym ostatnim przypadku powinny by implementowane w pewnej klasie zwizanej z zastosowaniem obiektu. Moe to oznacza
skrypt transakcji lub warstw prezentacji.
Problem oddzielania zachowa specyficznych dla zastosowa obiektu jest powizany z zagadnieniem duplikacji kodu. Funkcj oddzielon od zamwienia trudniej znale, atwo wic na
pewnym etapie projektu o przeoczenie prowadzce do ponownej implementacji tego samego
zachowania. Powtrzenia kodu z kolei prowadz do szybkiego zwikszania jego zoonoci i utraty
spjnoci. Z moich dowiadcze wynika, e puchnicie obiektw nie jest tak czstym zjawiskiem, jak mogoby si na pierwszy rzut oka wydawa. Cho nie mona zaprzeczy jego wystpowaniu, atwo je wykry i wprowadzi niezbdne korekty. Zalecabym wic raczej powstrzymanie
si od oddzielania funkcji od obiektw i implementowanie ich w tych klasach, gdzie w naturalny
sposb pasuj. Odchudzanie obiektw stosujemy dopiero wtedy, gdy faktycznie stwierdzimy, e
jest konieczne.
111
Kiedy uywamy
O ile odpowied na pytanie jak jest trudna ze wzgldu na obszerno tematu, odpowied na pytanie kiedy nie jest atwa ze wzgldu na swoj oglno i prostot. Sprowadza si bowiem do
rozwaenia poziomu zoonoci funkcji systemu. Skomplikowane i zmienne reguy biznesowe,
112
Warto przeczyta
Niemal kada ksika traktujca o projektowaniu obiektowym porusza zagadnienie modeli dziedziny. Decyduje o tym fakt, e w powszechnym rozumieniu programowanie obiektowe opiera si
wanie na takim podejciu.
Czytelnikom poszukujcym wprowadzenia do projektowania obiektowego polecam obecnie
ksik Larman. Przykady modelu dziedziny znajdziemy w Fowler AP. Hay zawiera wiele przykadw ukierunkowanych na kontekst relacyjny. Zbudowanie dobrego modelu dziedziny wymaga dobrej znajomoci teorii projektowania obiektowego. Jest ona doskonale wyoona w Martin and Odell.
Wyczerpujcy przegld wzorcw charakterystycznych dla rozbudowanych modeli dziedziny, a take
innych systemw obiektowych, znajdziemy w Gang of Four.
Eric Evans pisze obecnie ksik Evans, traktujc wanie o budowaniu modeli dziedziny. Do
chwili pisania tych sw miaem okazj zetkn si tylko z jej wstpn wersj, ale wygldaa ona
bardzo obiecujco.
113
Obliczanie wielkoci przychodu uznanego na dany dzie wymaga klas umowy i uznania przychodu.
,,,
!1+
2
114
Charakterystyczny dla modelw dziedziny jest sposb, w jaki wiele klas wsppracuje ze sob
w realizacji nawet najprostszych zada. To wanie prowadzi czsto do konkluzji, e w programach obiektowych ogromn ilo czasu spdzamy na przeszukiwaniu kolejnych klas, szukajc tej,
ktra jest nam w danej chwili potrzebna. Konkluzja taka jest niewtpliwie suszna. Warto takiego rozwizania doceniamy, gdy decyzja o uznaniu przychodu w okrelonym dniu staje si bardziej
skomplikowana. Musimy te rozway informacje dostpne dla innych obiektw. Zamknicie zachowania w obiekcie, ktry potrzebuje okrelonych danych, pozwala unikn powtrze kodu i ogranicza sprzenia midzy obiektami.
Analiza sposobu obliczania wartoci i tworzenia obiektw reprezentujcych uznanie przychodu
pozwala zauway charakterystyczne dla modelu dziedziny liczne obiekty o niewielkich rozmiarach.
W przedstawionym przykadzie, obliczenia i tworzenie obiektu rozpoczynaj si od klienta i s
przekazywane poprzez produkt do hierarchii strategii. Wzorzec strategii Gang of Four to popularny wzorzec projektowania obiektowego, ktry umoliwia poczenie grupy operacji w hierarchi
niewielkich klas. Kady egzemplarz produktu jest poczony z pojedynczym egzemplarzem strategii
obliczania uznania, okrelajcej, ktry algorytm zostanie uyty do obliczenia uznania. W tym
przypadku mamy dwie podklasy strategii obliczania uznania, reprezentujce dwa rne przypadki.
Struktura kodu wyglda nastpujco:
,,,
$
2
%
2
%(+ !2
!2
-
$
%
%(+ !0
,
1
2
,
1
2
,+ !1+ !2
6
$
,,,
!2
!
!
!
!2
-$
!!
!
!
!0
,12
,
!
!1
!
!2
6
115
-$
+9
$
!0
+$
+ !
!2
6
-$
+
!0
+$
+
9!
!B>C>2
6
-$
+-
!0
+$
+
9!
!A>B>2
6
!
!,,,
-
!
2
!
!,,,
!
0
,
!+
!
,!
,!9 !2
6
9!
!,,,
(
!#((2
!#((2
-
9!
!(
!#((
!#((
0
,(
!#((1(
!#((2
,!#((1!#((2
6
!
0
%?@1
,!
,A2
,
!+
!
?>@
,!9 !2
,
!+
!
?3@
,!9 !,(
!#((2
,
!+
!
?4@
,!9 !,!#((2
6
Wielk zalet strategii jest to, e zapewniaj dobrze zintegrowane punkty rozbudowy aplikacji.
Dodawanie nowego algorytmu uznawania przychodu wymaga wic utworzenia nowej podklasy, z wasn metod
!. Znacznie uatwia to wprowadzanie do systemu nowych
algorytmw.
Gdy tworzymy obiekty reprezentujce produkty, czymy je z odpowiednimi obiektami strategii.
Implementuj to w kodzie testu.
,,,
$
+
1$
,+9
$
7!9
72
116
$
1$
,+
7!72
$
-1$
,+-7!72
Gdy wszystkie elementy s gotowe, obliczanie uznania przychodu nie wymaga znajomoci podklas
strategii.
,,,
-
!0
,
!2
6
$
,,,
!
0
!
!,
!
2
6
117
Jedn z podstawowych zasad podejcia obiektowego jest wizanie danych z funkcjami (zachowaniami), ktre na tych danych operuj. Tradycyjny schemat opiera si na obiektach o okrelonej
tosamoci. Rozwizania tego rodzaju reprezentuje wzorzec Domain Model (109). Gdy wic mamy
do czynienia z klas Pracownik, kady egzemplarz tej klasy odpowiada pewnemu pracownikowi.
Systemy tego rodzaju sprawdzaj si dobrze w praktyce, poniewa posiadanie odwoania do pracownika umoliwia wykonywanie zwizanych z nim operacji, podanie za odwoaniami i gromadzenie danych o pracowniku.
Jednym z problemw charakterystycznych dla modelu dziedziny jest implementacja interfejsu
relacyjnej bazy danych. Mona powiedzie, e baza relacyjna jest w takich rozwizaniach jak
ciotka-wariatka, zamknita na strychu i wspominana w rozmowach jak najrzadziej i tylko wtedy,
kiedy jest to absolutnie konieczne. Wynikiem tego s niezwyke akrobacje, do ktrych programista
jest zmuszony w sytuacji, kiedy pojawia si potrzeba pobrania lub zapisania danych w bazie. Transformacje pomidzy dwiema reprezentacjami danych okazuj si czasochonnym i wymagajcym
fragmentem pracy nad aplikacj.
Gdy korzystamy ze wzorca Table Module, logika dziedziny zostaje uporzdkowana w klasy,
ktre odpowiadaj poszczeglnym tabelom bazy danych. Pojedynczy egzemplarz takiej klasy zawiera rnorodne procedury operujce danymi tabeli. Gwnym wyrnikiem wzorca Domain
Model (109) jest to, e gdy mamy do czynienia z wieloma zamwieniami, jednemu zamwieniu
odpowiada jeden obiekt zamwienia. Gdy korzystamy ze wzorca Table Module, jeden obiekt obsuguje wszystkie zamwienia.
118
Na czym polega
Zalet wzorca Table Module jest to, e umoliwia poczenie ze sob danych i zachowa bez utraty
wartoci reprezentowanych przez relacyjn baz danych. Z wierzchu modu tabeli wyglda jak
zwyky obiekt. Gwn rnic jest brak powizania go z tosamoci bytw, na ktrych operuje.
Aby uzyska adres pracownika, uywamy metody w rodzaju
$
+, -
"
!
$
+. Za kadym razem, gdy zamierzamy wykona operacj na wybranym pracowniku,
musimy przekaza pewnego rodzaju odwoanie do jego tosamoci. Najczciej jest to klucz gwny
tabeli bazy danych.
Wzorzec Table Module stosujemy zazwyczaj z pewn struktur skadowania danych opart
na tabelach. Uoone w tabele dane s najczciej wynikiem wywoania SQL i s przechowywane
w obiekcie Record Set (465), ktrego zachowania s podobne do zachowa tabeli SQL. Zadaniem
moduu tabeli jest zapewnienie interfejsu danych opartego na metodach. Grupowanie zachowa
wedug tabel zapewnia wiele zalet hermetyzacji funkcje pozostaj blisko zwizane z danymi,
na ktrych operuj.
Wykonanie pewnych operacji czsto wymaga uycia funkcji wielu moduw tabel. Niejednokrotnie wic mona si spotka z wieloma moduami, ktre operuj na tym samym obiekcie Record
Set (465) (patrz rysunek 9.4).
RYSUNEK 9.4. Kilka moduw tabeli moe korzysta z tego samego obiektu Record Set (465)
119
Zapytania w module tabeli mog przyj posta metod fabrykujcych (ang. factory methods).
Alternatyw jest wzorzec Table Data Gateway (133), cho wwczas w projekcie pojawia si dodatkowa klasa i zwizany z ni mechanizm. Zalet takiego rozwizania jest moliwo korzystania
z pojedynczego moduu tabeli do obsugi danych z rnych rde, poniewa kade z nich moe
obsugiwa inna brama Table Data Gateway (133).
Gdy uywamy bramy Table Data Gateway (133), aplikacja wykorzystuje j przede wszystkim
do zbudowania obiektu Record Set (465). Obiekt ten staje si wwczas argumentem konstruktora
moduu tabeli. Gdy niezbdne jest wykorzystanie wielu moduw tabeli, mona utworzy je przy
uyciu tego samego zestawu rekordw. Modu tabeli realizuje wwczas operacje logiki biznesowej,
po czym przekazuje zmodyfikowany obiekt Record Set (465) do warstwy prezentacji, ktra wywietla dane zestawu rekordw i umoliwia wprowadzanie zmian. W warstwie prezentacji mona
wwczas stosowa widety dostosowane do operowania danymi tabel. Widety te nie odrniaj
zestaww rekordw pobranych bezporednio z relacyjnej bazy danych od tych, ktre zostay zmodyfikowane przez modu tabeli. Po zmianach, wprowadzonych przy uyciu graficznego interfejsu
uytkownika, dane powracaj do moduu tabeli w celu sprawdzenia poprawnoci, po czym s zapisywane w bazie danych. Jedn z zalet takiego podejcia jest moliwo testowania moduu tabeli
przez stworzenie obiektu Record Set (465) w pamici, bez uycia bazy danych (rysunek 9.5).
Sowo tabela w nazwie wzorca sugeruje powizanie kadego moduu z pojedyncz tabel
bazy danych. Jest to zasadniczo prawd, ale nie obowizujc regu. Mona stosowa moduy tabeli
dla bardziej znaczcych widokw i innych zapyta. Struktura moduu tabeli nie jest cile uwarunkowana struktur tabel bazy. Mona wic korzysta z tabel wirtualnych, ktre powinny by
widoczne dla aplikacji, czyli wanie widokw i zapyta.
120
Kiedy uywamy
Wzorzec Table Module opiera si na danych uporzdkowanych w tabele. Korzystanie z niego jest
uzasadnione, gdy korzystamy z takich danych przy uyciu obiektw Record Set (465). Obiekty
takie staj si osi kodu aplikacji, wic dostp do nich musi by stosunkowo prosty.
Wzorzec Table Module nie zapewnia penego wykorzystania koncepcji programowania obiektowego przy dobrze uporzdkowanej, zoonej logice aplikacji. Nie mona tworzy bezporednich
relacji midzy egzemplarzami obiektw. Polimorfizm rwnie nie sprawdza si w takich rozwizaniach. Gdy poziom zoonoci jest duy, budowanie modelu dziedziny bdzie lepszym podejciem. Wybr pomidzy wzorcami Table Module a Domain Model (109) sprowadza si w zasadzie
do wyboru pomidzy potencjaem obsugi bardzo zoonej logiki a prostot integracji z opartymi
na tabelach strukturami danych.
Jeeli obiekty modelu dziedziny i tabele bazy danych mog opiera si na podobnej organizacji,
warto rozway poczenie wzorca Domain Model (109) z obiektami Active Record (147). Zalety
moduw tabeli przewyszaj korzyci z takiej kombinacji w sytuacji, gdy inne czci aplikacji
korzystaj ze wsplnej, tabelarycznej struktury danych. Std bierze si niewielka popularno
wzorca Table Module (117) w rodowisku Java. I to jednak moe si zmieni wraz z coraz szerszym stosowaniem mechanizmu zestaww wierszy (ang. row set).
Najczciej spotykanym zastosowaniem wzorca Table Module s projekty oparte na mechanizmach Microsoft COM. W rodowisku COM (i .NET) zestaw rekordw (Record Set (465)) jest
podstawowym typem repozytorium danych aplikacji. Zestawy rekordw mog by przekazywane
do interfejsu uytkownika, gdzie specjalne widety wywietlaj zawarte w nich dane. Biblioteki
Microsoft ADO zapewniaj niezbdny mechanizm dostpu do danych struktur relacyjnych. W takim
rodowisku moduy tabeli umoliwiaj efektywne porzdkowanie logiki biznesowej bez utraty
uatwie w obsudze tabel, jakie zapewniaj rne dostpne programicie aplikacji elementy.
RYSUNEK 9.6. Schemat bazy danych dla przykadu obliczania uzna przychodu
121
Klasy operujce danymi uporzdkowane s bardzo podobnie; kadej tabeli odpowiada jeden
modu tabeli. W architekturze .NET reprezentacj struktury bazy danych w pamici zapewnia
obiekt zbioru danych (ang. data set). Wanie na takich obiektach powinny operowa tworzone
klasy. Kada klasa moduu tabeli ma pole typu -. Jest to klasa, ktra w systemie .NET
odpowiada pojedynczej tabeli zbioru danych. Mog z niej korzysta wszystkie moduy tabeli i mona
j traktowa jako wzorzec Layer Supertype (434).
-%
,,,
--2
-%
!-<0
-1,-?-<@2
6
Umoliwia to utworzenie nowego moduu tabeli przez proste przekazanie zbioru danych do konstruktora moduu.
1+
2
Utrzymujemy w ten sposb kod odpowiedzialny za tworzenie zbioru danych poza moduami tabeli, co odpowiada zasadom korzystania z ADO.NET.
Wygodn cech jzyka C# jest indeksator (ang. indexer), ktry umoliwia dostp do wybranego
wiersza danych tabeli w oparciu o klucz gwny.
,,,
-+?!@0
!0
!(
1
!,)
710>672
-, (
?>@2
6
6
122
(
,*$
11$
,9$0
,
*9 !
2
6(
,*$
11$
, 0
?@1
A2
,
?>@*9 !
2
,
?3@
*9 !
,B>2
,
?4@
*9 !
,C>2
6(
,*$
11$
,0
?@1
A2
,
?>@*9 !
2
,
?3@
*9 !
,A>2
,
?4@
*9 !
,B>2
6
++/ 7"(
72
6
?@
-0
+
1
I-2
+
1,
+
42
!
1+
8>,>32
?@
1+?-@2
1
J-2
(
1>2=
288
?@1!
2
(
1
2=-288
?@1+
2
2
6
Cho we wczeniejszych przykadach uywaem w tym miejscu obiektu Money (446), tutaj dla
zrnicowania wprowadziem typ . Metoda alokacji jest podobna jak w przypadku klasy
Money (446).
Do przeprowadzenia takich operacji niezbdne s pewne funkcje zdefiniowane w innych klasach. Musimy mie moliwo pobrania typu kadego produktu. Moliwo t zapewnimy sobie,
wprowadzajc enumeracj typw i metod pobierajc odpowiedni warto.
-
$
09$
62
$
,,,
-$
*$
!0
! 1
!?@?7 7@2
$
,$
($
2
6
Metoda *$
hermetyzuje dane tabeli. Oglnie rzecz biorc, bezporedni odczyt sumy
umowy z kolumny tabeli (jak w przykadzie powyej) nie jest najlepszym podejciem. Zasada
hermetyzacji powinna obj poszczeglne kolumny danych. Rozwizanie takie wybraem ze wzgldu
na zaoenie, e pracujemy w rodowisku, w ktrym rne czci systemu korzystaj z bezporedniego
dostpu do zbioru danych. Gdy zbir danych jest przekazywany do interfejsu uytkownika, hermetyzacja rwnie nie jest stosowana. Funkcje dostpu do kolumn stosujemy tylko wtedy, gdy ma to
suy wprowadzeniu dodatkowej funkcjonalnoci, takiej jak konwersja cigu na typ $
.
123
Warto w tym miejscu wspomnie rwnie o tym, e cho w przykadzie stosujemy zbir danych
o nieokrelonych typach (poniewa jest to czciej stosowane na rnych innych platformach),
w rodowisku .NET zaleca si cise okrelanie typw (strona 466).
Kolejn niezbdn funkcj jest wstawianie nowego rekordu uznania przychodu.
!,,,
-!
!
0
+++1-,<++2
!1*</2
++?77@12
++?7
7@1
2
++?7
7@1
2
++?77@1
!,)
70>H672
-,+,++2
2
6
Rwnie ta metoda suy nie tyle hermetyzacji wiersza danych, co przede wszystkim wprowadzeniu
metody w miejsce kilku wierszy kodu, ktre musiayby by powtarzane w rnych miejscach aplikacji.
Drug funkcj jest sumowanie wszystkich przychodw umowy uznanych do okrelonego dnia.
Poniewa korzysta ona z tabeli uzna przychodw, metod definiujemy w odpowiadajcej tej tabeli
klasie.
!,,,
-!"
!
#(0
!(
1
!,)
7
10>6<=1K03H6K7
#(2
+?@
+1-, (
2
1>2
(
+
+
+0
81
+?7
7@2
6
2
6
Ten fragment korzysta z bardzo wygodnego mechanizmu ADO.NET, ktry umoliwia (bez uycia
jzyka SQL) definiowanie klauzuli 9: i wybieranie podzbioru danych tabeli, na ktrych maj
zosta wykonane operacje. W praktyce, w tak prostym przykadzie mona pj jeszcze dalej i uy
funkcji agregujcej.
!,,,
-!"
4!
#(0
!(
1
!,)
7
10>6<=1K03H6K7
#(2
!
/
17
72
#-L
1-,
/
(
2
,<
;>H
2
6
124
Aplikacje dla przedsibiorstw wymagaj czsto rnych interfejsw danych, na ktrych operuj,
i logiki, ktr implementuj: mechanizmw adowania danych, interfejsw uytkownika, bram
integracji i innych. Pomimo, e s przeznaczone do rnych celw, interfejsy te czsto wymagaj
tych samych mechanizmw interakcji z aplikacj, niezbdnych, aby uzyska dostp i operowa
danymi, jak rwnie do wywoywania funkcji logiki biznesowej. Interakcje te mog by bardzo
zoone, mog obejmowa transakcje operujce na rnych zasobach i wymaga koordynacji wielu
odpowiedzi aplikacji na pojedyncze wywoanie. Kodowanie logiki interakcji w kadym z interfejsw
niezalenie prowadzi wwczas do znacznej iloci powtrze.
Warstwa usug definiuje granic aplikacji Cockburn PloP i zbir operacji dostpnych warstwom klienckim. Hermetyzuje ona logik biznesow, zapewniajc sterowanie transakcjami i koordynacj odpowiedzi aplikacji, generowane przez waciwe implementacje operacji.
125
Na czym polega
Warstwa usug moe by implementowana kilkoma sposobami, z ktrych kady odpowiada przedstawionej powyej charakterystyce. Rnice wystpuj w podziale funkcjonalnoci wspierajcej
interfejs tej warstwy. Zanim przedstawi bliej rne moliwoci implementacji, zapoznajmy si
z podstaw koncepcyjn wzorca Service Layer.
Typy logiki biznesowej
Podobnie jak Transaction Script (103) i Domain Model (109), wzorzec Service Layer (124)
suy do porzdkowania logiki biznesowej. Wielu projektantw wrd nich i ja dzieli logik
biznesow (ang. business logic) na dwa rodzaje: logik dziedziny (ang. domain logic), zwizan
wycznie z dziedzin problemu (jak strategie obliczania uznania przychodu z umowy), i logik
aplikacji (ang. application logic), zwizan z funkcjami aplikacji Cockburn UC (jak powiadamianie administratorw umw i aplikacji zintegrowanych o obliczeniach uzna przychodu). Logik
aplikacji okrela si czasem terminem logika pracy (ang. workflow logic), cho termin praca
(albo przepyw pracy) bywa rnorodnie interpretowany.
Model dziedziny ma t przewag na skryptami transakcji, e dziki zastosowaniu klasycznych wzorcw projektowych sprzyja unikaniu duplikacji kodu dziedziny i uatwia zarzdzanie
zoonoci. Jednak umieszczenie logiki aplikacji w klasach obiektw dziedziny ma kilka niepodanych konsekwencji. Po pierwsze, klasy obiektw dziedziny, ktre zawieraj logik specyficzn dla okrelonej aplikacji i s zalene od jej pakietw, nie mog by uywane w innych aplikacjach. Po drugie, poczenie obu rodzajw logiki w tych samych klasach utrudnia powtrne
zaimplementowanie, gdy przyjdzie taka potrzeba, logiki aplikacji (na przykad w narzdziu do zarzdzania przepywem pracy). Wprowadzenie warstwy usug umoliwia oddzielenie dwch rodzajw logiki biznesowej. Oznacza to nie tylko korzyci typowe dla podziau warstwowego aplikacji, ale rwnie czyste klasy obiektw dziedziny, ktre atwiej przenosi midzy aplikacjami.
Moliwoci implementacji
Dwie podstawowe opcje implementacji to fasada dziedziny i skrypty operacji. Fasada dziedziny (ang. domain facade) to zbir prostych oson modelu dziedziny. Implementujce je klasy
nie zawieraj logiki biznesowej, ktra w caoci pozostaje w modelu dziedziny. Osony wyznaczaj granic aplikacji i zbir operacji, ktre warstwy klienckie mog wykorzystywa do interakcji
z ni.
Skrypty operacji (ang. operation script) to zbir nieco bardziej rozbudowanych klas, ktre
bezporednio implementuj logik aplikacji, delegujc zarazem logik dziedziny do hermetycznych klas obiektw dziedziny. Operacje dostpne klientom warstwy usug s implementowane jako skrypty uporzdkowane wedug obszarw tematycznych logiki. Kada taka klasa stanowi
usug aplikacji, std czsto umieszczane w ich nazwach sowo Service (usuga). Zbir takich
klas tworzy warstw usug. Powinny one by rozszerzeniem klasy Layer Supertype (434), ktra
oglnie definiuje zakres ich funkcji i wsplne zachowania.
Wywoania zdalne
Interfejs warstwy usug ma nisk ziarnisto. Wynika to w oczywisty sposb std, e jest to
zestaw operacji aplikacji, ktre s dostpne dla korzystajcych z niej warstw klienckim. W konsekwencji, klasy warstwy usug do dobrze nadaj si do realizacji wywoa zdalnych.
Z drugiej strony, zdalne wywoania wi si z kosztem rozproszenia obiektw. Wprowadzenie do warstwy usug obiektw Data Transfer Object (366) wymaga zazwyczaj do duo pracy.
Ten dodatkowy koszt warto potraktowa powanie, zwaszcza gdy model dziedziny jest skomplikowany, a interfejs uytkownika rozbudowany pod ktem obsugi zoonych przypadkw aktualizacji
126
danych. Jest to praca znaczca i czasochonna, porwnywalna chyba tylko z mapowaniem obiektowo-relacyjnym. Nigdy nie wolno wic zapomina o pierwszym prawie projektowania dla obiektw rozproszonych (strona 87).
Najrozsdniejszym podejciem do budowy warstwy usug bdzie wic stworzenie metod
przeznaczonych do wywoa lokalnych, ktrych sygnatury operuj obiektami dziedziny. Moliwo wywoa zdalnych mona doda dopiero wtedy, gdy okae si faktycznie niezbdna. Korzystamy wwczas ze wzorca Remote Facade (353), ktry uzupenia gotow warstw, przystosowan
do uytku lokalnego (mona te wprowadzi interfejsy zdalne bezporednio do obiektw warstwy
usug). Jeeli aplikacja jest wyposaona w interfejs przegldarki WWW lub usug WWW, nie
oznacza to jeszcze, e logika biznesowa musi pracowa w innym procesie ni strony serwera czy
usugi sieci Web. W rzeczywistoci, mona oszczdzi sobie pracy i skrci czas reakcji aplikacji
stosujc rozwizanie kolokowane. Nie oznacza to wcale ograniczenia skalowalnoci.
Identyfikacja usug i operacji
Identyfikowanie operacji, ktre powinna zapewnia wyznaczana przez warstw usug granica, jest stosunkowo proste. Wyznaczaj je potrzeby klientw, z ktrych najbardziej znaczcym
(i pierwszym) jest najczciej interfejs uytkownika. Poniewa jest on zaprojektowany pod ktem
przypadkw uycia, punktami wyjcia staj si potrzeby aktorw, opracowane wczeniej przypadki uycia i projekt interfejsu uytkownika aplikacji.
Wiele przypadkw uycia aplikacji korporacyjnej to do nudne operacje utwrz, odczytaj,
aktualizuj, usu dla rnych obiektw dziedziny. Tworzymy wic jeden obiekt pewnego
rodzaju, odczytujemy kolekcj innych, aktualizujemy jeszcze inne itp. Dowiadczenie wykazuje,
e wanie takie przypadki uycia maj swoje miejsce jako wzr dla funkcji warstwy usug.
Cho przypadki uycia prezentuj si stosunkowo prosto, niezbdne do ich realizacji czynnoci
aplikacji s zazwyczaj znacznie ciekawsze. Poza sprawdzaniem poprawnoci danych oraz tworzeniem,
aktualizowaniem i usuwaniem obiektw dziedziny, coraz czciej wymagane jest powiadamianie o wykonanych operacjach zarwno osb, jak i innych aplikacji. Tego rodzaju zdarzenia wymagaj koordynacji i caociowego podejcia do ich przetwarzania. To wanie jest zadaniem warstwy usug.
Nie jest atwo wyznaczy zasady grupowania powizanych operacji warstwy usug. Trudno
tu mwi o gotowych reguach postpowania. W przypadku niewielkiej aplikacji wystarczy moe
jedna taka grupa, nazwana tak samo jak aplikacja. Wiksze aplikacje dzieli si na kilka podsystemw, z ktrych kady zawiera kompletny pion elementw poszczeglnych warstw architektury. W takim przypadku kademu podsystemowi mona przypisa jedn abstrakcj warstwy
usug, dziedziczc nazw po podsystemie, do ktrego dostp zapewnia. Alternatyw moe by
grupowanie wedug partycji modelu dziedziny (np.
, $
) albo zagadnie, z ktrymi zwizane s realizowane zachowania (np. !
).
Implementacja w jzyku Java
Zarwno fasada dziedziny, jak i skrypty operacji mog by implementowane przy uyciu obiektw POJO
lub bezstanowych obiektw bean sesji. Wybieramy tutaj pomidzy atwoci testowania a atwoci
sterowania transakcjami. Zwyke obiekty jzyka Java jest atwiej testowa, poniewa nie wymagaj do
pracy kontenera EJB. Trudniej je natomiast powiza z rozproszonymi, zarzdzanymi kontenerowo
usugami transakcji, zwaszcza przy wywoaniach pomidzy usugami. Obiekty EJB zapewniaj obsug
kontenerowo zarzdzanych transakcji rozproszonych, ale kade uruchomienie lub test musi odbywa si
w rodowisku kontenera. Wybr nie jest wic atwy.
Moj ulubion technik implementacji warstwy usug w J2EE s bezstanowe obiekty session bean EJB 2.0, wyposaone w interfejsy lokalne. Korzystam przy tym ze skryptw operacji, ktre deleguj
do klas obiektw dziedziny, zaimplementowanych jako obiekty POJO. Rozproszone, zarzdzane
kontenerowo transakcje, jakie zapewnia rodowisko EJB, znakomicie uatwiaj implementowanie
warstwy usug przy uyciu bezstanowych obiektw session bean. Wprowadzone w EJB 2.0 interfejsy
lokalne umoliwiaj warstwie usug wykorzystanie cennych usug transakcji, nie zmuszajc zarazem do
wprowadzania obiektw rozproszonych.
127
Omawiajc implementacj w jzyku Java, warto zwrci uwag na rnice midzy wzorcem Service
Layer a wzorcem Session Facade, opisywanym w literaturze J2EE (Alur et al. i Marinescu). Session
Facade ma na celu uniknicie obnienia wydajnoci, wynikajcego z nadmiernej liczby zdalnych wywoa obiektw entity bean. Std osonicie obiektw entity bean obiektami session bean. Service Layer to
wzorzec, ktry dzieli implementacj w celu uniknicia powtrze kodu i uatwienia jego powtrnego
uycia. Jest to wzorzec architektury niezaleny od wykorzystywanej technologii. Warto przypomnie,
e opisany w Cockburn PloP wzorzec granicy aplikacji, ktry by inspiracj dla wzorca Service Layer,
powsta trzy lata wczeniej ni rodowisko EJB. Wzorzec Session Facade moe przypomina w swojej
idei warstw usug, nie jest jednak tym samym.
Kiedy uywamy
Podstawowe korzyci z wprowadzenia warstwy usug to definicja jednolitego zbioru operacji aplikacji,
ktry jest dostpny wielu rodzajom klientw, oraz koordynacja odpowiedzi aplikacji. Odpowied
taka moe wymaga logiki aplikacji, ktra zapewnia caociowe przetwarzanie operacji, oparte na
wielu zasobach transakcyjnych. Aplikacja, ktra ma wicej ni jednego klienta korzystajcego z jej
logiki biznesowej, i realizuje zoone odpowiedzi oparte na wielu zasobach transakcyjnych, jest
niewtpliwie dobrym kandydatem do wprowadzenia warstwy usug z kontenerowo zarzdzanymi
transakcjami, nawet jeeli nie korzysta z architektury rozproszonej.
Prociej jest prawdopodobnie odpowiedzie na pytanie, kiedy nie warto wprowadza warstwy
usug. Nie jest ona zazwyczaj uzasadniona, gdy logika biznesowa aplikacji ma tylko jednego klienta,
na przykad interfejs uytkownika, a jej przypadki uycia nie przewiduj korzystania z wielu zasobw
transakcyjnych. W takich przypadkach do kontroli transakcji i koordynowania odpowiedzi moe posuy mechanizm Page Controller (302). Moe on te delegowa bezporednio do warstwy rda danych.
Gdy tylko pojawia si koncepcja wprowadzenia drugiego klienta lub drugiego zasobu transakcyjnego, warto wprowadzi warstw usug ju na pocztku projektu.
Warto przeczyta
Niewiele napisano dotd o wzorcu Service Layer (124). Jego pierwowzorem by wzorzec granicy
aplikacji, przedstawiony przez Alistair Cockburn (Cockburn PloP). Praca Alpert et al. omawia rol
fasad w systemach rozproszonych. Dla porwnania warto zapozna si z rnymi opisami wzorca
Session Facade Alur et al. i Marinescu. Z zagadnieniem funkcji aplikacji, ktre musz by koordynowane przez warstw usug, powizany jest opis przypadkw uycia jako kontraktu zachowa, przedstawiony w Cockburn UC. Wczeniejsz prac teoretyczn jest Coleman et al., gdzie
mowa o rozpoznawaniu operacji systemowych w metodologii Fusion.
128
Rozwiniemy teraz nieco podstawowy scenariusz, aby wprowadzi do niego elementy logiki
aplikacji. Zamy, e przypadki uycia aplikacji wymagaj, aby obliczaniu uzna przychodu dla
umowy towarzyszyo przesanie powiadomienia e-mail do wskazanego administratora umw
oraz opublikowanie przy uyciu oprogramowania typu middleware wiadomoci, ktra zapewni
przekazanie informacji aplikacjom zintegrowanym.
Rozpoczynamy od zmodyfikowania klasy !
z przykadu ilustrujcego
wzorzec Transaction Script (103) tak, aby rozszerzy klas Layer Supertype (434) i wprowadzi
kilka klas Gateway (425), ktre posu do realizacji logiki aplikacji. Bdzie to odpowiada diagramowi klas przedstawionemu na rysunku 9.7. Klasa !
stanie si implementacj warstwy usug opart na obiektach POJO, a jej metody bd reprezentowa dwie dostpne na
granicy aplikacji operacje.
Metody klasy !
realizuj logik aplikacji, delegujc logik dziedziny do klas
obiektw dziedziny, wzitych z przykadu ilustrujcego wzorzec Domain Model (109).
-
0
*+!*+0
//zwraca egzemplarz bramy poczty elektronicznej
6
!
*+!!
*+0
//zwraca egzemplarz bramy integracji
6
6
-
(*+0
%!
!
!
-L
!-2
6
-
(!
*+0
-
!
2
6
-!
/
0
-
!!
<
-
0
1
,
)
E
<
-
2
,
!2
!*+,%!
,!
7# HE+K78
<
-
87,#-"
"
"
,72
!!
*+,
-
!
2
6
-%
!"
!
<
-
#(0
,
<
-
,
!"
#(2
6
6
W naszym przykadzie nie bdziemy zajmowa si kwestiami magazynowania danych, ograniczajc si do stwierdzenia, e klasa
implementuje statyczne metody do odczytywania
umw z warstwy rda danych wedug ich numerw. Nazwa jednej z tych metod (
)
E ) sygnalizuje zamiar aktualizacji odczytywanej umowy, co umoliwia mechanizmowi Data Mapper (152)
zarejestrowanie odczytywanego obiektu przy uyciu, na przykad, schematu Unit of Work (169).
RYSUNEK 9.7. Diagram klas POJO dla usugi obliczania uzna przychodu
129
130
Nie bdziemy rwnie opisywa szerzej sterowania transakcjami. Metoda
! jest z natury transakcyjna, poniewa w trakcie jej wykonywania modyfikowane s
trwae obiekty umw (przed dodaniem uzna przychodu); do oprogramowania middleware przekazywane s wiadomoci; wysyane s wiadomoci pocztowe. Wszystkie te odpowiedzi aplikacji
musz by przetwarzane jako cao, bo nie chcemy wysya wiadomoci e-mail lub publikowa
wiadomoci dla innych aplikacji, jeeli zmiany w umowie nie zostay trwale zapisane.
Na platformie J2EE zarzdzanie transakcjami rozproszonymi mona pozostawi kontenerowi EJB. W tym celu implementujemy usugi aplikacji (i obiekty Gateway (425)) jako bezstanowe obiekty session bean, korzystajce z zasobw transakcyjnych. Rysunek 9.8 przedstawia
diagram klas implementacji usugi obliczania uzna przychodu, korzystajcej z interfejsw lokalnych EJB 2.0 i idiomu interfejsu biznesowego (ang. business interface). W tej implementacji
wci korzystamy z klasy Layer Supertype (434), zapewniajcej metody obiektw bean, ktrych
wymaga mechanizm EJB, oraz metody specyficzne dla aplikacji. Jeeli zaoymy, e interfejsy
*+ i !
*+ s rwnie interfejsami biznesowymi odpowiednich bezstanowych obiektw session bean, to sterowanie transakcj rozproszon uzyskamy przez zadeklarowanie metod
!, %! i
-
!
jako transakcyjnych. Metody !
z przykadu opartego na obiektach
POJO zostaj przeniesione w niezmienionej postaci do klasy !
.
Wanym elementem w tym przykadzie jest fakt, e warstwa usug uywa do koordynowania
transakcyjnych odpowiedzi aplikacji zarwno skryptw operacji, jak i klas obiektw dziedziny.
Metoda
! realizuje logik aplikacji wymagan przez przypadki uycia, ale deleguje logik dziedziny do klas obiektw dziedziny. Zastosowanych jest te kilka technik unikania powtrze kodu w skryptach operacji, ktre tworz warstw usug. Cz funkcji jest
przeniesiona do osobnych obiektw Gateway (425), ktre mog by ponownie wykorzystywane
przez zastosowanie delegacji. Layer Supertype (434) zapewnia wygodny dostp do tych obiektw.
Czytelnik mgby stwierdzi, e zastosowanie wzorca Observer i Gang of Four pozwalaoby
uzyska bardziej eleganck implementacj skryptu operacji. Jednak wzorzec Observer byby trudny
do zaimplementowania w bezstanowej i wielowtkowej warstwie usug. Otwarty kod skryptu operacji
okazuje si bardziej przejrzysty i prostszy.
Mona rwnie stwierdzi, e funkcje logiki aplikacji mogyby zosta zaimplementowane w metodach obiektw dziedziny, takich jak
,
!, lub nawet w warstwie rda danych, co wyeliminowaoby potrzeb stosowania osobnej warstwy usug. Taka alokacja
funkcji wydaje si jednak niepodana z kilku powodw. Po pierwsze, klasy obiektw dziedziny
gorzej poddaj si prbom ponownego uycia w innych aplikacjach, gdy zawieraj logik specyficzn dla jednego rozwizania (i pozostaj zalene od specyficznych dla aplikacji obiektw (Gateway (425)). Ich zadaniem jest modelowanie czci dziedziny problemu, z ktrymi aplikacja jest
zwizana, co jednak nie oznacza wszystkich funkcji wyznaczanych przez przypadki uycia teje
aplikacji. Po drugie, hermetyzacja logiki aplikacji w wyszej, przeznaczonej wycznie do tego
celu warstwie (czego nie mona powiedzie o warstwie rda danych) uatwia wprowadzanie w niej
zmian. Ich celem moe by choby wprowadzenie motoru zarzdzania przepywem pracy.
Jako wzorzec organizacji warstwy logicznej aplikacji korporacyjnej, Service Layer czy w sobie skrypty i klasy obiektw dziedziny, korzystajc z najlepszych cech obu podej. Jego implementacja moe by przeprowadzona rnymi metodami: przy uyciu fasad dziedziny lub skryptw
operacji, obiektw POJO lub obiektw bean sesji (albo jednych i drugich), z orientacj na wywoania
lokalne lub zdalne (albo oba rodzaje). Co najwaniejsze, niezalenie od tego, ktr implementacj
wybierzemy, bdzie ona hermetyczn realizacj logiki biznesowej aplikacji, zapewniajc spjny
interfejs tej logiki rnym warstwom klienckim.
RYSUNEK 9.8. Diagram klas EJB dla usugi obliczania uzna przychodu
131