¿Qué es la programación orientada a aspectos?

231

Entiendo la programación orientada a objetos, y he estado escribiendo programas OO durante mucho tiempo. La gente parece hablar sobre programación orientada a aspectos, pero nunca he aprendido realmente qué es o cómo usarla. ¿Cuál es el paradigma básico?

Esta pregunta está relacionada, pero no la hace:

Programación Orientada a Aspectos vs. Programación Orientada a Objetos

Sophie
fuente
55
IMAO, el enlace proporcionado en la pregunta tiene una respuesta más clara y completa que la aceptada aquí. Las personas que lean esta pregunta podrían leerla primero.
David Chen el

Respuestas:

198

AOP aborda el problema de las preocupaciones transversales , que sería cualquier tipo de código que se repite en diferentes métodos y que normalmente no se puede refactorizar por completo en su propio módulo, como con el registro o la verificación. Entonces, con AOP puede dejar esas cosas fuera del código principal y definirlo verticalmente de esta manera:

function mainProgram()
{ 
   var x =  foo();
   doSomethingWith(x);
   return x;
}

aspect logging
{ 
    before (mainProgram is called):
    { 
       log.Write("entering mainProgram");
    }

    after (mainProgram is called):
    { 
       log.Write(  "exiting mainProgram with return value of "
                  + mainProgram.returnValue);
    }
 } 

aspect verification
{ 
    before (doSomethingWith is called):
    { 
       if (doSomethingWith.arguments[0] == null) 
       { 
          throw NullArgumentException();
       }

       if (!doSomethingWith.caller.isAuthenticated)
       { 
          throw Securityexception();
       }
    }
 }

Y luego se usa un tejedor de aspectos para compilar el código en esto:

function mainProgram()
{ 
   log.Write("entering mainProgram");

   var x = foo();   

   if (x == null) throw NullArgumentException();
   if (!mainProgramIsAuthenticated()) throw Securityexception();
   doSomethingWith(x);   

   log.Write("exiting mainProgram with return value of "+ x);
   return x;
} 
Mark Cidade
fuente
14
¿Necesitas soporte de idiomas para esto, entonces? ¿En qué idioma es tu ejemplo?
Sophie
8
Este es un pseudocódigo, pero el ejemplo más conocido es AspectJ, que es una modificación AOP de Java, que utiliza una técnica similar llamada puntos de corte.
Mark Cidade
71
Vudú. Y pensé que OOP era excesivo.
Aiden Bell
17
Mark, ¿es como decorar los puntos de entrada y salida de un método?
Filip Dupanović
3
@AidenBell Si la acción invisible a distancia puede considerarse vudú, entonces sí, es vudú. Bajo la metaprogamación de Moose, los modificadores de método como before, after, around, inner, augment hacen exactamente eso. Oscurece el flujo de ejecución del programa. Estos pueden ser casi imposibles de rastrear, especialmente cuando se derivan de la versión de aspectos de ese sistema, que llama roles . Uno puede componer sistemas de asombrosa complejidad con todo esto.
tchrist
13

Desafortunadamente, parece ser sorprendentemente difícil hacer que AOP sea realmente útil en una organización normal de tamaño medio-grande. (Soporte del editor, sentido de control, el hecho de que comienzas con las cosas no tan importantes que conducen a la descomposición del código, las personas que van a casa con sus familias, etc.)

Puse mis esperanzas en la programación orientada a compuestos , que es algo cada vez más realista. Se conecta a muchas ideas populares y te da algo realmente genial.

Mire una implementación prometedora aquí: qi4j.org/

PD. En realidad, creo que una de las bellezas con AOP es también su talón de Aquiles: no es intrusivo, lo que permite que las personas lo ignoren si pueden, por lo que será tratado como una preocupación secundaria en la mayoría de las organizaciones.

Hugo
fuente
8

Copiado de un duplicado para completar (Einstein):

Los ejemplos clásicos son la seguridad y el registro. En lugar de escribir código dentro de su aplicación para registrar la ocurrencia de x o verificar el objeto z para el control de acceso de seguridad, existe un artilugio de lenguaje "fuera de banda" del código normal que puede inyectar sistemáticamente seguridad o iniciar sesión en rutinas que no los tienen de tal manera que, aunque su código no lo proporcione, se encargará.

Un ejemplo más concreto es el sistema operativo que proporciona controles de acceso a un archivo. Un programa de software no necesita verificar las restricciones de acceso porque el sistema subyacente sí lo hace.

Si cree que necesita AOP en mi experiencia, realmente necesita invertir más tiempo y esfuerzo en la gestión adecuada de metadatos dentro de su sistema con un enfoque en el diseño estructural / de sistemas bien pensado.

paxdiablo
fuente
7

Copiado de Spring in Action

AOP a menudo se define como una técnica que promueve la separación de preocupaciones en un sistema de software. Los sistemas están compuestos por varios componentes, cada uno responsable de una pieza específica de funcionalidad. Pero a menudo estos componentes también conllevan responsabilidades adicionales más allá de su funcionalidad principal. Los servicios del sistema, como el registro, la gestión de transacciones y la seguridad, a menudo encuentran su camino en componentes cuyas responsabilidades principales son otra cosa. Estos servicios del sistema se conocen comúnmente como preocupaciones transversales porque tienden a atravesar múltiples componentes en un sistema.


fuente
6

Copiado de un duplicado para completar (Buzzer):

Los atributos de clase y método en .NET son una forma de programación orientada a aspectos. Decoras tus clases / métodos con atributos. Detrás de escena, esto agrega código a su clase / método que realiza las funciones particulares del atributo. Por ejemplo, marcar una clase serializable permite que se serialice automáticamente para almacenamiento o transmisión a otro sistema. Otros atributos pueden marcar ciertas propiedades como no serializables y se omitirán automáticamente del objeto serializado. La serialización es un aspecto, implementado por otro código en el sistema, y ​​aplicado a su clase mediante la aplicación de un atributo de "configuración" (decoración).

paxdiablo
fuente
5

AOP se puede utilizar para realizar acciones que no están relacionadas con la lógica empresarial de su aplicación, como el registro, el almacenamiento en caché, etc. Estas acciones se pueden colocar en una parte separada de su aplicación y luego reutilizarse en toda la aplicación. Por lo general, hay dos formas de lograr esto. Inyectando código automáticamente por un preprocesador antes / después de un método, o adjuntando clases proxy que interceptan una llamada al método y luego pueden ejecutar cosas antes / después de una llamada al método.

Aquí hay un ejemplo en .Net. Utiliza clases proxy para interceptar llamadas a métodos y ejecutar código antes o después de llamadas a métodos saif.

Programación Orientada a Aspectos (AOP) en .NET Core y C # usando AutoFac y DynamicProxy

Carlos Blanco
fuente
4

Hay un ejemplo de AOP, se utilizó Spring AOP como ejemplo. El ejemplo es bastante fácil de entender.

El marco Spring AOP (Programación orientada a aspectos) se utiliza para modularizar las preocupaciones transversales en aspectos. En pocas palabras, es solo un interceptor para interceptar algunos procesos, por ejemplo, cuando se ejecuta un método, Spring AOP puede secuestrar el método de ejecución y agregar funcionalidad adicional antes o después de la ejecución del método.

Referencia: http://www.mkyong.com/spring/spring-aop-examples-advice/

RF
fuente
En informática, la programación orientada a aspectos (AOP) es un paradigma de programación que tiene como objetivo aumentar la modularidad al permitir la separación de preocupaciones transversales.
RF
3

AOP es una forma de modularizar mejor su aplicación para una funcionalidad que se extiende a través de múltiples límites. AOP es otra forma de encapsular estas características y seguir la Responsabilidad Única al mover estas preocupaciones transversales (registro, manejo de errores, etc.) fuera de los componentes principales de su aplicación. Cuando se usa apropiadamente, AOP puede conducir a niveles más altos de mantenibilidad y extensibilidad en su aplicación con el tiempo.

Desarrollador SaaS
fuente