22.06.2008

Aspect-Oriented Programlama

Yazılım geliştirme her zaman zevkli ama bir o kadar da zorlayıcıdır. Her zaman yazılımcılar daha hızlı ve daha güvenli yazılım yapmak ister. Yazılım dillerine kabaca bakarsak Assembly, C, C++, C#. Yazılım her zaman dünyayı modellemekten geçtiği için sırayla dillere bakarsak dünya daha kolay modellenir hale gelmiştir. Assembly de çok zor olan olaylar C de çözülmüş, C de karşılaşılan problemler C++ ile çözülmüş, C++ da karşılaşılan problemler daha üst diller aracılığı ile sonlanmıştır. Her yazılım dilinin bir amacı olduğu için her yazılım dili farklı bir kesime hitap eder. Dediğimiz gibi yazılım dünyayı modellemekten geçer bugün procedurel ve structurel dillere karşılaşılan problemler Object-Orientation ile çözülmüş ve Object-Orientation da karşılaşılan problemler de Aspect-Orientation ile çözülmeye çalışılıyor. Herkesin bildiği gibi nesne yönelimli yani OO bir dilde objeler dünyadaki nesnelerin bilgisayardaki yansımasıdır. Örnek olarak eğer biz bir Bardak sınıfı yazarsak ve bu sınıftan objeler oluşturursak yani sınıftan oluşmuş yaşayan varolan şeylere dönüştürürsek şunu görecez; bizim dünyayı alıp modellediğimizi. Object-Oriented bize şunu sağlar daha iyi bir modelleme, daha az kod bakımı, daha az karmaşık yapılar, tekrar kullanılabilir componentler ancak her metadolojinin artıları olduğu gibi eksileri de vardır.
Object-Oriented analiz ve tasarım da şunu görürüyoruz bazen yapmak istemediğimiz işleri de yapabiliyor sınıfların yapılarını amacımızın dışında tasarlayabiliyor onları düzeltmeye kalktığımız zaman bize tuzluya mal olabiliyor. Örnek vermek gerekirse bugün yazılıma giren bir insan için “Hello World!” ne demekse büyük bir projede loglama yapma örneği de aspectçiler için aynıdır. Demeğe çalıştığım şey şudur ki eğer bir sistem tasarlamışsak ve bu sistem içinde bizim ilk amacımız loglama yapmak değilse ve loglamayı düşünerek herhangi bir class a o classın görevine ait olmayan özellikler eklemişsek bu bizim zamanımızı çaldığı gibi ilerde doğabilecek sorunlara neden olabilir hatta ve hatta tasarımızın sonradan değişmesi halinde kod bakımında bize dolaylıda olsa para kaybetmemize neden olabilir. Aspect-Oriented ın bize getirdiği olay şudur eğerki bizim amacımız bir banka uygulaması yapmaksa ve bu banka uygulamasında ilk amacımız çalışan bir sistem sonrada loglama yapan bir sistemse önce ben sistemimi tasarlayım sonra da maliyetin en düşüğünü düşünerek loglamayı eklemeliyim kısaca şudur önce ana amaçlar doğrultusunda sistem tasarlanır sonra eklenecek özellikler sınıfların yapıları ilişkileri değişmeden eklenmesi kısaca konuya yönelik bir programlama o görevi o özelliği düşünerek tasarım yapmaktır. En basit haliyle aspect-oriented programlama bize en kısa yoldan en ucuz biçimde daha güvenilir daha az maliyetli daha kolay tasarlanabilir bir proje yapmamızı sunmaktadır. Basit bir örnek vermek gerekirse oop bir dilde loglama en kötü halde nasıl yapılır aspect oriented da nasıl yapılır.

Java
class Child
{
int age;
int height;

public Child(int age, int height)
{
this.age = age;
this.height = height;
}

public void set_Age(int newAge)
{
this.age = newAge;
System.out.println("The age is changed..");

}
}
class Prg
{
public static void main(String[] args)
{
Child c = new Child(12,170);
c.set_Age(13);
}
}

Bu programın çıktısı ise : The age is changed.. dir.

Şimdi de aspect-oriented bir programala dilinde daha doğrusu java için geliştirilmiş bir proje olan AspectJ de bunu yazalım.

class Child
{
int age;
int height;

public Child(int age, int height)
{
this.age = age;
this.height = height;
}

public void set_Age(int newAge)
{
this.age = newAge;


}
}

public aspect Program
{
pointcut LogChangedAge() : call(public void Child.set_Age(int));
after() : LogChangedAge()
{

System.out.println("The age is changed via the aspect");
}


}
class Prg
{
public static void main(String[] args)
{
Child c = new Child(12,170);
c.set_Age(13);
}
}
Projenin çıktısı : The age is changed via the aspect

Bu küçük projede şunu gördük eğer çocuğun yaşını değişimini takip etmek istiyorsak class ın temelini bozmadan sonra loglama amacıma yönelik olarak aspectlerimizle kod yazabiliyoruz.

Aspectimize bakacak olursak
Pointcut dediğimiz keyword hangi fonksiyon ile kendi fonksiyonumuzu eşleştirmek. Kısaca call dediğimiz keyword ün içine yazdığımız fonksiyon çalıştığında yapılacak olan şey pointcutımızdaki fonksiyonda gerekli olan görevi yap demektir.
After keywordune bakacak olursak istediğimiz fonksiyon çalıştıktan sonra aşağıdaki statementları gerçekledir.

Hiç yorum yok: