Mam mętlik w głowie jeśli chodzi o wzorce Domain Object, Transfer Object itd. Postaram się w jak najprostrzy sposób opisać o co chodzi.
Otóż w książce "Core Java EE Patterns", jest napisane m.in : "Komponenty Entity prowadzają znacznie większy narzut niż zwykłe obiekty Javy. Wywołania metod tych komponentów są wywołaniami zdalnymi, a więc powodują dodatkowy ruch w sieci. Poza tym komponenty te muszą korzystać z zewnętrznych źródeł danych", lub np. "Komponenty Entity to najczęściej duże, trwałe obiekty rozproszone. Udostępnienie tych komponentów klientom w innych warstwach powoduje wzrost narzutu wprowadzanego przez sieć i zmniejszenie wydajności " itd itd. Ogólnie przedstawiony jest też wzorzec gdzie DAO ma zwracać obiekt transferowyTO (Transfer object), a nie komponent entity str 385.
Natomiast przeglądając sobie wzorce tworzenia aplikacji w springu (w załączniku) , lub też z tej strony: http://gordondickens.com/wordpress/2012/07/08/enterprise-spring-best-practices-part-2-application-architecture/ . Widzimy, że obiekt domeny przechodzi przez wszystkie warstwy. Podobnie jest jak czytam książke spring data tam DAO (Repositories np. CrudRepositories) zwracają obiekty domeny oraz mają domyślnie transakcje !!!.
Według mnie propagacja obiektu domeny powyżej DAO nie ma sensu. Po pierwsze zawsze obiekt domeny tworzymy pod dane rozwiazanie np. JPA, MongoDB, Neo4J itd. Zawsze użyjemy troche odmiennego modelowania biorąc pod uwagę dobre/ złe strony danego rozwiązania. Dodajemy także odpowiednie adnotacje inne np . dla jpa inne dla mongo itd. Dlatego jeśli będziemy chcieli zmienić providera w warstwie integracyjnej to mamy duużo pracy, bo nasz obiekt domeny jest na wszystkich warstwach. Tego problemu nie mamy jeśli użyjemy obiektu transferu, tworzymy taki obiekt i tyle jego rozdzajów w zależności jakie informacje chcemy wyciągnąć, następnie dostosowujemy konwersje pomiędzy domain object, a data object. Czyli nasze warstwy są niezależne od siebie dzieli je tylko Transfer Object.
Problemem mogą być transakcje, i leniwe ładowanie w przypadku jpa. Musimy mieć transakcje na poziomie DAO, aby leniwie dociągnąć sobie dane.
Pojawiają się jednak następujące pytania.
-
Przecież w rozwiązaniach opartych na nosql nie używamy encji, kontener (serwer) nie zarządza nimi, korzystamy za to z innych mechanizmów, np. JDO i wzbogacanie klas. Czy wtedy nasz obiekt domeny jest już lżejszy ?
-
Gdybyśmy propagowali nasz domain object do warstwy prezentacji, moglibyśmy wykorzystać leniwe ładowanie i fajnie dociągać sobie informacje w warstwie prezentacji ?
Jak widać jestem troszkę zamieszany w tym temacie, Zwłąszcza jest dla mnie dziwne tak jak piszą w publikacjach np. książka Spring Data, piszą, żeby w obiektach domenowych nie używać np. klasy ObjectID bo jest specyficzna dla mongoDB. No ale przecież tak jak pisałem wcześniej, nie da się stworzyć obiektu domeny który będzie ewentualnie pasował do wszystkich rozwiązań, zawsze wzbogacamy klasę adnotacjami , używamy innych trików bo np. w mongoDB mapa jest czymś naturalnym a w mysql już musimy inaczej, opatrzyć ją adnotacją itd. Dlatego jest dla mnie bez sensu propagowanie "uniwersalnego" domain object. :/
- wzorzec.png (56 KB) - ściągnięć: 215
Shalom