préoccupations tronçonner au milieu des méthodes

voix
3

il est commode pour AOP (par exemple AspectJ, SpringAOP) pour traiter (conseiller) préoccupations incisée à pointcuts autour des méthodes ci-dessous,

code sandwich

methodA {
    crosscut code
    user code A
    crosscut code
}

methodB {
    crosscut code
    user code B
    crosscut code
}

Est AOP susceptible de préoccupations tronçonner chevauchés au code utilisateur ci-dessous? Comment?

code Spaghetti

methodX {
    user code x1
    crosscut code

    user code x2
    crosscut code
}

methodY {

    user code y1
    crosscut code

    user code y2
    crosscut code
}

Merci!

Créé 17/08/2010 à 17:01
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
4

Spring AOP ne sera pas utile, car elle ne comprend que l'exécution pointcut ().

AspectJ comprend beaucoup plus pointcuts, y compris la construction withincode (), qui ressemble à ce que vous voulez:

withincode(* YourClass.methodX(. .))

cela vous permet de conseiller joindre à tous les points à l'intérieur d'une méthode donnée exection

Lire AspectJ en action pour plus d' informations, il est un très bon livre à la fois AspectJ et Spring AOP.


MODIFIER:

voici quelques exemples de code:

package com.dummy.aspectj;

import java.util.Arrays;
import java.util.Collections;

public class DummyClass{

    public static void main(final String[] args){
        System.out.println(Arrays.asList("One", Collections.singleton("Two")));
        System.out.println("Enough?");
    }

}

package com.dummy.aspectj;

import java.util.Arrays;

public aspect DummyAspect{

    pointcut callWithinMain() : 
        withincode(* com.dummy.aspectj.DummyClass.main(..)) // anything inside DummyClass.main
        && call(* *.*(..));                                 // but only method calls

    before() : callWithinMain() {
        System.out.println("\n***************************************************");
        System.out.println("** Calling:\n**\t"
            + thisJoinPointStaticPart.getSignature()
            + "\n** with arguments:\n**\t "
            + Arrays.deepToString(thisJoinPoint.getArgs()) );
        System.out.println("***************************************************\n");
    }

}

l'exécution de l'DummyClass de Eclipse / AJDT génère cette sortie:

***************************************************
** Calling:
**  Set java.util.Collections.singleton(Object)
** with arguments:
**   [Two]
***************************************************


***************************************************
** Calling:
**  List java.util.Arrays.asList(Object[])
** with arguments:
**   [[One, [Two]]]
***************************************************


***************************************************
** Calling:
**  void java.io.PrintStream.println(Object)
** with arguments:
**   [[One, [Two]]]
***************************************************

[One, [Two]]

***************************************************
** Calling:
**  void java.io.PrintStream.println(String)
** with arguments:
**   [Enough?]
***************************************************

Enough?
Créé 17/08/2010 à 17:21
source utilisateur

voix
2

Alors que certaines implémentations AOP pourraient vous permettre de le faire, cela pourrait être le signe de nécessité de remanier ces méthodes dans des méthodes plus qu'ils pourraient composées se faire trop si l'on a la nécessité de recoupé préoccupations dans le milieu des méthodes. Cela vous donnerait ceci:

methodX 
{
    usercodemethod1();
    usercodemethod2();
}

usercodemethod1
{
    user code x1
    crosscut code
}

usercodemethod2
{
    user code x2
    crosscut code
}
Créé 17/08/2010 à 17:12
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more