Pregunta

Entiendo la programación orientada a objetos, y he estado escribiendo programas OO durante mucho tiempo. La gente parece hablar de 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 del todo:

Programación orientada a aspectos frente a Programación orientada a objetos

¿Fue útil?

Solución

AOP resuelve el problema de inquietudes transversales , que sería cualquier tipo de código que se repita de diferentes maneras y que normalmente no se puede reformular completamente en su propio módulo, como con el registro o verificación. Entonces, con AOP puedes dejar eso fuera del código principal y definirlo verticalmente de la siguiente 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 aspect-weaver 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;
} 

Otros consejos

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

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

Vea una nueva implementación aquí: qi4j.org/

PS. 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.

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, hay un artilugio de idioma " fuera de banda " de código normal que puede inyectar de forma sistemática la seguridad o el inicio de sesión en rutinas que no las tienen de manera tal que, a pesar de que su código no lo suministre, se cuide.

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 funciona para eso.

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

Copiado de Spring in Action

  

AOP se define a menudo como una técnica que promueve la separación de   Preocupaciones en un sistema de software. Los sistemas se componen de 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 básica. Servicios del sistema tales como el registro,   gestión de transacciones, y la seguridad a menudo encuentran su camino en   Componentes cuyas responsabilidades centrales es otra cosa. Estos sistemas   servicios se conocen comúnmente como preocupaciones transversales porque   tienden a cortar varios componentes en un sistema.

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 su 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 una " configuración " atributo (decoración).

Hay un ejemplo de AOP, se usó AOP de primavera 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 /

AOP se puede usar para realizar acciones que no están relacionadas con la lógica de negocios 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. Normalmente hay dos maneras de lograr esto. Inyectar el código automáticamente por un preprocesador antes / después de un método, o adjuntar clases de proxy que interceptan una llamada de método y luego pueden ejecutar cosas antes / después de una llamada de método.

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

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

AOP es una forma de modular 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 moviendo estas preocupaciones transversales (registro, manejo de errores, etc.) de los componentes principales de su aplicación. Cuando se usa adecuadamente, el AOP puede llevar a niveles más altos de mantenibilidad y extensibilidad en su aplicación con el tiempo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top