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, 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.
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
- 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.
Yorumlar
Yorum Gönder