Ana içeriğe atla

AOP ye giriş

AOP'YE GİRİŞ

Günümüzde yazılım mühendisliği alanında nesneye dayalı programlama en çok kullanılan ve kabul gören programlama paradigması durumunda. Nesneye dayalı programlamanın bu başarısının ardındaki gerçeklerden biri de şüphesiz karşılaşılan bir problemi soyut davranışları ve verileri bir nesnede toparlayabilmesi, diğerlerinden ayrıca ele almaya izin vermesidir. Nesneye dayalı programlamanın getirdiği bu özellik sayesinde karışıklığı fazla ve büyük uygulamaların gerçekleştirim ve bakım süreçlerinde karşılaşılan sorunları ve zorlukları minimize edilebilmektedir. Bu tür uygulamalara örnek olarak dağıtık uygulamaları ve ya grafiksel kullanıcı arayüzlerini ( GUI ) verebiliriz.

Fakat nesneye dayalı programlama, kavramların ayrıştırılmasında çok yetenekli olmasına rağmen bir program modülünde gerçekleştirilemeyecek, tek bir program modülüne uymayacak özelliklere sahip ve ya birden fazla program modülüyle hemen hemen aynı derece de ilişkili olan kavramları enkapsüle etme de zorluklar yaşamaktadır. Kavramlar, servislerin kalitesi, güvenlik gibi yüksek düzeyli olabileceği gibi, bufferlama, cacheleme gibi düşük seviyeli de olabilmekte, aynı zamanda bir şirketteki iş mantıkları gibi fonksiyonel özellikte ve ya senkronizasyon gibi fonksiyonel olmayan özelliklere sahip olabilir. Bazı kavramlar bir kaç nesne ile couple olabilirler ve yeterince iyi bir cohesion sağlarlar. Örneğin XML Parser’lar vb.. Bazıları ise birbirleriyle çok ilgisiz modüller ile yakından ilişkili olabilirler. Bunlara da örnek olarak log tutulmasını verebiliriz.

Çapraz-kesilen Kavramlar

En son örnekte verilen log tutulması kavramını ele alırsak, bu kavram değişik modüllerin her bir metodunun çağrılmasında gerekebilir. Örneklemek gerekirse bir muhasebe programında o anki kasa modülünde kasa değerini bulan bir metodun içinde de fatura modülünde fatura kesimini gerçekleştiren metodun da içinde log tutulması istenildiğini, işi gerçekleştiren kişinin ve işin yapıldığı saatin tutulması istenildiğini, varsayalım. Bu durumda birbiriyle ilişkili olmayan iki modül de LOG objesine gerek duyacaktır.

Diğer bir örnek vermek gerekirse basit bir figure editörünü ele alırsak, bu editor için iki kavram vardır, ilki her bir figürün pozisyonun izini tutmak (data concern), diğeri ise her hangi bir eleman hareket ettirildiğinde görüntüyü güncellemek (feature concern). Nesneye dayalı programlama, grafiksel elemanları data kavramına göre gayet güzel şekilde enkapsüle edebilirken, feature kavramı her bir hareket metodunda görünmek durumundadır. Tam tersini, yani feature kavramının etrafında yazılımın tasarımını gerçekleştirebiliriz ama bu sefer de data kavramı her hareket sonrası görüntünün güncellemesinde gözükecektir.














Sonuç olarak, kavramlarla ilişkili metodlar kesişiyorsa, bu kavramlar çapraz-kesilen (crosscut) kavramlardır. Figür editöründeki iki kavram tasarım nasıl olursa olsun çapraz olarak kesişmektedir. Sadece ve sadece bir kavram başarıyla içselleştirilip, tam olarak ayrıştırılabilmektedir. Diğer kavram ana modüllerde enkapsüle edilememekte, diğer modüllerle arapsaçına benzer ilişkiler ortaya çıkarmaktadır.

“Crosscut” kavramlar için son örnek olarak dağıtık işletim sistemlerinin istenen özelliklerinden senkronizasyonu verebiliriz. İki eş zamanlı çalışan nesnenin arasındaki senkronizasyonu sağlamak amacıyla eş zamanlı çalışacak nesnelerin içine senkronizasyonu sağlayan nesnelerin tanımlarını gömmek gerekir. Bu da sonuç olarak aspect’e dayalı programlamanın gerekliliğini ortaya çıkaran nedenlerden yönlerin, cephelerin birbirleriyle içi içe geçmesi durumunu ortaya çıkarır.

Aspect-oriented Programlama Nedir?

“Crosscut” kavramların bir modüle enkapsüle edilebilmesi, tam olarak içselleştirilebilmesi için geliştirilen yeni teknoloji “Aspect”e Dayalı Programlama olarak isimlendirilmektedir. “Aspect” ise “crosscut” gerçekleştirimin modüler birimi olarak tanımlanabilir.

“Aspect” yapısı yardımı ile birden fazla sayıda sınıfı etkileyen davranışları tekrar kullanılabilen modüllere enkapsüle etmek mümkündür. Daha once verdiğimiz örneklerden “senkronizasyon” ve “log tutulması” birer “aspect”tir.

“Aspect”e dayalı programlama ile her bir “aspect”, ayrı ve iç içe geçme durumu yaratmadan gerçekleştirilebilir ve bu “aspect”ler bir araya getirilip, en son çalıştırılabilir hale getirilebilirler. “Aspect”lerin bir araya toparlanıp çalıştırılabilir hale getirilmesini “aspect weaver” sağlar.

Weaving iki şekilde olabilir:

  • Static weaving

Aspectler tek bir sınıf içerisine gömülerek birleştirilir (Örn. AspectJ)

  • Dynamic weaving

Aspectler, bir nesneyi dinamik kullanabilen bazı çerçevelerde her zaman ayrı sınıflardır (Örn. AspectWerkz)

Sonuç olarak bir “aspect” değişik sayıda prosedürün, modülün veya nesnenin gerçekleştirimine katılabilir. Bu olay da kodun tekrar kullanılabilirliğini önemli ölçüde arttırır.



AOP dilleri, “crosscutting” kavramları ayrıştırmak için genellikle üç önemli elemana sahiptir. Bunlar;

  • “Join point” model
  • “Join point”leri tanımlayan yapı
  • “Join point”lerde gerçekleştirimi etkileyen yapı

“Join point” model, “crosscutting” kavramların yapılarını tanımlayan genel referans yapısını sağlamakta ve yeni özelliklerin eklendiği bağlantıları tanımlamaktadır.


Yorumlar

yavasyavas dedi ki…
yazı için teşekkürler
aspect oriented programming ile ilgili kavramların türkçe karşılığı konusunda bir uyuşma yok. aspect oriented programming karşılığı olarak kullanıldığını gördüklerimden birkaçı:"ilgiye dayalı programlama", "ilgi odaklı programlama", "cephe yönelimli programalama".