25 marca 2008

Adnotacje kontra XML

Byłem jakiś czas temu uczestnikiem dyskusji, a może nawet sporu, na temat tytułowy, czyli adnotacje czy XML? Koronnym argumentem tych, którzy optują za XML’em jest, że można dokonywać zmian bez rekompilacji kodu, ale ja powiadam, co z tego? Nie jest to argument sam w sobie, trzeba się jeszcze zastanowić właśnie nad tym - co z tego, że można? Co z tego, że w przypadku użycia adnotacji nie mogę dokonywać zmian bez rekompilacji kodu. Czy rzeczywiście jest to argument i czy zawsze? Nie twierdzę, że adnotacje są zawsze „lepsze”, ale często są łatwiejsze w użyciu, podczas gdy nie ma powodów by ich nie używać. Jak na wpis, którego celem jest polecenie lektury innego wpisu robi się już dużo tekstu, więc przechodzę do sedna - polecam lekturę artykułu "Annotations vs. XML" i czekam na komentarze.

15 komentarzy:

Koziołek pisze...

Cześć,

Poczytałem to co napisałeś i nasunęły mi się ciekawe wnioski:
- Adnotacje są niezłym rozwiązaniem problemu "konfiguracji domyślnej". To co w XML to nadpisuje to co w adnotacjach. Takie rozwiązanie jest spotykane w np. EJB3. To jest plus.
- Adnotacje nie dają niestety zwykłych POJO. Razem z klasą muszą migrować też odpowiednie zależności dotyczące adnotacji. Może to czasami spowodować nadmierne roztycie aplikacji o w sumie zbędne elementy.

Mariusz Lipiński pisze...

Co do pierwszego wniosku - zgoda, taki model działania - wpierw adnotacje a XML jako patche - jest super dla np. JPA ale niestety Hibernate nie implementuje jeszcze tego w pełni. W Hibernate można nadpisywać w ten sposób tylko adnotacje EJB ale adnotacji specyficznych dla Hibernate już nie - trzeba o tym pamiętać.

Co do drugiego wniosku - zgoda, ale wydaje mi się to być częścią większego problemu. A problem ten to odpowiedź na pytanie - czy powinniśmy używać encji JPA/Hibernate we wszystkich warstwach aplikacji, z widokiem włącznie, czy może warstwa środkowa - tj. serwisy logiki aplikacji - powinny izolować DAO od warstwy widoku? Jeśli powinny izolować, to oznacza to, że encje nie powinny być używane przez warstę widoku i problem wydaje się rozwiązany. Zdaje się, że właśnie po to jest wzorzec DTO.

Łukasz Lenart pisze...

Wzorzec DTO głównie powstał z myślą o przesyłaniu obiektów po sieci do zdalnego klienta. I wtedy przesłanie do klienta obiektu encji, mogło powodować problemy z zależnościami po stronie klienta.
Obecnie sam rzadko kiedy stosuje DTO jeśli aplikacja działa w obrębie tej samej maszyny Javy, po prostu to się nie opłaca.
A wracając do tematu, adnotacje powodują, że nasze klasy POJO stają się zależne od danej implementacji. Myślę, że nie da się jednoznacznie odpowiedzieć kiedy używać adnotacji a kiedy xmla.

Koziołek pisze...

Hm... Zawsze można spróbować używać własnych adnotacji lub ograniczyć się do adnotacji ze standardu Javy.
Takie przemyślenie, model jest specyficzną częścią każdej aplikacji. Wynika to z faktu, że jest skończony i oddaje określony stan świata w sposób odpowiedni do potrzeb projektu. Przykład to opis samochodu jeżeli prowadzimy salon to uwzględnimy kolor, moc czy też cenę, z drugiej strony jeżeli modelujemy fizykę to ważniejsze będą wymiary czy też moment bezwładności względem jakiejś osi. Powoduje to, że sam model jest ciężki do powtórnego wykorzystania. Idąc dalej tym tokiem możemy założyć, że sposób w jaki skonstruowano model w tym i zależności jest co do zasady niezmienny i nie należy się przejmować tym że tworzone są zależności. Przyjmując dany model stosujemy zasadę wszystko albo nic. Hm... ciekawe czy mnie zrozumieliście.

Łukasz Lenart pisze...

Nie jest to do końca prawda. Klient dla którego pracuję ma cały model zaszyty w XMLu, a dokładnie w XML Schema, z którego generowane są klasy Java. W takim przypadku nie jesteś w stanie użyć adnotacji.
Druga sprawa to encje to nie jedyny obszar gdzie można używać adnotacji, np. walidacja. Raz, że można ją zmieniać bez rekompilacji i deploymentu aplkacji, co nie zawsze jest proste. Druga spraw, pliki XML można generować, co raczej nie jest możliwe w przypadku adnotacji ;-)
Dlatego twierdzę, że XML i adnotacje będą współistnieć razem, w zależności od potrzeb projektu.

Koziołek pisze...

tró... zapomniałem, że struktury można generować z xsd. Rzecz oczywista, a uszła mojej uwadze. Walidacja w adnotacjach kontra ta w xmlu... Hm... wolę jednak pisanie w czystej Javie bez xmla i adnotacji. Co za dużo to niezdrowo.

Łukasz Lenart pisze...

No nie wiem, czy chciałbyś dla każdego pola swojego Entity wpisywać 3-4 różne walidatory, klasa była by kompletnie nieczytelna ;-)
Nie mówiąc o literówkach, których nie jesteś w stanie wyłapać ;-(

Koziołek pisze...

Dlatego też wolę narzędzia. Większość walidacji to proste sprawdzanie czy dany ciąg odpowiada wzorcowi, a bardziej skomplikowanych warunków (jeżeli X to Y i user to M to jeżeli a różne od i c nie null to dobrze albo prostszy przykład numer PESEL z datą urodzenia i płcią) i tak nie sprawdzę za pomocą adnotacji. Dla reszty napiszę (napisałem już) narzędzia i tyle...

Mariusz Lipiński pisze...

Co do "adnotacje powodują, że nasze klasy POJO stają się zależne od danej implementacji" - hmmm... cała aplikacja jest zależna od technologii których użyliśmy. Jeśli zależy nam na "wolności", to używajmy standardów takich jak JPA. Generalnie, adnotacje nic tu nie zmieniają - jeśli używam np. Hibernate'a a nie JPA to i tak jestem uzależniony. Jeśli go używam, to zakładam że jest mało prawdopodobne bym w przyszłości musiał z niego zrezygnować a więc mało prawdopodobne, że i adnotacje będą mi przeszkadzały.

Co do "model zaszyty w XMLu, a dokładnie w XML Schema, z którego generowane są klasy Java" - tak, jest to typowa sytuacja w rozwiązaniach typu SOA (chyba, że mówisz o jakimś innym przypadku). Model danych zdefiniowany jest w XML Schema a odpowiadające mu klasy są generowane... i jeśli używamy np. JAX-WS to jak najbardziej zawierają adnotacje. Ale tu pełna zgoda, że raczej nie chcemy modyfikować tych klas ręcznie, bo przy następnym generowaniu wszystkie te zmiany zostały by nadpisane. Fakt, w takim przypadku wszelki development chcemy mieć poza tymi klasami, więc adnotacje np. Hibernate czy JPA odpadają, ale adnotacje JAXB jak najbardziej są super (IMHO).

Łukasz Lenart pisze...

Mój pierwszy wpis był bardzo ogólny, a drugi jest szczególnym przypadkiem, gdzie nie użyjemy adnotacji. A JAXB jest przykładem zależności POJO od konkretnej implementacji ;-)

Mariusz Lipiński pisze...

Hmmm... "JAXB jest przykładem zależności POJO od konkretnej implementacji" - JAXB to jest standard (specyfikacja), który może mieć wiele różnych implementacji.

Koziołek pisze...

Dodatkowo skoro jest to specyfikacja i korzystamy TYLKO z jej interfejsów to sytuacja wygląda tak jakbyśmy korzystali z standardowej paczki javy. Nic tak naprawdę nas nie ogranicza.

Łukasz Lenart pisze...

"... JAXB to jest standard (specyfikacja) ..." i tak i nie ;-)
JAXB to również referencyjna implementacja i stąd moja zagubienie :D

Łukasz Lenart pisze...

"Nic tak naprawdę nas nie ogranicza" no nie do końca, ogranicza nas specyfikacja i trzeba mieć ją na uwadze.
Nieraz już się zdarzało, że proces JSR jest zbyt wolny i powstają własne rozwiązania (Hibernate, Spring), które zawsze są o krok dalej niż specyfikacje ;-)

Unknown pisze...

Tak jak ktoś wcześniej napisał istotą jest aplikacja. Jeśli będą to na przykład serwery giełdowe to bardzo istotne jest że można wymienić ich konfigurację bez restartu. Natomiast jeśli takiej przesłanki nie ma to adnotacje są bliżej kodu z punktu widzenia developera znacznie łatwiej poprawiać błędy czy też panować na kodem po prostu logika i validacja są w jednym miejscu.