AOP Aspect-Oriented Programming
Abro este post para comentar un poco el tema del AOP (ProgramaciĆ³n orientada a aspectos), ya que es un concepto bastante abstracto y que consiste en mejorar considerablemente nuestro cĆ³digo, haciĆ©ndolo mĆ”s mantenible y simple. Sobretodo atendiendo al principio del DRY (Don't repeat youself), y evitar el copy-paste malicioso o boilerplate (su traducciĆ³n seria lenguage estereotipado o repetitivo). Como explica Robbie Vanbrabant en su Ćŗltimo libro (Agile Lightweight Dependency Injection Framework), muchos de nosotros hemos utilizado clases, mĆ©todos y packages, pero todos estos conceptos a veces no nos ayudan a solucionar todos nuestros problemas, y nunca pueden ayudarte a organizar tu cĆ³digo y evitar que estĆ© duplicado por algĆŗn mĆ³dulo. AOP, permite al cĆ³digo comportarse de diferente manera, y ser dividido en pequeƱos nĆŗcleos de componentes (aspectos), los cuales pueden ser inyectados arbitrariamente en cualquier lugar facilmente. Las llamadas de los mĆ©todos pueden ser interceptadas, aumentadas o redirigidas, y en muchas ocasiones sin tener que cambiar el cĆ³digo. Desde mi punto de vista, cuando llevas aƱos escribiendo cĆ³digo, dentro de un equipo, siempre ha pasado que dos de nosotros hemos escrito lo mismo, porquĆ© el cĆ³digo estĆ” mal organizado, o simplemente porquĆ© no hay manera de manejarlo...
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.
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:
El cĆ³digo fuente (muy sencillo), lo teneis implementado aquĆ:
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:
El cĆ³digo fuente (muy sencillo), lo teneis implementado aquĆ:
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