Aspect Oriented Programming — AOP Nedir? Neden Kullanmalıyız?
Her ne kadar tekrarlı kod yazmaktan kaçınsakta istemeyerek de olsa birçoğumuz bu hataya düşebiliyoruz. Uygulama büyüyor ve büyüyen bu uygulamalarımızın bakımı zorlaşabiliyor, kodun okunurluğu zamanla azabiliyor.
Kendini tekrar etme. DRY (Don’t Repeat Yourself)
Kaliteli kod yazarak proje geliştirmek için temelde kodun tekrar kullanılabilirliği (reusability), okunabilirliği (readability), modularity ve bakımının yapılabilirliği (maintainability) özelliklerine dikkat ederek uygulama geliştirmemiz gerekir. Geliştirdiğimiz modüllerde ortak olarak kullandığımız bazı yapılar vardır. Bunlar Caching, Exception Handling, Logging, Performance, Transaction, Validation vb. Bu işlemler birer Cross Cutting Concern.
Cross Cutting Concerns Nedir?
Cross Cutting Concerns’ün Türkçe anlamı “Kesişen İlgiler” ya da “Çapraz Kesen İlgiler” diye geçmektedir. Cross Cutting Concern denilmesinin sebebi katman bağımsız olması, projenin istenilen yerinde kullanılması ile bulunduğu yerden soyutlanmış olmasından kaynaklanmaktadır.
Kesişen ilgileri geliştirdiğimiz modüllerde nasıl kullanıyoruz ve nasıl kullanmamalıyız gelin birlikte bakalım.
Bir metodu ele alalım. Her business işleminde ortak olarak yaptığımız bazı işlemler vardır. Bunlar, metoda ilk istek atıldığında önce yetki kontrolü yap, ardından eğer yapılması gereken validation işlemleri varsa onları yap, logla, cache ekle ya da cache den sil, bir hata aldığımızda exception handling işlemlerini gerçekleştir. Okurken bile ne kadar çok işlem yaptığımızın farkına vardığınızı düşünüyorum :)
İşte tekrarlı kullandığımız bu işlemler bizim için birer Cross Cutting Concern oluyor. Kod üzerinde baktığımızda;
Yukarıdaki örnekte yapılan işlemler sadece bir metot içindi ve benzer işlemleri projenizin birçok yerinde yapmanız gerekir. AOP ise bize kesişen bu ilgilerin birbirinden ayrılması gerektiğini söylemektedir. Bu sayede sınıfın kendi sorumluluğunu yerine getirmesini (single responsibility principle), kodun daha okunur ve anlaşılır yapıda olmasını, aynı kodları çok daha kısa ve kolay bir şekilde tekrar kullanılabilirliğini sağlayabiliriz.
Kesişen ilgilerimizi AOP ile ayıracağız ama nasıl ? Burada Interceptor yapıları bize yardımcı olmaktadır.
Interceptor Nedir?
Interceptor metot çağrımları sırasında araya girerek kesişen ilgilerimizi işletmemizi ve yönetmemizi sağlamaktadır. Metotların çalışmasında önce ya da sonra işlemlerimizi gerçekleştirebilmemize imkan sağlar.
Interceptor yapısı için örnek;
Buraya kadar bahsetmiş olduğumuz yapıları kullanarak bir aspect oluşturalım. Öncelikle yapacağımız aspect validation işlemleri için olacak. Metodlarımıza gönderilen dto (data transfer object) için istediğimiz kontrolleri sağlayacağımız bir yapı olacak.
Metodu çalıştırmadan önce validation işlemleri yapması için MethodInterception’ın OnBefore metodunu override edeceğiz. OnBefore metodumuz bir validator alacak ve validation işlemlerini yapacağı sınıfın içindeki propertyleri gezip yazmış olduğumuz koşulları kontrol edecek. Fluent Validation ile bir validator oluşturalım.
Validator ve kontrol edeceği sınıfımızı alan yardımcı metodumuzu oluşturalım. Bu metodu birazdan yazacağımız validation aspect içerisinde kullanacağız.
Ve sıra geldi aspect metodumuza :)
Oluşturduğumuz validation aspectimizi metodumuzun başına ekleyerek metodu çalıştırmadan validation işlemlerinin yapılmasını sağlayabiliriz. Bu sayede asıl yapılmak istenen iş metod içerisinde bulunacaktır. Metodlarımız daha okunaklı ve sadece yapması gereken işi sağlayacak kodları bulunduracaktır. Kullanımına bakacak olursak;
Aspect Oriented Programming’in Avantajları
- Tekrar eden kod bloklarından bizi kurtarıyor ve daha temiz ve anlaşılır bir yapı sunuyor.
2. Uygulamaların bakım ve geliştirme maliyetlerini azaltmış oluyor.
3. Modüler bir yapı elde etmemizi sağlıyor.
Bu yazımızda Aspect Oriented Programming ne olduğu, nasıl kullanıldığı ve sağladığı avantajlarına değindik. Umarım faydalı olmuştur. Bir sonraki yazımda görüşmek üzere…