AspectJ – Example
Salah satu bahasa pemrograman yang mendukung aspect oriented programming (AOP) adalah Java dengan library-nya AspectJ. Sempat dibahas sedikit dari tulisan ini dan komentar-komentarnya…
Berikut adalah beberapa konsep baru yang diperkenalkan dalam AOP: joinpoint, poincut, dan advice.
Joinpoint merupakan definisi lokasi pada kode program, dimana saat eksekusi, aspek tertentu akan dieksekusi sesuai dengan aturan yang telah ditetapkan. Joinpoint didefinisikan di dalam sebuah aspect dengan menggunakan dua macam konstruktor, yaitu poincut dan advice.
Pointcut merupakan konstruktor yang digunakan untuk menunjuk joinpoint tertentu pada saat eksekusi. Sebuah pointcut dideklarasikan dengan menggunakan kata kunci pointcut. Ada banyak tipe poincut, berikut adalah contohnya untuk tipe pemanggilan method : poincut lokasi1 () : call (int Date.getHour());
Artinya, kita mendefinisikan sebuah lokasi pada kode program (lokasi1), yaitu lokasi pemanggilan method getHour() dari kelas Date.
Advice mendefinisikan potongan kode yang akan dieksekusi pada sebuah joinpoint. Ada tiga jenis advice, yang masing-masing menentukan di sebelah mana advice tersebut akan disisipkan. Jenis advice pertama dieksekusi sebelum joinpoint (before advice), jenis kedua dieksekusi setelah joinpoint (after advice), dan yang terakhir dieksekusi pada joinpoint (around advice).
Contohnya: before () : lokasi1 () { system.out.println (“Before : ” + thisJoinPoint); }
Kode aspect yang lengkap untuk contoh di atas adalah sbb:
public aspect ngeDebug {
pointcut lokasi1 () : call (int Date.getHour ());
before () : lokasi1 () { system.out.println (“Before : ” + thisJoinPoint);}}
Jadi, saat debuging misalnya, kita tidak perlu “menabur” kode println dimana-mana (yang kemudian sering lupa dihapus), tapi cukup mendefinisikan sebuah aspect ngeDebug seperti di atas…
He2m sebenarnya cara println(“\nhello\n”) masih menjadi cara favorit sampai saat ini,. 😀
Nah kan… itu cara debugging paling primitif lho… 🙂
Nampaknya cara debugging pakai printf() / println() tetap favorit, karena konsep itu sudah ada di kepala, dan gak perlu repot-repot belajar konsep baru. kadang bingung juga, waktu ini mending dipakai belajar konsep baru, atau buat ngejar setoran menyelesaikan kewajiban-kewajiban coding.
setuju, puts(“test”); tetap jadi favorit 😀
@Pak Waskita:
Debugging hanya salah satu concern yang biasanya tersebar di banyak kelas. Masih banyak yang lainnya, yang -menurut para programmer– ternyata akan lebih mudah dikelola kalau dilokasisir sebagai aspect.
@Petra:
Ya, cara itu memang favorit ya…
Tapi, saya harap, tidak sembarang menulis puts(..). Pastikan cara debug kita makin pintar. Sempat dibahas di sini.
Tapi kalau tanpa AOP, nampak sulit untuk mengimplementasikan Transaksi atau Logging ya.. Soalnya aspect-aspect tersebut “memotong-motong” program secara horizontal. Hehe..
IMHO, logging yang ternyaman rasanya masih pakai Logger.. Bisa ada level-levelnya, seperti .debug(), .info(), atau .error().. =)
Ya Arie, aspect memang disebut sebagai construct yang membagi persoalan secara horisontal, sedangkan class membagi secara vertikal. Thx for sharing…
Mo tanyan kalo paka Annotation @Aspect so filenya bukan XXX.ap tap XXX.java, itu meng-instance object thisJoinPoint gmna yach????
@dicky:
Jika menggunakan annotation, potongan kode advice berikut:
before(Foo foo) : call(* org.aspectprogrammer..*(..)) && this(foo) {
System.out.println(“Call from Foo: ” + foo + ” at ”
+ thisJoinPoint);
}
Ditulis seperti ini:
@Before(“call(* org.aspectprogrammer..*(..)) && this(foo)”)
public void callFromFoo(JoinPoint thisJoinPoint, Foo foo) {
System.out.println(“Call from Foo: ” + foo + ” at ”
+ thisJoinPoint);
}
Menggunakan annotation untuk aspect bisa dilihat di sini:
http://www.eclipse.org/aspectj/doc/released/adk15notebook/ataspectj.html