"Aspect Oriented Programming"i Anlamak

Aspect Oriented Programming (AOP), bir uygulamadaki ana işi yapan yapılarla, ana işi yapmayıp ortak olarak kullanılan bazı yapıların birbirinden ayrılması ve bu ortak yapıların bağımsız modüller hale getirilerek istenen yerde kullanabilmesini ve yönetilmesini sağlayan bir yaklaşımdır.  

Bir başka deyişle, kesişen ilgilerin ayrılması ile modülariteyi arttırma yaklaşımını içerir.

AOP'yi anlamak için önemli kavramları bilmek gerekir.

Cross Cutting Concerns: Loglama, Validasyon, Caching gibi kendi başına bir anlam ifade eden ve temel iş mantığından ayrı işlerdir. Uygulamayı dikine kesen olarak denilmesinin sebebi yatay olarak belirtilen ana katmanları (business, service, data, user interface) dik olarak keserek her yerde kullanıldığını belirtir. Aşağıdaki görsel bunu ifade etmektedir. 



Join point: Bu ilgilerin çalışacağı andır. Metodun başında, sonunda veya hata aldığında çalışacaktır. OnBefore, OnAfter, OnSuccess, OnException örnek olarak verilebilir. 

Pointcut: Join point anında çalışacak metodu belirtiriz. Validasyon işlemi yapacak metot, pointcut olur.

Aspect: Join point ve interceptorların kodlandığı, concernleri ifade eden sınıftır. Örneğin doğrulama işlemi yapılacak bir aspectin sınıfının adı ValidationAspect olabilir. En iyi isimlendirme yöntemi olarak, Concern ismi + "Aspect" kelimelerinin birleşimi, aspect sınıfının ismini verir.

AOP'yi daha iyi anlamak için kütüphane otomasyon uygulamasını örnekleyen iki ayrı diyagramı incelersek; 

Üstteki diyagarmda,  AddingBook, GetBookById ve GetAllBooks metotları, temel işlerini yaparken bu metotlarda Logging ve Security yapıları mevcuttur. Metotların üzerini aşağıdaki gibi çizen "cross cutting concern"ler her bir metot için aynı kodlar yazıldığı için modüler değildir ve SOLID prensiplerinden Single Responsibility (Tek Sorumluluk) Prensibine ters düşmektedir. Aynı zamanda bu ilgiler ayrılmadığı için de Separation of Concerns uygulanmamıştır. 


Üstteki diyagarmda,  AOP uygulayarak AddingBook, GetBookById, GetAllBooks  metotlarından, Logging ve Security yapıları, modüler hale getirilerek ayrılmıştır. Böylece her bir yapı, kendi işini yapmaya odaklı hale gelmiştir. Daha anlaşılır, okunabilir ve yönetilebilir kod yapıları oluşmuştur. 

İstendiğinde; ana metotlar, ayrılan cross cutting concernlere bağlanarak çağrılıp entegre edilebilir. Bunu kolaylaştıran yapılar "interceptors"lardır.

Interceptor, uygulamadaki bir metodun çalıştırılması esnasında ek bir fonksiyon eklemek istersek araya girme işlemi yapan yapılardır. Metot çağrımı öncesi, sonrası, hata alınması ve başarılı olması esnasında araya girip cross cutting concern yapılarını ekleyebilmemizi sağlar. 

Programlama dilleri ve frameworklerin desteklediği sık kullanılan interceptor kütüphaneleri aşağıdaki gibidir.

  • .NET: Postsharp-Autofac 
  • Java: Spring- AspectJ - JBoss 
  • PHP: Go AOP
Not: Postsharp, .NET'in son versiyonlarında ücretli olduğundan tercih edilmemektedir. Autofac, IoC ve Dependency Injection yönetimini sağlayan nuget paketi olmasına rağmen interceptor yapısını destekleyen ek bir paketi de mevcuttur. Bu yüzden .NET geliştiricileri için kullanışlıdır.

Örnek bir interceptor yapısı aşağıdaki gibidir. IInvocation, metodun kendisidir ve Proceed() metoduyla yürütülmesi sağlanır.  Örnek olarak; ValidationAspect sınıfı MethodInterception metodunu miras alır ve Before metodunu override ederek validasyon işlemini yapar. Kaydetme/güncelleme işlemi öncesinde validasyon işlemini yapması için Before metodunda işlemler doldurulur.

MethodInterception sınıfı


ValidationAspect sınıfı


AOP'nin yararları

  • Reusability - Yeniden Kullanılabilirlik: Ayırdığımız bu ilgileri, her katmanda kullanılabilir olması sağlanır.
  • Önemli yazılım prensiplerine bağlı kalmayı sağladık. Single Responsibility Principle (Tek Sorumluluk Prensibi), DRY (Do not Repeat Yourself) ve Separation Of Concern (İlgilerin ayrılması)
  • Maintability - Bakım yapılabilirlik: Projedeki muhtemel bakım maliyetlerini azalttık. Temel işi yapan kodlara daha iyi odaklanabilmeyi kolaylaştırır.
  • Modularity - Modülerlik: İlgileri birbirinden ayırıp modül haline getirdik böylece belli konuları tek yerden yönetebilmeyi sağladık.
  • Readability - Okunabilirlik: Temel iş mantığından kesişen ilgileri ayırarak kod karmaşıklığını önledik. Bu ilgilerden kaynaklı artan kod satırlarını azalttık. Kodumuzu daha anlaşılır ve okunabilir hale getirdik.
Keyifli ve faydalı olmasını umarak, çalışmalarınızda kolaylıklar diliyorum.

Yorumlar