2 Mart 2020 Pazartesi

Aspect Oriented Programming

Aspect Oriented Programming Ne Zaman Kullanılır?
Aspect Oriented Programming uygulamanın ana işlevi dışında kalan, genel maksatlı yan işlevlerde kullanılır. Bunlara Cross Cutting Concerns deniliyor. Şeklen şöyle

Şöyle örnekler verilebilir
Logging and Monitoring
Performance analysis
Debugging and Tracing
Undo Functionality
Validation of inputs and outputs
Morphing the behavior of existing objects
Object Filters
Security Implementation
Managing transactions
Advice Nedir?
Uygulamaya dahil edilen yukarıdaki yan işlevdir. Yani ek davranıştır. AOP terminolojisinde bazen advice yerine concern kelimesi de kullanılır. Şeklen şöyle



Join Point Nedir ? - Gerçek Metod Çağrısı
Advice'ın hangi noktalara dahil edilebileceğidir. Bu noktalar metod girişi, metod çıkışı,bir event'in tetiklenişi olabilir. AspectJ'de Join Point şöyle alınır
aspect AspectExample {
  before() : execution(* aspects.trace.demo.*.*(..))
  {
    logger.entering(thisJoinPointStaticPart.getSignature().getName(),
                    thisJoinPointStaticPart.getSignature().getDeclaringType());

  }

  after() : execution(* aspects.trace.demo.*.*(..))
  {
    logger.exiting(thisJoinPointStaticPart.getSignature().getName() ,
                   thisJoinPointStaticPart.getSignature().getDeclaringType()  );

  }
}
Pointcut Nedir?
Yukarıdaki Join Point'lerden hangisine advice eklenmesi gerektiğini belirten örüntüdür. 
Örnek
Parametreleri dikkate almadan ismi set olan tüm metodları ile eşleşir
call(* set(..))
Parametreleri dikkate almadan tüm metodlar ile eşleşir
execution(* *(..))
Poit sınıfının setX ve setY isimli belirtilen imzaya sahip metodları ile eşleşir.
pointcut setter(): target(Point) &&
                   ( call(void setX(int)) ||
                     call(void setY(int)) );

Weaving
Derleyici tarafından normal kodun ve AOP kodunun birleştirilerek derlenmesidir.

Execute Around Idiom
Metodun girişinde ve çıkışında kod çalıştırmak anlamına gelir.

Örnek
Eğer kendimiz kodlasaydık şöyle yaparız.
public class StackOverflowTest {
  public static void main(String[] args){
    StackOverflowTest test = new StackOverflowTest(); 
    test.timeMethod(test::getAllProducts);
    test.timeMethod(test::getAllClients);
    test.timeMethod(test::getAllSymbols);
  }

  void getAllProducts(){
    System.out.println("getting all Products");
  }

  void getAllClients(){
    System.out.println("getting all Clients");
  }

  void getAllSymbols(){
    System.out.println("getting all Symbols");
  }

  // The "Execute Around" method
  void timeMethod(JustDoIt justDoIt){
    long start = System.nanoTime();
    try {
      justDoIt.doIt();
    } finally {
      long end = System.nanoTime();
      System.out.println("  Time: " + (end - start) / 1000 + " microseconds"");
    }
  }  
}

@FunctionalInterface
interface JustDoIt {
  void doIt();
}


Hiç yorum yok:

Yorum Gönder