m i.c o
dil
LG YE YÖNEL K PROGRAMLAMA VE ASPECTJ
va
(ASPECT OR ENTED PROGRAMMING AND ASPECTJ)
ww w. ja
Hikmet DÜZGÜN Hacettepe Üniversitesi Bilgisayar Mühendisli.i Bölümü
1
1. G R 3
m
Ç NDEK LER
………………………………………………………………………………….. 3
i.c o
2. AOP MANTI7INA G R 3 VE TEMEL KAVRAMLAR……………………………….. 4
3. BIRLESME NOKTALARI (JOIN POINTS) VE BIRLESIM NOKTA KÜMELER (POINTCUTS) ……………………………………………………………………………… 5 4. DOKUMA (WEAVING) …………………………………………………………………... 6 5. ASPECTJ …………………………………………………………………………………… 6 5.1. ASPECTJ HAKKINDA ……………………………………………………………… 6 5.1.1. DINAMIK BIRLESME NOKTASI MODELI (DYNAMIC JOIN POINT
dil
MODEL) ………………………………………………………………………… 8 5.1.2. BIRLESIM NOKTA KÜMELERI (POINTCUTS) …………………………… 8 5.1.3. TAVS YE-YORDAM (ADVICE) …………………………………………… ...10 5.1.4. DAH L -TÜR TANIMLARI (INTER-TYPE DECLARATIONS) …………...11 5.1.5. LG LER (ASPECTS) …………………………………………………………...12
va
5.2. GELISTIRME PLATFORMU (UYGULAMALI TANITIM) ……………………..13 6. AOP VE DIGER PROGRAMLAMA MODELLERI ……………………………………26 7. AOP PROBLEMLERI ……………………………………………………………………..26
ww w. ja
8. KAYNAKÇA ……………………………………………………………………………….27
2
m
GR 3
Bu belgede, AOP mant na basit bir giri yap lacak, bir JAVA gerçekle tirimi olan AspectJ ve uygulamas na yönelik özet bilgi verilecektir.
i.c o
AOP, geleneksel programlama dillerinin kar la t klar özel sorunlara (crosscutting concerns – belge içerisinde ayr nt l bir ekilde de inilecek ) kolay çözümler getirememeleri nedeniyle ortaya ç km t r. AOP geçmi i tüm dünyada çok eskilere kadar dayanmas na ra men çok fazla ilgi görmemesi nedeniyle yava bir geli me göstermi ve çok fazla kullan m olmam t r. Her bilgisayar mühendisi ya da programc s n n gelecekte ö renmek için takvimine koydu u ama biço unun zaman ay rmad ya da ay ramad bir gerçektir. Yine de her geçen gün, gerçekle tirilen uygulamalar n büyümesi dolay s yla bu tür sorunlarla daha fazla kar la lmas nedeniyle önemi, dolay s yla da kullan m artmaktad r. En fazla AOP’ye ilgi uygulama sunucular alan nda olmakta, hatta JBoss 4.0 uygulama sunucusunda a rl kl olarak AOP kullan lm t r.
ww w. ja
va
dil
AspectJ, AOP mant n ta yan bir JAVA gerçekle tirimidir. Eclipse projesi kapsam nda yürütülen projelerden biridir ve gerekli bir tak m eklemelerin yap lmas yla Eclipse platformu üzerinde kodlan p çal t r labilir. Crosscutting sorunlara etkili çözümler getirmesi, debugging imkan vermesi ve JAVA deste i gibi durumlar sayesinde di er AOP gerçekle tirimlerine göre daha yayg n bir kullan m olmu tur. Bu nedenle en bilinen AOP gerçekle tirimidir. Bu dökümanda, AspectJ’ye k sa bir giri yap lacak, basit örnekler üzerinden ilgili kavram ve yap lar anlat lacak, Eclipse platformu üzerinde küçük bir kodun yaz l p çal t r lmas ekran görüntüleriyle anlat larak geli tirme platformu hakk nda bilgi verilecek, en son da AspectJ’nin kar la t problemlere de inilecektir.
3
m
AOP MANTIGINA GIRIS VE TEMEL KAVRAMLAR
i.c o
Aspect-oriented programming(AOP) di er bir ad yla aspect-oriented software development(AOSD), bir program mümkün oldu unca farkl özellikler gösteren parçalara bölmeyi hedefleyen bir yakla md r. Türkçeye "ilgiye yönelik programlama, ba lam yönelimli programlama ya da kesit yönelimli programlama" diye de çevrilebilir fakat anlat m kolayl aç s ndan metin içerisinde AOP olarak yer alacakt r. AOP, daha çok modulasyon ve sarma(encapsulation-ayr nt y kullan c dan basit bir arayüz ile saklama) konular üzerinde durur.
Nesneye yönelik programlama da sarma(encapsulation) üzerinde odaklanmas na ra men kimi durumlarda(crosscutting concerns) yeterli olmamaktad r. Loglama(log olu turma) bu tür durumlara örnek olarak verilebilir çünkü; loglama stratejisi sistemdeki loglanm her bir parçay etkiler. Bu nedenledir ki loglama, tüm loglanm s n f, yordam ve prosedürü enine keser yani program içerisinde birçok kez ayn i levi yapmak maksad yla tekrarlan r.
dil
AOP uygulamas bu tür durumlar n üstesinden gelmek üzere aspect(ilgi) diye adland r lan bir yap tan mlar. =lgi, ilgi(aspect) yap da bulunmayan kod(base code) davran lar üzerinde de i iklik yapabilir. Bunu da birle me noktalar (join points) üzerinde ek davran lar belirleme yoluyla gerçekle tirir. Cross-cutting concerns di er bir deyi le aspect (ilgi), program içersinde defalarca tekrar eden birbirinden ba ms z modüllerce varolan program parçac klar olarak da görülebilir. Örne in, bir hesaptan ba ka bir hesaba para transferi yapacak basit bir yordama sahip bir banka uygulamas dü ünelim :
hesaptan.dus(miktar); hesaba.yatir(miktar); }
va
void transfer(Hesap hesaptan, Hesap hesaba, int miktar) { if (hesaptan.getBakiye() < miktar) { throw new YetersizBakiyeException(); }
ww w. ja
Fakat bu tarz bir uygulaman n gerçek hayatta yukar daki kadar kolay bir yordamla yap lamayaca aç kt r. Öncelikle hesap sahip sahibinin böyle bir i levi yerine getirmek için yetkisinin olup olmad n n kontrol edilmesi, i lem an nda do abilicek herhangi bir sorun nedeniyle sistemde kar kl k ya amamak maksad yla i lemin database transaction aras na al nmas ve loglanmas gerekir. Bütün bu kayg lar (concerns) ta yan basit bir uygulama a a daki gibi dü ünülebilir :
void transfer(Hesap hesaptan, Hesap hesaba, int miktar) { if (!getKullan c ().gerçekle tirebilir(!"_TRANSFER)) { throw new GüvenlikException(); } if (hesaptan.getBalance() < amount) { throw new YetersizBakiyeException(); } Transaction tx = database.newTransaction(); try { hesaptan.dus(miktar); hesaba.yatir(miktar); tx.üstlen(); systemLog.log! lem(!"_TRANSFER, hesaptan, hesabat, miktar); }catch(Exception e) { tx.geriSar(); }}
4
m
Böylelikle kod ilk görünümünden dolay s yla da basit ve anla l r halinden fazlas yla uzakla m olur. Birçok yeni durum (concern) koda gömülmek durumunda kal r. Bu da yordam n üstlenmesi gereken as l i ten yani fonksiyonundan görünürde uzakla mas na neden olur. Bu nedenle, database transactions, güvenlik ve loglama i lemleri yapt klar bu etkiler nedeniyle cross-cutting concerns’e örnek olarak verilebilirler.
i.c o
Diyelim ki sistemin güvenlik yönetiminde de i iklik yap lmas gerekiyor. Bu durumda güvenli in ele al nd tüm kod parçac klar n n yeni duruma göre uyarlanmas gerekir. Tüm sisteme yay lm bir durum üzerinde günleme yap lmas n n yüksek bir maliyete sahip oldu u gözden kaçamayacak derecede belirgindir.
Anla laca üzere, ilgilerin (cross-cutting concerns) ele al n sistem temelinde yer ald dü ünülen durumlar n ele al n kadar kolay degildir. Bu nedenledir ki AOP, bu tür ilgilerin çözümüne ili kin birbirinden ba ms z, aspect (ilgi) olarak adland r lan yap lar tan mlar. Neredeyse tüm AOP dillerinde, bir aspect di er programlama dillerinde yer alan yordam benzeri bir yap ya sahip advice (tavsiyeyordam)’lar ve bu tavsiyeyordamlar n dokuyaca (weave) bir dizi join points (birle me noktalar )içerir.
dil
BIRLESME NOKTALARI(JOIN POINTS) VE BIRLESIM NOKTA KÜMELERI(POINTCUTS)
va
Temelde, bir ilginin ana (base) kodla etkile imi Join Point Model (JPM – Birle me Noktas Modeli) olarak tan mlan r. Bir JPM üç ey tan mlar: - Ilgi nerelerde uygulan r. Buralar genelde join points (birle im noktalar ) olarak bilinir. - Çoklu birle im noktalar n belirlemek için bir yol. Pointcuts (birle im nokta kümeleri) olarak da bilinir. Birle im nokta kümeleri, sistemdeki tüm birle im noktalar ndan bir alt kümeyi seçmek maksad yla yap lan sorgular olarak da dü ünülebilir. - Birle im noktalar üzerinde bir tür davran a etki yöntemi. AspectJ dilinde advice (tavsiyeyordam) olarak da bilinir.
ww w. ja
AspectJ programlama dilindeki JPM kapman nda dü ünülen birle im noktalar , bir program n çal mas sürecinde oldukça iyi tan mlanm noktalard r. Bunlar: method çal mas (method execution), bir nesneye de er atama (instantiation of an object) ve ayk r durum f rlatma ( throwing an exception). Görülece i üzere, belirtilen birle im noktalar ancak program çal mas esnas nda farkedilebilecek durumlard r. Bu nedenle AspectJ programlama dilinde, birle im noktalar kümesi ve önerimethod (advice) JPM dynamic join point model (dinamik birle im noktas modeli) olarak da bilinir. Birle me noktalar kümesi program üzerinde yap lan bir sorgu sonucu belirlenir. Örnek bir birle im nokta kümesi a a da gösterilmi tir: pointcut set() : execution(* *.set*(..) ) && this(Nokta);
Nokta tipinde bir nesne çal ma a amas nda (execute) ise, “set” ile ba layan çal ma (execution) durumunda olan tüm yordamlar bu birle im nokta kümesinde belirlenir.
Advice (tavsiyeyordam)’lar JAVA programlama dilindeki yordamlara benzer bir ekilde belirlenirler, fakat onlar gibi d ar dan (explicitly) ça r lamazlar. Ancak, kendilerine ili tirilen birle im nokta kümesi do ru (true) döndü ü taktirde kendili inden ça r l rlar (implicitly). Örne in;
after() : set() { Görüntüle.güncelle(); }
Yukaridaki koda göre, ancak set() birle im nokta kümesi true olduktan sonra tavsiye-yordam gövdesi i letilir.
5
i.c o
aspect MisafirKabul { Nokta.misafirKabulEt(Misafir m) { m.ziyaretEt(this); } }
m
AspectJ’de kullan lan bir di er JPM de inter-type declarions (dahili-tür tan mlar ) d r. Bu mekanizma, bir ilginin herhangi bir s n fa ya da nesneye ekstra tan mlar katmas n sa lar. Bu kavram aç k s n f olarak da bilinir. Örnek bir dahili-tür tan m a a daki gibidir :
Bu kod parçac , Nokta s n f na misafirKabulEt yordam n ekler. • Birle me noktalar n n hepsi non-anonymous türdendir. • Birle im nokta kümeleri s n f ya da arayüz (interface) adlar d r. • Gövde tan mlar n n türe eklenmesiyle birle im nokta kümelerine etki edilebilir. DOKUMA(WEAVING)
dil
Dokuma, tavsiyeyordam belirtilen birle me noktalar na uygulama olarak dü ünülebilir. Orjinal AOP tan m nda, Kiczales ve tak m dokuma için a a daki ihtimalleri s ralam lard r :
va
• Bir kaynak ön i lemci (preprocessor) • =kil kütükleri (binary files) yamayacak bir son i lemci (post processor) • Dokunmu ikil kütükleri tan yan bir AOP derleyici • Yükleme zaman dokuma ( örne in, JAVA’ya göre, ilgili tavsiyeyordam n JAVA’da s n flar n JVM’e yüklendi i gibi dokunmas ) • Çal ma zaman dokuma ( çal ma zaman nda her bir birle me noktas n n yakalanmas ve ilgili tavsiyeyordam n çal t r lmas ) =lk iki seçenek geli tirme i lemini zorla t r rken son ikisi de program n çal mas n yava lat r. Ayr ca son seçenek, aspect (ilgi)tan yan bir çal ma ortam na (JVM gibi) ihtiyaç duyar.
ww w. ja
Son seçenek d nda tan mlanan tüm seçenekler kod üzerinden herhangi bir noktada de i ikli e yol açarlar. Yükleme zaman dokuman n ard ndan derlenmi JAVA ikil kütükleri içerisinde dokunmu tavsiyeyordam parçac klar bulunur. Birçok programc bunu AOP’nin bir sak ncas olarak görür. Ba ka bir yöntem ise varolan kod üzerinde herhangi bir de i iklik yapmak yerine, s n flara ek alt s n flar yaratma yani deploy-time weaving (yerle tirme zaman dokuma)’dir. Bu yöntemle varolan s n flara ait yordamlar yarat lan alt s n flarca override edilir. Bu ekilde önceki kod de i meden kald ndan hata ay klay c (debugger) vb. araçlar kullan lmaya devam edilir. ASPECTJ
AspectJ HakkDnda
AspectJ, kullan m oldukça kolay, JAVA platform uyumlu bir AOP JAVA gerçekle tirimidir. Crosscutting sorunlar için kolay bir modülarizasyon imkan sunmakla birlikte, hata kontrolü ve ele al n , senkronizasyon, performans iyile tirmeleri, loglama ve hata ay klama gibi durumlarda da oldukça iddial d r.
AspectJ gerçekle tiriminin kolay anlat m n sa lamak üzere bir örnek üzerinden gitmenin daha mant kl olaca inanc nday m. Bu maksatla, AspectJ gerçekle tirim özelliklerini vermek üzere bir Kekil Düzenleme Sistemi kullan lacakt r.
6
Sekil <>
1
n
+ataXY() +ciz()
+yaratNokta() +yaratDogru() Dogru -n1: Nokta -n2: Nokta
dil
Nokta -x: int -y: int
i.c o
SekilEleman
Görüntüle
m
Bir Eekil bir veya daha fazla nokta ya da do.rudan olu ur. Kekil s n f factory hizmetini sa layacak ekilde düzenlenmi tir. Bu sistem için UML gösterimi a a daki gibidir.
SekilDuzenleme örne i için UML gösterimi
ww w. ja
va
AOP olu mas ndaki ana neden, geleneksel programlamlama dillerinde kimi sorunlar n (concerns) kolayl kla ele al namay ya da modüle edilememisidir. Örne in bir program içerisinde ele al nmas gereken güvenlik k s tlar n dü ündü ümüzde, zamanla bu k s tlar n de i ebilece i, geni letilebilece i ya da program n farkl kesimlerinde de kullan m ihtiyac do uraca görülebilir. Fakat, güvenlik k s tlar n nesneye yönelik programlama dilleri gibi geleneksel programlama dillerinde birim modüller (nesneye yönelik programlamada sDnDf) haline getirmenin mümkün olmamas nedeniyle program n ihtiyaç duyulan her yerinde bu k s tlar n tan mlanmas gerekir. Bu nedenle güvenlik, loglama gibi durumlar n geleneksel programlama dillerinde kontrolü oldukça zor olmakla birlikte hataya da fazlas yla aç kt r. Güvenlik gibi sorunlar n nesneye yönelik programlamada sDnDflar gibi modüle edilememesinin ba l ca nedeni sistematik bir ekilde tan mlanamamalar ile program boyunca yay lm olmalar ve de di er s n flar enine kesmeleridir (cross-cut). Bu yüzden sDnDflar gibi tekrar kullan lamazlar(resuable) ve kal t lamazlar(inheritance). K sacas , bu tür sorunlar n geleneksel programlama dillerince ele al nmalar programlar için oldukça büyük bir yüktür. AOP, nesneye yönelik programlaman n genel sorunlar modüle etti i yönteme(sDnDflar) benzer bir ekilde ilgileri (cross-cutting concerns) modüle etmeye olanak veren bir programlama mant d r. AspectJ de AOP mant n gerçekle tiren bir JAVA gerçekle tirimidir. AspectJ’nin javaya katt tek kavram birle me noktas (join point) kavram d r. Bunun d nda birle im nokta kümeleri(pointcuts), tavsiyeyordam(advice), dahili-tür tan mlar (inter-type declarations) ve ilgi(aspect) gibi yap lar da JAVA ya dahil etmi tir. Birle im nokta kümeleri ve tavsiyeyordamlar program i leyi ini dinamik olarak etkilerken dahili-tür tan mlar statik olarak s n f hiyerar isine etkide bulunurlar. lgiler ise bu yap lar sarmalamak (encapsulate) maksad yla kullan l rlar. Bir birleEme noktasD program ak boyunca iyi tan mlanm (well-defined) bir noktad r. BirleEim nokta kümesi ise birle im noktalar ndan seçmeler yaparak olu turulmu bir kümeyi ifade eder. Tavsiyeyordam, herhangi bir birle me noktas na gelindi inde çal t r lan kod parçac d r. Bunlar AspectJ nin dinamik kesimlerini olu turur.
7
m
Ayr ca AspectJ, program n statik yap s üzerinde(daha çok s n flara ait de i kenler ve yordamlar ile s n flar aras ili kiler konu edilir) de i iklik yapabilecek birçok farkl dahili-tür tan m içerir.
i.c o
AspectJ’de ilgiler ise JAVA’daki s n f tan mlar gibi AspectJ için birim modüller olarak dü ünülür. Bu modüller ilgilerin(cross-cutting concerns) modüle edilmesi maksad yla yarat lm lard r, fakat s n flardan farkl olarak birle me noktalar , birle im nokta kümeleri ve dahili-tür tan mlar da içerebilirler.
Birazdan anlataca m kesimde ilkin birle me noktalar na ard ndan bu noktalardan bir ya da birkaç n n biraraya gelerek olu turdu u birle im nokta kümelerine, bu nokta kümelerine rastland durumlarda çal t r lan kod parçac klar olan tavsiyeyordamlara göz ataca z. Daha sonra birle im nokta kümeleriyle tavsiyeyordamlar n ilgi olu turmak üzere nas l bir araya geldi ini inceleyece iz. En son olarak da tan mlar n program n statik yap s içinde yer alan s n flar içindeki ilgileri (cross-cutting concerns) ele ald na de inece iz. Dinamik BirleEme Noktasi Modeli(Dynamic Join Point Model)
va
dil
Birle me noktas modeli (JPM), AOP deki kritik elemanlardan biridir. JPM, crosscutting sorunlar n dinamik yap s n n tan mlanmas n mümkün k lan bir referans çerçeve sa lar. Bu k s mda, bir program çal mas esnas nda belirgin olarak tan mlanm dinamik birle me noktalar ndan bahsedilecektir. AspectJ’de kullan labilecek birle me noktalar : Yordam ça r ld nda Yordam çal rken Yap mc tetiklendi inde Yap mc çal rken Aspect kodu çal rken Nesne yap land r l rken S n f de i kenine eri ilirken S n f de i kenine atama yap l rken
ww w. ja
AspectJ, birçok birle me noktas tan m içerirken burada sadece yordam-ça r ml birle me noktas (method call join point) üzerinde durulacakt r. Yordam-ça r ml birle me noktas , herhangi bir yordam taraf ndan ça r lm bir nesnenin hareketlerini oldu u gibi sarmalar. Bu hareketlere, bir yordam ça r m na ait argümanlar n al n p yordamdan dönü yap lana dek sahip oldu u tüm hareketler dahildir. Çal ma zaman ndaki tüm yordam ça r mlar n n her biri, ayn yordama ait ça r m olsa bile ayr bir birle im noktas olarak ele al n r. Bir yordam ça r ml birle me noktas çal rken, o s rada birden fazla birle me noktas ( yordam içerisinde olu mu ya da yordam gövdesinde ba ka bir yordam-ça r m sayesinde meydana gelmi ) çal yor olabilir. Bu durumda, arka planda çal an birle me noktalar na orjinal yordamça r ml birle me noktas n n dinamik ba lam n(dynamic context) da çal yor denir.
BirleEim Nokta Kümeleri ( Pointcuts )
AspectJ’de birle im nokta kümeleri, program ak olu turulmu kümelerdir. Örne in ;
boyunca belli birle me noktalar n n seçilmesi yoluyla
call(void Nokta.ataX(int))
yukaridaki birle im nokta kümesi, void Nokta.ataX(int) prototipinde( Nokta s n f na ait ataX (int) yordam ) olan tüm yordam-ça r m birle me noktalar n seçer.
Bir birle im nokta kümesi, ba ka birle im nokta kümelerinin ve( & ), veya( || ), de.il ( ! ) durumlar yla ba lanmas yoluyla da olu turulabilir. Örne in ;
call(void Nokta.ataX(int)) ||
8
m
call(void Nokta.ataY(int))
yukar daki örnekte, Nokta.ataX(int) veya Nokta.ataY(int))ye olan her bir yordam-ça r ml birle me noktas seçilir.
call(void call(void call(void call(void call(void
i.c o
Birle im nokta kümeleri, farkl türdeki birle me noktalar n da tan yabilirler. Örne in;
SekilEleman.ataXY(int,int)) Nokta.ataX(int)) Nokta.ataY(int)) Dogru.ataN1(Nokta)) Dogru.ataN2(Nokta));
|| || || ||
: SekilEleman.ataXY(int,int)) Nokta.ataX(int)) Nokta.ataY(int)) Dogru.ataN1(Nokta)) Dogru.ataN2(Nokta));
va
pointcut tasi() call(void call(void call(void call(void call(void
dil
yukar daki kod kesimi ile 5 yordam ça r m ndan herhangi birine yap lan ça r m olan birle me noktalar n n her biri seçilir. Tan mlad m z örnek sisteme göre yukar daki kod kesimi ile bir SekilElement hareketi gerçekle ti inde tüm birle me noktalar n yakalan r (capture). Bu crosscutting sorunlar n tespiti aç s ndan güzel bir yol olmas na ra men kullan m ve kontrolü zordur. Bu durumu a mak için AspectJ, programc lar n birle im nokta kümelerine istedikleri ismi vermelerine imkan tan r. Örne in a a daki kod ile isimlendirilmi bir birle im nokta kümesi olu turulur : || || || ||
Bu tan m n görünür (visible) oldu u bir an programc n n bahsedilen karma k birle im kümesini yakalamak için tasi() kullanmas yeterlidir.
ww w. ja
Yukar daki tüm örneklerde, yordamlara ait tam yap verilerek birle im nokta kümelerinin olu umu sa lanm t r. Bu yöntem isim-bazl enine kesim (name-based crosscutting) olarak da bilinir. AspectJ programc lara, yordam n tam bir prototipini belirtmeleri yerine sadece yordama ili kin belli bir özelli i belli birtak m özel simgeler(wildcards) kullanarak ifade etmelerine olanak verir. Buna özellik-bazl enine kesim (property-based crosscutting) de denir. Örne in, birle im nokta kümesi call(void Sekil.yarat*(..))
Sekil s n f na ait void geri dönü tipine sahip ad yarat ile ba layan, ald parametrelerden ba ms z tüm yordam ça r mlar n seçer. Bu tan m ile, örnek sistemimiz içindeki yaratNokta ve yaratDogru factory yordamlar seçilir. Birle im nokta kümesi call(public * Sekil.* (..))
Sekil s n f n n public türde olan her bir yordam na yap lan yordam ça r mlar n seçer.
AspectJ de kullan labilecek tek özellik (property) özel simgeler (wildcards) de ildir. Di er bir birle im nokta kümesi, cflow, di er birle me noktalar n n dinamik ba lam nda (dynamic context) ortaya ç kan birle me noktalar n belirtir. Bu sayede, cflow(tasi())
9
m
tasi() ile seçilen birle me noktalar n n dinamik ba lam nda ortaya ç kan birle me noktalar n seçer. Yani, bu birle im nokta kümesi, tasi yordam n n ça r lmas ndan bitimine kadar ki süreçte ortaya ç kan her bir birle me noktas n seçer.
i.c o
Tavsiyeyordam ( Advice )
Yukar da belirtildi i üzere birle im nokta kümeleri, bir dizi birle me noktas n seçmek için kullan l r ama bu noktalar üzerinde ne gibi i lemler yap laca na ya da bu noktalar n ne ekilde kullan laca na dair bir bilgi içermezler. AspectJ’de bu görev tavsiyeyordam (advice)’lara verilmi tir. AspectJ’de bir çok tavsiyeyordam yer al r. Bunlardan before, bir birle me noktas n n i letimine geçilmeden önce ele al nmas istenen durumlar n tan mland tavsiyeyordam’d r. Örne in, bir yordam-ça r ml birle me noktas üzerinde tan ml tavsiyeyordam gerçek yordam i letime al nmadan hemen önce (gerçek yordama ait parametre geçi inin hemen ard ndan) i letilir. nmadan hemen önce”);
dil
before() : tasi() { System.out.println(“ta }
va
After tavsiyeyordam ise program n, birle me noktas n i letmesinin hemen ard ndan i letilir. Örne in, bir yordam-ça r ml birle me noktas yla tan mlanm bir tavsiyeyordam, yordam n i letiminin ard ndan kontrol ça ran yordama geçmeden hemen önce i letilir. Java programlar bir birle me noktas ndan normal olarak ya da ayk r durum f rlatarak ç kabileceklerinden AspectJ’de üç tip after tavsiyeyordam bulunur. Bunlar : after returning, after throwing, after(normal sonlanma ya da ayk r durum olu umundan herhangi birinden sonra). after () returning : tasi () { System.out.println(« ba ar l }
bir ta
man n ard ndan ») ;
BirleEim Nokta Kümelerinde çerik Gösterimi (Context Exposing)
ww w. ja
Birle im nokta kümeleri, birle me noktalar n seçmek d nda birle me noktalar ndaki i letim içeri ini (execution context) de gösterebilirler. Birle im nokta kümeleri taraf ndan ortaya ç kar lan (gösterilen) de erler, tavsiyeyordam tan mlar nda kullan labilirler.
Bir tavsiyeyordam tan m , Java’daki yordamlarda oldu u gibi bir parametre listesine sahiptir. Bu parametreler, tavsiyeyordam taraf ndan kullan lacak içerik parçalar na isim vererek gövde k sm nda kullan labilecek ekilde tan mlanm t r. Örne in a a daki ;
after (SekilEleman se, int x, int y) returning : …BaziBirlesimNoktaKumeleri…{ …BaziGövdeTanimlari… }
tavsiyeyordam, se ad nda bir SekilEleman ile x ve y ad nda iki int türünde parametre olmak üzere toplam üç parça exposed context içerir. Tavsiyeyordam gövdesi, aynen Java’daki yordamlarda oldu u gibi parametre kullan m na sahip oldu u için tavsiye yordam a a daki ekli alabilir : after (SekilEleman se, int x, int y) returning : …BaziBirlesimNoktaKumeleri…{ System.out.println(se + « belirtilen noktalara ta + », « + y + ») ») ; }
nd
(« + x
10
m
Tavsiyeyordama ait birle im nokta kümesi, argümanlara ait de erleri ne retmek (göstermek - publish) için kullan l r. Üç ilkel birle im nokta kümesi bu argümanlara ait de erleri göstermek için kullan labilir : this, target, args. Bu durumda tavsiyeyordam n alaca ekil a a daki gibi olacakt r.
i.c o
after (SekilEleman se, int x, int y) returning : call(void SekilEleman.ataXY(int, int)) && target(se) && args(x,y){ System.out.println(se + « belirtilen noktalara ta + », « + y + ») ») ; }
nd
(« + x
Tavsiyeyordam ataXY yordam ndan üç de er ç kar r : hedef SekilEleman (se) ve iki int de er x, y. Bunlardan se after tavsiyeyordam n n ilk argüman olurken x ile y son iki arguman olur. Bu durumda, yukar daki tavsiyeyordam, her ataXY yordam n n i letiminin ard ndan SekilEleman se ve yeni x, y koordinatlar n ekrana basar.
dil
Bir isimlendirilmi birle im nokta kümesi, tavsiyeyordam parças gibi bir parametre listesine sahip olabilir. Yukar daki tavsiyeyordam bu durumda a a da gösterildi i gibi de yaz labilir : Pointcut ataXY(SekilEleman se, int x, int y): call(void SekilEleman.ataXY(int, int)) && target(se) && args(x,y) ;
Dahili-tür TanDmlarD
va
after (SekilEleman se, int x, int y) returning : ataXY(se,x,y) { System.out.println(se + « belirtilen noktalara ta nd (« + x + », « + y + ») ») ; }
ww w. ja
Dahili tür tan mlar , s n flar ve s n f hiyerar ilerini enine kesen tan mlard r. Birden fazla s n f enine kesen s n f özelli i tan mlayabilir ya da s n flar aras kal t m ili kisi üzerinde de i iklik yapabilir. Tavsiyemetodlardan farkl olarak dinamik de il de statik olarak i lev görürler. Haz r bir s n f hiyerar isine sahip bir programa, birçok s n f taraf ndan payla lacak yeni bir yetenek (capability) eklememiz gerekti ini dü ünelim. (Örne in, bu s n flar bir ata s n ftan türetilmi olsunlar) Bu durumda Java bir Interface (=Arayüz) tan mlay p bu yetene e ait yordam ya da yordamlar bu arayüzün içine gömme yoluyla geni lemeyi sa lar. Böylece bu yeni yetene e sahip olacak s n flar bu arayüzü implement edecek yordamlarla geni letilirler.
AspectJ, bu sorunu sadece tek bir yap olu turarak, varolan s n flar üzerinde herhangi bir de i ikli e gitmeden, halledebilir. Yeni yetene in eklenebilmesi için gereken yordam ve alanlar tan mlay p bunlar varolan s n flar ile ili kilendirir.
Daha önceden varolan bir s n f olan Nokta s n f na ait nesneleri üzerindeki de i imleri gözlemek üzere gözlemci rolüne sahip Ekran nesnelerine sahip olmak istedi imizi varsayal m. Nokta nesneleri üzerindeki de i imleri gözleyen Ekran nesnelerinin izini tutan gozlemciler ad nda Nesne s n f na ait bir alan aspect (ilgi) yazarak kodlayabiliriz. aspect NoktaGozlem { private Vector Nokta.gozlemciler = new Vector() ; ……… }
11
m
gozlemciler alan private oldu undan sadece NoktaGozlem’den eri ilebilir. Bu nedenle, gözlemciler ancak static yordamlar gozlemciEkle, gozlemciCikar yordamlar n n aspect (ilgi)’e eklenmesi yoluyla eklenip ç kar labilirler.
i.c o
aspect NoktaGozlem { private Vector Nokta.gozlemciler = new Vector() ; public static void gozlemciEkle ( Nokta n, Ekran e) { n.gozlemciler.add(e) ; } Public static void gozlemciCikar ( Nokta n, Ekran e) { n.gozlemciler.remove(e) ; } ……… }
dil
Bunlar n ard ndan, neyi izlemek istedi imize dair degisiklikler ad nda bir birle im nokta kümesi tan mlayabiliriz. after tavsiye-yordam ise bir de i iklik meydana geldi inde ne yapaca m z tan mlamak için kullan labilir.
va
aspect NoktaGozlem { private Vector Nokta.gozlemciler = new Vector() ; public static void gozlemciEkle ( Nokta n, Ekran e) { n.gozlemciler.add(e) ; } Public static void gozlemciCikar ( Nokta n, Ekran e) { n.gozlemciler.remove(e) ; } pointcut degisiklikler(Nokta n) : target(n) && call(void Nokta.ata*.(int)) ;
ww w. ja
after(Nokta n) : degisiklikler(n) { Iterator iter = n.gozlemciler.iterator() ; While(iter.hasNext()) { gozlemciGoruntule(n, (Ekran) iter.next()) ; } static void gozlemciGoruntule(Nokta n, Ekran e) { e.goruntule(n) ; }
}
Görüldü ü üzere, bu yeni yetene in programa kat lmas esnas nda ne Nokta s n f ne de Ekran s n f kodlar nda herhangi bir de i ikli e gerek duyulmad . Aspects ( lgiler)
=lgiler, birle me noktalar, birle im nokta kümeleri ve dahili-tür tan mlar n bir modül olarak sarmalayan, Java’daki s n f vari bir yap d r. S n flar gibi yordamlar, alanlar ve ilk de er atay c lar (initializers) içerebilir. Aspect’lere de s n flar gibi ilk de er atanabilir fakat bunun nas l yap laca kontrol alt ndad r ve bu nedenle Java’n n new format ile aspect nesneleri (instance) yarat lamaz. Her bir aspect asl nda bir Singleton’dur ve sadece bir nesne yarat l r. Bu nedenle tavsiye-yordam aspect’in non-static alanlar n kullanabilir.
12
nmak üzere ») ;
i.c o
}
before() : tasi() { logStream.println(« ta }
m
aspect Loglama { OutputStream logStream = System.err ;
GELISTIRME PLATFORMU (UYGULAMALI TANITIM)
ww w. ja
va
dil
Aspectj günümüzde Eclipse projelerinden biri olarak geli tirilmeye devam etti inden geli tirme platformu olarak Eclipse anlat lacakt r. Eclipse üzerinde uygulama geli tirmek için öncelikle http://www.eclipse.org/aspectj/ adresinden aspectj-xxx.jar çal t r labilir kütü ü indirilerek çal t r lmal d r. Bu dosya çal t r labilir bir GUI arayüzüne sahip oldu undan yüklemesi oldukça kolayd r. Program kurulumuna ait bir ekran görüntüsü a a dad r.
Kurulumun tamamlanmas n n ard ndan, kurulum dizini/lib (Örne in ; C:\aspectj1.2\lib)’in alt nda yer alan aspectjrt.jar kütü ü classpath’e eklenmelidir. Bu kütük yaz lan s n f ve aspect’lerin ajc derleyicisi taraf ndan derlenmesi ve ajc taraf ndan derlenmi kütüklerin çal t r lmas için gerekli olan s n flar içerir. aspectjrt.jar kütü ünü classpath’e eklemek için kullan labilecek yollardan en uygunu bu kütü ü jdk/jre/lib/ext dizininin alt na kopyalamakt r. Kurulum ve program geli tirimine ait dökümantasyona (i.e.api, userguide) yine AspectJ kurulum dizini alt nda yer alan /doc dizini arac l yla eri ilebilir. Ayr ca, kurulum dizini alt nda birçok örnek uygulama program da yer ald arac l yla program geli tirimi kolayla t r labilir.
ndan bunlar n incelenmesi
13
m
Yukar da belirtilen i lemlerin tamanlanmas n n ard ndan Eclipse’de kod yaz l p çal t r labilecektir. Bu anlamda örnek bir uygulama (Aspect (ilgi) kullan larak yordam takibi) ileride ekran görüntüleriyle desteklenerek anlat lacakt r. lgi KullanDlarak Yordam Takibi
i.c o
Takip (tracing) özelli ine sahip bir s n f yazmak oldukça kolayd r : birkaç fonksiyon, izlemeyi aç p kapatacak bir boolean i aret, output stream için bir seçenek ve belki de output format n ayarlamak için program n öngördü ü bir kod kesimi. Bunlar takip s n flar n n sahip olmas gereken temel özelliklerdir. Yaln z program gereksinimleri göz önüne al nd nda, takip oldukça karma k bir yap ya da bürünebilir.
dil
Asl nda takip geli tirimi i in kolay yan n olu turur. Takip s n flar için as l problem yaratan kesim program içinden uygun zamanlarda takip için etkile ime geçmektir. Bu maksatla yap lan yordam ça r mlar özellikle büyük sistemlerde oldukça bunalt c olabilmekle beraber sisteme a r yük olarak da negatif etki yapar ve çal ma h z n dü ürür. Bu nedenle, program sat a amas na geldi inde takip s n flar n n sistemden ç kar lma durumu olu ur. Bu durum göz önüne al nd nda program geli tiren ki ilerin, yordam gövdeleri i letilmeden önce ve i letildikten sonra takip ekleme ç karma yoluyla yordam ça r mlar yapan geçici (adhoc) scripting programlar kullanmalar oldukça do ald r. AspectJ, bahsedilen geçici scripting kullan mlar n n önüne geçecek ya da kullan mlar n azaltacak bir i lev sa lar. Takip tüm bir sistemi etkiledi i göz önüne al n rsa, sistem için bir cross-cutting concern olarak görülebilir, bu durumda bir aspect (ilgi) taraf ndan sarmalanarak sisteme dahil edilmesi olas d r. Örnek Uygulama :
va
Örnek uygulama olarak ilk a amada 4 s n ftan olu an basit bir 'ekil uygulamas verilecektir. Bu uygulama ata s n f olarak Sekil, bu s n ftan türeyen Kare ve Daire s n flar ile bu s n flara ait yordamlar n kullan ld main yordam na sahip OrnekMain s n f n içerecektir.
ww w. ja
Bu uygulaman n Eclipse platformu üzerinde geli tirimi ve çal t r lmas ad m ad m verilecektir. Öncelikle Takip adl bir AspectJ projesi açmakla i e ba l yoruz. Bunun için, File new Project yoluyla aç lan pencereden AspecjJ Project seçilir. Aç lan pencereye ait ekran görüntüsü a a daki gibidir.
14
m i.c o dil va ww w. ja
Project name alan doldurularak projeye bir isim verilir (örne imiz için proje ad Takip olacakt r) ve Finish’e bas larak proje olu turulur. Package Explorer’da Takip ba l alt nda proje görüntülenebilir. Takip projesi içinde takip ad nda bir package yarat l r. Bu i lem için File new Package yolu izlenebilir.
15
m
va
dil
i.c o
Bu i lemin ard ndan aç lacak pencere görünümü a a da verilmi tir.
Name alan na takip yaz ld ktan sonra Finish dü mesine bas larak Takip projesi içinde takip ad nda bir package olu turulur.
ww w. ja
Sekil ad ndaki ata s n f olu turmak için File new class seçene i kullan l r. S n flar ayn yöntemle yarat lacaklar için ekran görünümü sadece bu s n fta verilecektir.
16
m i.c o dil va ww w. ja
Package alan na takip, Name alan na Sekil yaz ld ktan sonra Finish dü mesine bas larak Sekil s n f yarat larak takip paketine eklenir. Sekil s n f n n yarat lmas n n ard ndan Eclipse’e ait ekran görüntüsü a a daki gibi olacakt r.
17
m i.c o dil va
Sekil s n f na ait kod kesimi a a dad r : package takip;
ww w. ja
/** * Sekil s n f bir abstrack s n f olup, 2 boyutlu fonksiyonlar içerir */ public abstract class Sekil { /** * "eklin merkezine ait x ve y koordinatlar */ protected double x, y;
ekillere ait genel
protected Sekil(double x, double y) { this.x = x; this.y = y; } /** * x koordinat n döner */ public double getX() { return x; }
/** * y koordinat n döner */ public double getY() { return y; }
18
i.c o
m
/** * Parametre olarak gelen ekille bu ekil aras ndaki mesafeyi döner */ public double distance(Sekil s) { double dx = Math.abs(s.getX() - x); double dy = Math.abs(s.getY() - y); return Math.sqrt(dx*dx + dy*dy); }
/** * "eklin çevresini döner. Alt s n flarda tan mlanmak zorundad r. */ public abstract double cevre();
dil
/** * "eklin alan n döner. Alt s n flarda tan mlanmak zorundad r. */ public abstract double alan();
va
/** * eklin string gösterimini döner -- basitçe x ve y koordinatlar n */ public String toString() { return (" @ (" + String.valueOf(x) + ", " + String.valueOf(y) + ") "); } }
Sekil s n f n n alt s n flar olan Kare ve Daire s n flar da ayn ekilde projeye dahil edilir. Projenin çal t r labilmesi için gerekli bir main () yordam içeren OrnekMain s n f n n da eklenmesiyle çal t r labilir bir Java application haz rlanm olur. Bu s n flara ait kod kesimleri a a da yer almaktad r.
ww w. ja
Kare s n f na ait kod kesimi : package takip;
/** * * Kare, Sekil s n f n kenar özelliTiyle implement eder. cevre ve alan yordamlar n karenin * çevre ve alan n doTru ekilde hesaplayacak ekilde kodlar. * */ public class Kare extends Sekil { protected double k; // kenar /* * Her türden constructor */ public Kare(double x, double y, double k) { super(x, y); this.k = k; } public Kare(double x, double y) { this(x, y, 1.0);
19
m
}
public Kare() { this(0.0, 0.0, 1.0); } /** * Karenin çevresini döner */ public double cevre() { return 4 * k; }
dil
/** * Karenin alan n döner */ public double alan() { return k*k; }
i.c o
public Kare(double k) { this(0.0, 0.0, k); }
va
/** * Bu yordam ata s n ftaki toString yordam n override eder. * Kare ile ilgili spesifik bilgi içerir. */ public String toString() { return ("Karenin kenar = " + String.valueOf(k) + super.toString()); } }
ww w. ja
Daire s n f na ait kod kesimi : package takip;
/** * * Daire, Sekil s n f n yar çap özelliTiyle implement eder. cevre ve alan yordamlar n karenin * çevre ve alan n doTru ekilde hesaplayacak ekilde kodlar. * */ public class Daire extends Sekil { protected double r; // yar çap --> radius /* * Yap c lar */ public Daire(double x, double y, double r) { super(x, y); this.r = r; } public Daire(double x, double y) { this(x, y, 1.0);
20
m
}
public Daire() { this(0.0, 0.0, 1.0); } /** * Dairenin çevresini döner */ public double cevre() { return 2 * Math.PI * r; }
dil
/** * Dairenin alan n döner */ public double alan() { return Math.PI * r*r; }
i.c o
public Daire(double r) { this(0.0, 0.0, r); }
va
/** * Bu yordam ata s n ftaki toString yordam n override eder. * Daire ile ilgili spesifik bilgi içerir. */ public String toString() { return ("Daire yar çap = " + String.valueOf(r) + super.toString()); } }
ww w. ja
OrnekMain s n f na ait kod kesimi : package takip;
/** * * "ekilleri test etmek için gereken main() yordam n * */ public class OrnekMain { public static void main(String[] args) { Daire d1 = new Daire(3.0, 3.0, 2.0); Daire d2 = new Daire(4.0);
içeren s n f
Kare k1 = new Kare(1.0, 2.0);
System.out.println("d1.cevre() = " + d1.cevre()); System.out.println("d1.alan() = " + d1.alan()); System.out.println("k1.cevre() = " + k1.cevre()); System.out.println("k1.alan() = " + k1.alan()); System.out.println("d2.mesafe(d1) = " + d2.mesafe(d1));
21
m
System.out.println("k1.mesafe(d1) = " + k1.mesafe(d1)); System.out.println("k1.toString(): " + k1.toString()); } }
i.c o
Tan mlanan s n flara ait yordamlar n do ru çal p çal mad n görmek maksad yla OrnekMain s n f çal t r l r. Projeyi çal t rmak için Run Run as aspectJ/Java application yolu izlenir ve a a daki ç kt elde edilir. d1.cevre() = 12.566370614359172 d1.alan() = 12.566370614359172 k1.cevre() = 4.0 k1.alan() = 1.0 d2.mesafe(d1) = 4.242640687119285 k1.mesafe(d1) = 2.23606797749979 k1.toString(): Karenin kenar = 1.0 @ (1.0, 2.0)
AspectsizTakip s n f na ait kod kesimi : package takip;
va
import java.io.PrintStream;
dil
Yukar da tan m verilen uygulamaya aspect kullanmadan takip mekanizmas eklemek istedi imizde a a da kod kesimi verilen AspectsizTakip s n f na benzer yap da bir s n f eklememiz gerekir.
ww w. ja
/** * * Bu s n f baz temel takip i levlerine ait mesajlar yazmay saTlar. * */ public class AspectsizTakip { /** * 3 takip seviyesi bulunur (TAKIPSEVIYESI deTerleri): * 0 - Hiçbir mesaj yaz lmaz * 1 - Takip mesajlar yaz l r, fakat girintili yaz m yoktur * 2 - Trace messages are printed, fakat girintili yaz m vard r */ public static int TAKIPSEVIYESI = 0; protected static PrintStream stream = null; protected static int cagirmaDerinligi = 0; /** * !lk deTer atama. */ public static void initStream(PrintStream s) { stream = s; }
/** * "giriyor" eklinde bir mesaj yazar. Takip edilmek istenen yordam n ba nda * çaTr lmas niyetlenmi tir. */ public static void takipGiris(String str) {
22
m
if (TAKIPSEVIYESI == 0) return; if (TAKIPSEVIYESI == 2) cagirmaDerinligi++; girisYazdir(str); }
i.c o
/** * "ç k yor" eklinde bir mesaj yazar. Takip edilmek istenen yordam n sonunda * çaTr lmas niyetlenmi tir. */ public static void takipCikis(String str) { if (TAKIPSEVIYESI == 0) return; cikisYazdir(str); if (TAKIPSEVIYESI == 2) cagirmaDerinligi--; }
dil
private static void girisYazdir(String str) { girintiBirak(); stream.println("--> " + str); } private static void cikisYazdir(String str) { girintiBirak(); stream.println("<-- " + str); }
}
va
private static void girintiBirak() { for (int i = 0; i < cagirmaDerinligi; i++) stream.print(" "); }
ww w. ja
E er aspect olmasayd yukar daki s n fla çal mak zorunda kal nacakt . Bu durumda takip edilmek istenen tüm yordam ve yap c lar n ba nda girisYazdir(), sonunda da cikisYazdir() yordamlar n ça rmak ve TAKIPSEVIYESI ile stream’e ilk de er atamalar n yapmak gerekecekti. Ayr ca arada baz yordamlar atlama ihtimali de bulunaca ndan oldukça sa l ks z bir yöntem oldu u aç kt r. Bu nedenle takip mekanizmas n aspect kullanarak kodlamak çok daha mant kl d r. Bu i levi yerine getirebilecek bir aspect’e ait kod a a dad r : AspectliTakip aspect’ine ait kod kesimi : package takip;
/** * Bu s n f AspectsizTakip s n f ndaki takip yordamlar ile uygulama s n flar ndaki * yap c ve yordamlar birbirine baTlar. * */ aspect AspectliTakip { /** * Uygulama s n flar . */ pointcut benimSinifim(): within(Sekil) || within(Daire) || within(Kare); /** * Bu s n flardaki yap c lar.
23
i.c o
m
*/ pointcut benimYapicim(): benimSinifim() && execution(new(..)); /** * Bu s n flardaki yordamlar. */ pointcut benimYordamim(): benimSinifim() && execution(* *(..));
dil
/** * Yap c lar çal madan önce ve çal t ktan sonra takip mesajlar yazar. */ before (): benimYapicim() { AspectsizTakip.takipGiris("" + thisJoinPointStaticPart.getSignature()); } after(): benimYapicim() { AspectsizTakip.takipCikis("" + thisJoinPointStaticPart.getSignature()); } t ktan sonra takip
va
/** * Yordam gövdeleri çal madan önce ve çal mesajlar yazar. */ before (): benimYordamim() { AspectsizTakip.takipGiris("" + thisJoinPointStaticPart.getSignature()); } after(): benimYordamim() { AspectsizTakip.takipCikis("" + thisJoinPointStaticPart.getSignature()); }
ww w. ja
/** * AspectsizTakip aspect'inin çal mas için gereken main fonksiyon. */ public static void main(String[] args) { AspectsizTakip.TAKIPSEVIYESI = 2; AspectsizTakip.initStream(System.err); OrnekMain.main(args); } } Yukaridaki aspect, yordam ça r mlar nda uygun takip mekanizmalar n i letir. Dolay s yla verilen s n f hiyerar isinde ça r lan her yordam ve yap c için yordama giri te ve yordamdan ç k ta giri ya da ç k mesajlar yazd r r. Yordam giri inde ya da ç k nda yazd r lan mesaj çal an yordama ait signature (imza) d r. =mza statik bir bilgi oldu u için thisJoinPointStaticPart ile eri ilebilir.
AspectliTakip aspect’i içinde yer alan main() yordam kullan larak bu uygulama çal t r l r. Uygulamay çal t rmak için AspectliTakip aspect’i aktif iken Run Run as aspectJ/Java application seçilir. Çal ma sonucu elde edilen ç kt a a dad r.
24
dil
i.c o
m
--> takip.Sekil(double, double) <-- takip.Sekil(double, double) --> takip.Daire(double, double, double) d1.cevre() = 12.566370614359172 d1.alan() = 12.566370614359172 k1.cevre() = 4.0 k1.alan() = 1.0 d2.mesafe(d1) = 4.242640687119285 <-- takip.Daire(double, double, double) --> takip.Sekil(double, double) <-- takip.Sekil(double, double) --> takip.Daire(double, double, double) <-- takip.Daire(double, double, double) --> takip.Daire(double) <-- takip.Daire(double) --> takip.Sekil(double, double) <-- takip.Sekil(double, double) --> takip.Kare(double, double, double) <-- takip.Kare(double, double, double) --> takip.Kare(double, double) <-- takip.Kare(double, double) --> double takip.Daire.cevre() <-- double takip.Daire.cevre()k1.mesafe(d1) = 2.23606797749979 k1.toString(): Karenin kenar = 1.0 @ (1.0, 2.0)
ww w. ja
va
--> double takip.Daire.alan() <-- double takip.Daire.alan() --> double takip.Kare.cevre() <-- double takip.Kare.cevre() --> double takip.Kare.alan() <-- double takip.Kare.alan() --> double takip.Sekil.mesafe(Sekil) --> double takip.Sekil.getX() <-- double takip.Sekil.getX() --> double takip.Sekil.getY() <-- double takip.Sekil.getY() <-- double takip.Sekil.mesafe(Sekil) --> double takip.Sekil.mesafe(Sekil) --> double takip.Sekil.getX() <-- double takip.Sekil.getX() --> double takip.Sekil.getY() <-- double takip.Sekil.getY() <-- double takip.Sekil.mesafe(Sekil) --> String takip.Kare.toString() --> String takip.Sekil.toString() <-- String takip.Sekil.toString() <-- String takip.Kare.toString()
25
m
va
dil
i.c o
= letim sonunda elde edilen ekran görüntüsü a a dad r :
AOP VE D 7ER PROGRAMLAMA MODELLER
ww w. ja
AOP, nesneye yönelik programlama (OOP)’n n eksiklerinin göz önüne al nmas yla olu turulmu tur ve meta-object protocols’e benzer bir fonksiyona sahiptir. Aspect (ilgi) subject, mixins ve delegation gibi programlama konular yla yak ndan alakal d r. Matematiksel olarak, ilgiler herhangi bir programlama modeli için bir ikinci düzen formu olu tururlar. Genel programlama modelleri basit fonksiyonlar ve mesajlarla ilgili muhakeme imkan verirken, AOP tüm bunlar n kümesi üzerinde birle im nokta kümesi arac l yla muhakeme imkan verir. Bu nedenle, istendi i taktirde AOP, ba ms z bir programlama modelinden ziyade güçlü bir gerçekle tirim (extension) olarak da görülebilir. AOP PROBLEMLER
AOP’n n en büyük sorunlar ndan biri hata ay klama (debugging) dir. Bunun nedeni de program kodu içersinde AOP kodunun ayr görünmesine ra men çal ma a amas nda bu ayr m n yok olmas d r. Bu durumda çal ma s ras nda, ilgi dokuma (concern weaving), hangi ilginin bask n olaca belirtilmezse tahmin edilemeyebilir. Tasar mc lar kodun ayr lmas konusunda her nekadar alternatif çözüm yollar da aram olsalar, bunlar n hiçbiri programc lar n birden fazla birle me noktas na bir tek tan mlay c cümlecik ile eri melerini sa layamam t r. Di er bir sorun ise AOP geli tirimlerinde istenmeyen birle me noktalar n n da özel i aretler (wildcards) yoluyla birle im nokta kümelerine dahil edilmesidir. Diyelim ki, bir programc belli bir karakter kümesi kullanarak bu karakter kümesiyle ba layan yordamlara ili kin birle me noktalar n bir birle im nokta kümesinde toplam olsun. Belli bir süre sonra programa unutarak bu karakter kümesiyle ba layan ba ka bir yordam ekledi inde bu yordama ait birle me noktas da önceki birle im nokta kümesine dahil olacakt r. Bu
26
m
durumda programc yazd her birle im nokta kümesi üzerinde mutlak bir hakimiyete sahip olmal d r. Bu da büyük programlar için oldukça zordur. KAYNAKÇA
ww w. ja
va
dil
•
http://aosd.net/conference http://aosd.net/wiki http://eclipse.org/aspectj/ http://www.aspectbench.org/ http://www.javaworld.com/javaworld/jw-01-2002/jw-0118-aspect.html http://www.codefez.com/Home/tabid/36/articleType/ArticleView/articleId/98/Asp ectOrientedProgrammingwithTacobymarchoffman.aspx http://www.cis.uab.edu/gray/Research/C-SAW/
i.c o
• • • • • •
27