Friday, 14 August 2009

AOP (Programación Orientada a Aspectos) con Delphi

MeAOP, es una librería Open Source de Riceball LEE para la programación orientada a aspectos con Delphi. El funcionamiento es un poco similar al desarrollado por java, el cuál comenté hace bastante tiempo en el artículo: AOP Aspect Oriented Programming. Mediante éste método ayudamos al programador a configurar una serie de aspectos que no estarán dentro de nuestra clase, haciendo el código mucho más entendible. La versión actual de MeAOP está en una fase muy temprana, y aún tienen muchas cosas que arreglar. Aunque he podido probar la última versión del framework, he podido comprobar que utiliza una serie de componentes utilizando un método llamado inyección de código que también expliqué en su día. Lo que hace la librería, es interceptar métodos y crea un pre y un post para que nosotros hagamos lo que queramos en éstas llamadas. Aún no hay mucha documentación del proyecto, y podréis encontrar un pequeño documento de texto en el framework. Aquí os propondré un pequeño ejemplo interceptando la acción de un botón y mostrando un resultado antes y después de la acción, sin tener que añadir nada. Simplemente configurando los aspectos.

La lista de las características que trae MeAOP son las siguientes:
  • Authentication
  • Caching
  • Context passing
  • Error handling
  • Lazy loading
  • Debugging
  • logging, tracing
  • profiling
  • monitoring
  • Performance optimization
  • Persistence
  • Resource pooling
  • Synchronization
  • Transactions
  • Remote Method Calling
Configurando la librería:

Primero debemos descargar la última versión estable de su SDK, que en éste caso es la MeSDKv1.2 y que podéis descargar aquí. Una vez descargada, tenemos que configurar las fuentes del proyecto. Abrimos el Delphi, y nos dirigimos a Tools -> options, luego en el nodo Environment Options -> Delphi Options -> Library - Win32, y en library path, añadimos las siguientes rutas:


Ahora creamos nuestro proyecto con el siguiente código:

unit Unit3;

interface

uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, uMeSystem, uMeTypInfo, uMeInterceptor, uMeFeature, uMeLog,
    uStringsLogger, uLogFeature, uLoginFeature, uLoginManager;

type
    TForm3 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
    private
        FLogStrs: PStringsLogger;
        procedure DoLoginStatus(Sender: TObject);
    public
        { Public declarations }
    end;

var
    Form3: TForm3;
    GLogFeature: TMeLogFeature;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
begin
    ShowMessage('Hello!');
end;

procedure TForm3.DoLoginStatus(Sender: TObject);
begin
    if Sender is TLoginManager then
        if TLoginManager(Sender).IsLogined then
            Caption := 'Logined'
        else
            Caption := 'not Logined';
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
    FLogStrs := New(PStringsLogger, Create(Memo1.Lines));
    GLogger.AddLogger(FLogStrs);
    GLogger.Level := vlDebug;
    GLogger.Active := True;
    GLogFeature := TMeLogFeature(TMeLogFeature.AddTo(TForm3, @TForm3.Button1Click, 'Button1Click'));
    GLoginManager.OnStatus := DoLoginStatus;
end;

initialization
    TMeLoginFeature.AddTo(TForm3, @TForm3.Button1Click, 'Button1Click', TypeInfo(TNotifyEvent));

end.

si observamos su ejecución, podemos comprobar como cumple con los diversos aspectos programados, la parte de login y de mostrar información pre y post.


Ahora, solo hay que jugar un poco más con la librería para explotar todas sus opciones. Muy buen trabajo el de Riceball LEE.

  • Enlaces de interés:
Framework de AOP en delphi.

1 comment:

  1. This is very informative. Could you please attach the sample application as well?

    ReplyDelete