2008-10-28 11 views
158

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 aprendí realmente qué es ni cómo usarla. ¿Cuál es el paradigma básico?¿Qué es la programación orientada a aspectos?

Esta cuestión está relacionada, pero no acaba de pedir que:

Aspect-Oriented Programming vs. Object Oriented Programming

+0

IMAO, el enlace que aparece en la pregunta tiene respuesta más clara y completa de la aceptada aquí. Las personas que leen esta pregunta pueden leerla primero. –

Respuesta

138

AOP aborda el problema de transversal se refiere, lo que sería cualquier tipo de código que se repite en diferentes métodos y normalmente no se pueden refactorizar completamente en su propio módulo, como con el registro o la verificación. Por lo tanto, la AOP se puede dejar que las cosas fuera del código principal y definir en forma vertical, así:

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 un aspecto tejedor se utiliza para compilar el código en este:

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; 
} 
+7

¿Necesita soporte de idiomas para esto, entonces? ¿En qué idioma está tu ejemplo? – Sophie

+3

Esto es 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. –

+15

En realidad, se llaman puntos :) :) –

0

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

8

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

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

imagen a una aplicación y que viene aquí: qi4j.org/

PS. En realidad, creo que una de las bellezas con AOP es también su talón de Aquiles: no intrusiva, dejando que la gente lo ignore si puede, por lo que será tratado como una preocupación secundaria en la mayoría de las organizaciones.

+2

Todavía contiene algunos puntos muy válidos, aunque – Ash

3

Copiado de un duplicado para la integridad (zumbador):

clase y el método de atributos en .NET son una forma de programación orientada a aspectos. Usted decora sus 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 un atributo de "configuración" (decoración).

5

Copiado de un duplicado de integridad (Einstein):

Los ejemplos clásicos son la seguridad y la explotación forestal.En lugar de escribir código dentro de su aplicación para registrar la ocurrencia de xo verificar el objeto z para el control de acceso de seguridad, hay un artilugio de lenguaje "fuera de banda" de código normal que puede inyectar sistemáticamente seguridad o iniciar sesión en rutinas que no tienen nativamente de tal manera que, aunque su código no lo suministre, se ocupa de ello.

Un ejemplo más concreto es el sistema operativo que proporciona controles de acceso a un archivo. Un programa de software no necesita verificar 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 una gestión de metadatos adecuada dentro de su sistema con un enfoque en el diseño estructural/de sistemas bien pensado.

2

Copiado del resorte en Acción

AOP se define a menudo 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 de los cuales es responsable de una función específica. 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 administración de transacciones y la seguridad a menudo encuentran su camino en los componentes , cuyas responsabilidades principales son otra cosa. Estos servicios del sistema se conocen comúnmente como preocupaciones transversales porque tienden a cortar a través de múltiples componentes en un sistema.

1

Hay un ejemplo de AOP, usó AOP de primavera como ejemplo. El ejemplo es bastante fácil de entender.

Spring El marco AOP (Aspect-oriented oriented framework) se usa para modular 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/

+0

En computación, 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. –

0

AOP puede ser utilizado para llevar a cabo acciones que no están relacionados con la lógica de negocio de la aplicación como la tala, el almacenamiento en caché, etc. Estas acciones se pueden poner en una parte separada de su aplicación y luego reutilizado en toda la aplicación. Generalmente hay dos formas de lograr esto. Inyectar código automágicamente por un preprocesador antes/después de un método, o unir clases proxy que interceptan una llamada a un método y luego pueden ejecutar cosas antes/después de una llamada a un método.

Aquí hay un ejemplo en .Net. Utiliza clases de proxy para interceptar las llamadas al método y ejecutar el código antes de las llamadas posteriores al método saif.

Aspect Oriented Programming (AOP) in .NET Core and C# using AutoFac and DynamicProxy

Cuestiones relacionadas