2008-10-13 15 views
12

¿Es posible realizar la Programación Orientada a Aspectos en Delphi? Me interesaría el soporte nativo y las soluciones de terceros.Compatibilidad con AOP en Delphi

No tengo un problema específico que quiero resolver con AOP, pero estoy simplemente interesado en estudiar AOP.

Respuesta

4

ClassHelpers en las versiones posteriores de Delphi permiten un nivel muy limitado de comportamiento de tipo AOP. Puede usar ClassHelpers para inyectar comportamiento en otras clases sin descender de ellas. Permite anular los métodos existentes y luego opcionalmente llamar a ese método existente.

La limitación es que debe declarar un ClassHelper para una clase específica y sus descendientes. Además, una clase solo puede tener un ClassHelper.

Estos son similares a los métodos de extensión en C#.

12

AOP depende de dos cosas:

  • la capacidad de inyectar código adicional en una unidad existente de código
  • Un mecanismo para colocar las condiciones en donde se debe inyectar código.

Esto se conoce comúnmente como código de tejido. Es una especialización dentro del estudio más amplio de la transformación del programa.

Los lenguajes compilados JIT tienen más opciones para implementar el entretejido de códigos que los programas compilados estáticamente porque se conserva más información en el bytecode/IL. También son compatibles con la reflexión, que ofrece la capacidad de manipular código en tiempo de ejecución.

Delphi.NET y Prism tienen el mismo acceso a estas capacidades que cualquier otro lenguaje .NET.

Existen dos marcos AOP para Delphi Win32 que conozco. El primero es MeAOP, que ya se ha mencionado. El segundo es Infra. Ambos proyectos adoptan un enfoque similar al AOP. Utilizan una combinación de RTTI y la manipulación inteligente del puntero para interceptar las llamadas a los métodos para que pueda ejecutar código adicional antes o después de la llamada al método. Usted define su característica transversal como una subclase de la clase AOP del marco. Registra los métodos que desea interceptar pasando el nombre del método como un argumento de cadena al marco AOP.

Ambas estructuras todavía se desarrollan activamente y tienen un alcance mayor que el AOP. Lamentablemente, la documentación es algo escasa (y en el caso de Infra principalmente en portugués)

Otro proyecto intentó AOP a través del código fuente que se remontaba en 2004 con cierto éxito. Básicamente, construyeron un tejedor de aspecto sobre una herramienta de transformación de programa de propósito general llamada DMS y lo usaron para inyectar código en los archivos fuente delphi antes de la compilación. Su aspecto orientado al lenguaje fue influenciado principalmente por AspectJ.

http://www.gray-area.org/Research/GenAWeave/ tiene enlaces al documento original y la presentación, así como algunos videos del proceso de transformación.

También es posible utilizar instrumentación de código de tiempo de ejecución para lograr esto. Es una técnica utilizada por algunos perfiladores para inyectar contadores y apilar trazas en código en ejecución sin modificar la fuente original. Se podría usar una técnica similar para inyectar preocupaciones de corte transversal en un ejecutable compilado estáticamente. El proyecto PinTool es un buen ejemplo de esto.

+0

Para el prisma Delphi, ahora hay soporte para AOP listo para usar: http://prismwiki.codegear.com/en/Cirrus – Miel

+0

AOP también se puede hacer utilizando una tabla de métodos virtuales ocultos (VMT), el tejido no es la única opción. – Johan

+0

¿Cuidar para elaborar? –

4

El DSharp operaciones de biblioteca AOP:
https://bitbucket.org/sglienke/dsharp
Más información se puede encontrar en: https://bitbucket.org/sglienke/dsharp

también echar un vistazo a TVirtualMethodInterceptor.
Está en el RTL desde Delphi 2010 y le permite hacer OnBefore, OnAfter, etc. llamadas a todos los métodos virtuales en una clase.
Esta llamada solo debe cubrir el must de lo que necesita utilizando Rtti, sin tejer, que es mucho más rápido que el tejido en tiempo de ejecución.