Merhabalar arkadaşlar, Sitemizi programlama ile ilgilenen bütün arkadaşlarımızın Türkçe içerik konusunda çektiği sıkıntılar düşünülerek soru/cevap şeklinde bir etkileşimde bulunabilmesi için kurduk. Umuyoruz hepimiz için güzel bir deneyim olur. Hasscript Ekibi

0
Aspect Oriented Proglama (AOP) nedir?

Açık 1 Cevaplar 34 Gösterim Genel Kavramlar
Aspect Oriented Programming (AOP) nedir? Sağladığı avantajlar nelerdir? Ne tür uygulamalarda kullanılır?

1 cevap

0

Bunu anlamaya çalışırken bir grafik uydurmuştum ben. Onun gibi anlatayım.

Program çalışmaya başladığı zaman senin de bildiğin üzere bir main fonksiyondan başlayarak farklı farklı fonksiyonlar çağrılır ve program yukarıdan aşağı doğru (kod yazımı gibi düşünüyoruz) çalışarak devam eder. Bir fonksiyon çağrıldığında program başka bir bloga girer orada hata almadan devam ederse işini bitirince yine main bloğuna geri döner. En nihayetinde main üzerinden biter. Buna bir grafikle bakalım.

Bu resimde baktığın zaman x eksenindeki kesitler fonksiyonları y ekseni ise akışın nasıl devam ettiğini gösteriyor. 0 noktasından başladı ve main fonksiyonunun sonuna kadar dallandı dallandı geri geldi ve bitti. Bu kısım sanıyorum anlaşılır.

Şimdi aspect olayına girelim.

Bu y eksenindeki değişiklikleri bir şekilde dinleyip araya kod sokmaya çalıştığımızda AOP ile kod yazmış oluyoruz. Hemen yeni bir grafik ile yerlerimizi belirleyelim.

Öncelikle nerelere kod inject (türkçesi zerk etmek oluyor herhalde :) ) edilebilir diye belirliyoruz. Bunlar sınıfların başı, fonksiyon çağrılma anları (ben örnek olarak fonksiyon çağrılmaları işaretledim) gibi yerler oluyor. Şimdilik aklıma çok birşey gelmiyor. Bu noktalara pointcut deniyor, grafikde p1,p2,p3 ve p4 noktaları. Önce pointcutları belirledikten sonra bu pointcutların önüne, arkasına ya da olduğu anda gibi zamanlarda çalıştırılacak kodlar yazılır ve bırakılır. JDK veya JRE bu işlemleri kodları çalıştıracak şekle getirir. JDK veya JRE dememin sebebi compile time veya runtime çalışan şekilleri var. Onu başka bir paragrafa alalım.

Java ve AspectJ kullanıyorsanız yazdığınız kod JDK ile derleme anında (compile time) kodunuzla derlenir. Performans hızlı olur.
Java ve Spring AOP kullanıyorsanız yazdığınız kod JRE ile çalışma anında (runtime) tetiklenir. Performans görece yavaş olur.

Güvenlik ve loglama için kullanımlarını gördüm. Keza hatırlıyorum sadece 16 satır kod ile projedeki bütün metodları giriş ve çıkışlarına log koymuştum(yaklaşık 10K foksiyon)

Şimdilik bu kadar. Varsa aklında başka sorular konuşabiliriz.

 

(4.8k puan)
2Yorumlar
(2k puan)
düzenledi

Anladığım kadarıyla tüm katmanlarda cross cuting her bir katmanda çalışabilen bir tasarım oluyor. Loglama ya da güvenlik kontrolü işlemleri için ilgili class'ın ya da methodun başına @ilgiliAnatasyon u yazarak inject ediyor ve  log veya güvenlik için kodları farklı bir katmanda geliştiriyorsun.

  • Security (Güvenlik)
  • Caching
  • Exception Handling 
  • Logging

Gibi işlemlerde kullanıldığını öğrendim. Peki log4j ya da spring security ile de bahsettiğin işlemleri yapabiliyoruz. Bunları düşündüğünde nasıl bir kıyas yapabiliriz? Avantaj ,dezavantaj vs.

(4.8k puan)
Örnekleri güzel yakalamışsın. Cache hiç düşünmemiştim ama güzel yaklaşım.

Kıyas yapmak derken? Bence kıyaslama değil de beraber kullanılacak konseptler bunlar. Yani sen araya kod inject diyorsun, eklediğin kod zaten log4j kullanarak yazdığın kod. Yani birbirine ihtilaf düşen ya da ikame olan şeyler değiller.

Annotation konusuna gelince Spring AOP annotation üzerinden çalışıyor. AspectJ kullanıyorsan .aj dosyası içinde yazıyorsun veya annotation kullanabiliyorsun. Ben yazarkan .aj dosyası olarak yazmıştım.

Bence güzel bir örneğini yapabilirsin. Kendi cache mekanizmanı yazmayı deneyebilirsin ki güzel bi ufak proje olur.