AOP Aspect-Oriented Programming

Si nuestro cĆ³digo empieza a tener mĆ”s de 100 packages, mĆ”s de 10M de lĆneas, etc...estamos hablando de que hay algo que no cuadra, o por un lado se escribe demasiado cĆ³digo, o realmente lo que estĆ” pasando es que se estĆ” duplicando.
Lo importante de la programaciĆ³n orientada a aspectos, es que el impacto sobre el proceso de desarrollo sea cero o nulo, y que solo impliquen pequeƱas modificaciones elegantes que nos lleven a una mejora en nuestro cĆ³digo.
- Un ejemplo prƔctico en Java:
Este ejemplo simple consiste en tener una lista de personas, a las que alguien quiere acceder, por lo tanto buscarlas a travĆ©s de un Ćndice. Mediante AOP, creo una clase interceptora que me informa de si alguien intenta acceder a esta lista y que identificador de usuario estĆ” buscando:

import com.google.inject.Guice;
import com.google.inject.Injector;
import java.util.HashMap;
import java.util.Map;
public class People {
private static final Map<Number, Person> People = new HashMap<Number, Person>();
static {
People.put(1, new Person("John Smith"));
}
public Person search(Number number) {
return People.get(number);
}
public static void main(String[] args) {
Injector i = Guice.createInjector(new PeopleModule());
People people = i.getInstance(People.class);
Person p = people.search(1);
System.out.println(p);
}
}
//////////////////////////////////////////////////////////////////////////////////////
import static com.google.inject.matcher.Matchers.*;
import com.google.inject.AbstractModule;
public class PeopleModule extends AbstractModule {
@Override
protected void configure() {
bindInterceptor(subclassesOf(People.class),
returns(only(Person.class)), new PerformanceInterceptor());
}
}
//////////////////////////////////////////////////////////////////////////////////////
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class PerformanceInterceptor implements MethodInterceptor
{
public Object invoke(MethodInvocation invocation) throws Throwable {
for (Object arg : invocation.getArguments())
if (arg instanceof Number)
System.out.println("Someone is looking por person ID: "+arg);
return invocation.proceed();
}
}
//////////////////////////////////////////////////////////////////////////////////////
public class Person {
private final String name;
public Person(String name) {
this.name = name;
}
public String toString() {
return String.format("%s[name=%s]", getClass().getName(), name);
}
}
el resultado de la ejecuciĆ³ del siguiente cĆ³digo es:
Someone is looking por person ID: 1
Person[name=John Smith]
Podeis encontrar mĆ”s informaciĆ³n en los siguientes enlaces:
http://code.google.com/p/gwt-ent/wiki/AOP
http://es.wikipedia.org/wiki/AspectJ
http://www.informit.com/articles/article.aspx?p=174533&seqNum=2
http://www.developer.com/design/article.php/3308941
http://www.eclipse.org/ajdt/
Wow! Impressive! Do the best
ReplyDelete@Impress!!!
ReplyDelete