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í…