AOP - pokud vám to nikdo neřekne přijdete na to sami

Obrázek uživatele benzin@jabber.cz
Vložil benzin@jabber.cz, St, 2007-01-31 10:26 :: | |

Apekty řízené programování. Předpokládám, že nevíte o co se jedná, nebo jsou vaše informace jen povrchní. I když jsem o tom ledasco četl a zvládnul i technologii AOP, kterou nabízí spring, pořád jsem nechápal k čemu to vlastně je.

Všechny příklady se zaměřují na to jak vytvořil Logovací systém a podobně. Jenže při použiti apache.common.logigng systému, nebo log4j vlastně ani aspekt nepotřebujete. Popisovač vám umožňuje pro každý balík vytvořit pro každý balík vlastní logger, nebo mít jen jeden logger pro všechny balíky. Takže k čemu ten aspekt?

Často se říká, že je to super na databáze. No jo, alkdyž mám hybernate? Přeci popíšu změny jak chci zase v nasazovači a je pokoj. To jsem si myslel. Jenže jsem byl na omylu. Ti kterým to někdo řekl, nebo už na to přišli dřív ví, jak se pletu.

Vždycky jsem měl jeden DAO objekt (objekt který umožnuje přístup k datům z databáze), ten objekt třeba přebíral metody z jiných DAO objektů, ale byl v podstatě jeden hlavní a ústřední objekt, pro přístup k databázi. Do jisté míry se dá říct, že se jednalo o takový apekt. Jenže nevyžadoval využití žádné sofistikovanější technologie AOP, protože prostě stačilo v každém beanu přidat jednu get/set metodu a bylo po ptákách.

Jenže teď jsem začal pracovat na něčem, čemu by se dalo říct "redakční systém". A to je asi prubířský kámen aspektů. Pokud chcete udělat celý balík modulární a třeba dokonce, tak aby se daly moduly jen s malou námahou zapojovat i do cizích redakčních systémů, je jasné, že si z výše nastíněným "globálním" objektem nevystačíte. Přístup k databázi si musí každý modul řešit "sám". Záměrně to píšu v úvozovkách, protože tím nechci říct, že by každý modul měl sahat sám do databáze, jenom tím chci říct, že tento modul, nesmí importovat žádnou knihovnu odjinud, tím by totiž byl závislý na implementaci tříd v jiných balíčcích (modulech, aspektech).

Proto najednou je nutné v každém modulu vytvořit rozhraní pro přístup k datům. Dokonce je pak nutno vytvořit abstraktní testy, které testují třídy implementující tyto rozhraní.

Takže zatímco jsem dříve měl strukturu balíků takovýto:
...web.hendler
----- LoginHendler.java
----- AdminHendler.java
...web.controller
----- LoginController.java
----- AdminController.java
...web.command
----- LoginCommand.java
----- AdminCommand.java
...db.
----- IDao.java
----- Dao.java

jsem zaměnil strukturu na takovou:
...login.
----- LoginCommand.java
----- ILoginDAO.java
...login.web
----- LoginController.java
...admin.
----- AdminCommand.java
----- IAdminDAO.java
...admin.web
----- AdminController.java
... db.
----- Dao.java implementujici ILoginDAO, IAdminDAO atd.

Pak je konečně možné modul vytrhnout, implementovat metody rozhraní pro přístup k datum a jiným busines objektům a doimplementovat abstraktní testy a modul je zařazen do jiného projektu.

Na v tomhle vám pomůže AOP.