První články v češtině se aspektovém programování objevily před mnoha lety. Musím říct, že mě k používání tohoto přístupu nenadchly – přeci jenom logování není tak náročná operace a profiling není zas tak častá operace. Nezdálo se mi, že by stálo za to učit se nové principy a do projektu přidávat nové knihovny a postupy. Prostě mi tenkrát chyběl ten správný prakticky použitelný příklad použití. Rád bych jich ve svém článku několik ukázal.
@Transactional
Můj pohled na aspektové programování změnila anotace @Transactional ze Spring Frameworku. Anotace zpřehledňuje práci s (databázovými) transakcemi – před prvním příkazem metody označené transakcí se proveden begin transaction, po jejím úspěšném skončení commit, v případě vyjímky rollback.
public class MoneyService(){ @Transactional public void moneyTransfer(Account acc1, Account acc2){ // something in transaction } }
Modulární datový model
Nevýhodou použití Hibernate je to, že vyžaduje monolitickou aplikaci. V Hibernate nelze například definovat asociace pomocí interface nebo nelze aplikaci napsat tak, že po přidání modulu do aplikace si tento modul mohl přidat k entitám vlastní atributy.
Přidat nový atribut k entitě je pomocí aspektového programování triviální. Modularizaci můžeme vytvořit tak, že entita bude definována v jádru aplikace a aspekt přidávající atribut bude v JARu.
@Entity public class Address { @Column(length=10) String street; @Column(length=20) String city; }
aspect Address_Module_Extension { @Column(length=6) String Address.zip; }
ActiveRecord ve String Roo
Paradigmatem aplikací (nejen) ve Spring Frameworku je použití vrstvy pro přístup k datům (Data Access Layer). Koncepce je to správná (oddělení vrstev), ale realizace bývá horší – aplikace často obsahuje sadu generických DAO objektů… Nabízí se použití návrhového vzoru ActiveRecord, ale jak zařídit, aby entitní třídy obsahovaly základní metody persist(), merge() a delete()? Pomůže aspektové programování a Spring Roo – viz samostatný článek.
Domain Driven Design
Jedna z metodik, jak psát analýzu a kódovat, je Domain Driven Design. Nejprve krátké a zjednodušené vysvětlení: obvyklým přístupem je oddělení entitních tříd, která tvoří datové pozadí, a servisních tříd, která jsou operacemi nad daty. Domain Driven Design vede k přístupu, kdy k důležitým entitním třídám – doménám – přidáme i metody provádějící operace nad daty. Pro programátory ve Spring Frameworku možná kacířská myšlenka, ale přesto její použití může být velké plus – zvýší se tím přehlednost projektu. Určitě nebudete muset hledat metody pracující nad daty tak často.
Přidat metodu k entitě v prostředí Spring Frameworku není samo sebou – obvykle potřebujeme volat kód nějaké služby. Entity ovšem nejsou z pohledu Springu manageované beany, dependency injection na nich fungovat nebude. Zde opět pomůže aspektové programování a anotace @Configurable. Tato anotace zajistí nainjektování bean ihned po zavolání konstruktoru. Podrobněji viz též
https://blog.krecan.net/2009/01/22/skryty-drahokam-springu/
@Configurable public class Person { String username; String password; @Autowired PersonService service; public void changePassword(String newPwd){ service.changePassword(newPwd); } }
Závěr
Proti aspektovému programování bych měl dvě výhrady – má na první pohled složitou terminologii a funguje „magicky“. Na druhou stranu jsou případy, kdy tato technologie výborně pasuje na potřeby aplikace – pak není důvod se jí vyhýbat. Výše uvedené příklady nechť jsou inspirací…
Napsat komentář