Aspect Oriented Programming (AOP)

Engin Karabudak
Nov 5 · 2 min read

Merhabalar, bu makalemde Aspect Oriented Programming (AOP) nedir açıklamaya çalışacağım 🙂. Bir Senior Software Developer abimizin bende bu konu hakkında merak uyandırması üzerine bir araştırma yapıp yazmak istedim. Umarım keyifli ve verimli bir makale olur.

Aspect-Oriented Programming (AOP) ya da Türkçe adıyla Cepheye Yönelik Programlama 1990'lı yıllarda Xerox PARC tarafından bulunmuş bir programlama paradigmasıdır. Biz yazılımcılar için matematiksel işlemler ve kural dışı durumlar gibi içinden çıkılamaz şekilde karışık işleri en iyi şekilde ayırma imkanı sağlayan bir yaklaşımdır.

AOP Neden İhtiyaç Duyarız?

Aspect Oriented Programming yaklaşımı, temelinde birbirleri ile kesişen ilgilerin (Cross-Cutting Concerns) ayrılması üzerinedir. Peki nedir bu birbirleri ile kesişen ilgiler diyecek olursak:

Geliştirdiğimiz modüllere baktığımızda aslında her business işleminde ortak olarak gerçekleştirdiğimiz bazı işlemler vardır. Örneğin kullanıcının yetkisi var mı?gibi… Uygulama genelinde kullanılacak olan yapıları (logging, exception handling, cache, etc.) core tarafta yazdığımız koddan ayırarak bir çeşit ayrı küçük programcıklar şeklinde yazıp aslında geliştireceğimiz projede kullanmayı hedefler bir yaklaşım diyebiliriz. İşte bu işlemler bizim birbirleri ile kesişen ilgilerimiz (Cross-Cutting-Concerns) oluyor.

Biz yazılımcılar daha iyi kodlar yazmak için hep kullandığımız bir cümle var “Separation of Concern”. AOP’nin çıkış noktası aslında buna dayanıyor diyebiliriz. Bu da bize her sınıfın kendi sorumluluğunu yerine getirmesi (Single Responsibility) gibi prensiplere uyarak geliştirdiğimizde Readability, Reusability,Extensibility gibi özellikleri en üst seviyelere çıkartmamızı sağlıyor.

Örnek

Örneğin 10 binden fazla çalışanı olan büyük bir şirket için uygulama geliştiriyoruz geriye bütün çalışan listesini dönen bir metod yazıyor olalım ve klasik her uygulamada olması gereken belli başlı metodları yazalım; Cache, ExceptionHandling, Logging, Security gibi bizde metodumuzda bunları da yapacak olalım;

public IEnumerable<Employee> GetEmployeeList()
{
//Request'i yapan kişinin yetki kontrolu
//User Loglama
try
{
var employeeList = Context.Employee.ToList();
//Dbden ilgili tablodan kayıtların gelmesi
//geriye dönen sonuçları cache'e atma
return employeeList;
}
catch (Exception ex)
{
// meydana gelen Exception'ı handle edip log'lama
throw;
}
//metoddan çıkarken response'u log'la
}
}

Yukarıda bulunan metodu incelediğimizde ne kadar eksik olduğunu görebiliyoruz. Yorum satırlarında yazan işlemler için geliştirmeler yapmamız gerekmekte ancak bu geliştirmeyi nasıl yapacağız ? LogExceptionHandling(), CheckUserAuthorization(), LogProcess(), Cach()gibi metodları ilgili yerlere yazmak herhalde ilk akla gelen çözüm olacaktır. Ancak AOP bize daha farklı şekilde yapmamız gerektiğini söylüyor. Bunları ayrı modüller olarak tasarlayıp daha kullanılabilir, okunabilir ve SOLID prensiplerine uygun geliştirmeler yapmamız gerektiğini söyler.

Peki birbirleri ile çakışan ilgileri birbirlerinden nasıl ayıracağız ? İşte bu noktada karşımıza interceptor çıkmakta. Interceptor’ belirli noktalarda metot çağrımları sırasında araya girerek çakışan ilgilerimizi işletmemizi ve yönetmemizi sağlamakta. .Net tarafında Nuget üzerinden indirip kullanabileceğimiz Postsharp(4.2 sürümden sonrası ücretli bilginize🙂) kütüphanesi bu işi diplerine kadar yapmakta ve bizlere sadece attribute tanımlamaları yapmayı bırakmakta.

Şimdi yukarıda yazmış olduğumuz kodu gelin birde AOP standartlarına uygun şekilde yazalım.

[LogExceptionHandlingAspect]
[CheckUserAuthorizationAspect]
[LogProcessAspect]
[CacheAspect(TimeOut = 10000)]
public IEnumerable<Employee> GetEmployeeList()
{
var employeeList = Context.Employee.ToList();
return employeeList;
}

[UserAuthAspect] [LoggingAspect] [AppCacheAspect] [ExceptionAspect] attribute’lerini tanımladık ve AOP nin dediği gibi Cross-Cutting yani kesişen yerleri Aspect’ler kullanarak attribute seviyesinde kullanılabilir hale getirdik.

Aspect-Oriented Programming’in Sağladıkları

  1. İçi içe yazılı tekrar edenler kod bloklarından bizi kurtarıyor,
  2. Temiz ve anlaşılır kod sağlıyor ,
  3. Yazmış olduğumuz kodları daha abstract hale getirerek modülerliğini arttırıyoruz,
  4. Bakım ve geliştirme maliyetlerini azaltıyoruz,
  5. Uygulamamızı daha yönetilebilir ve daha esnek hale getirebiliyoruz.

Görüldüğü üzre AOP yaklaşımı geliştirdiğimiz uygulamalar için bizlere bir çok faydalar sunmakta.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade