Wrappers to the rescue (Diseño Avanzado con Objetos)

De Cuba-Wiki

Wrappers to the rescue
Wrappers: Mecanismo para introducir nuevo comportamiento que es ejecutado antes, luego o incluso en lugar del metodo existente.


Compiled Methods:
Conoce una serie de byte codes que definen lo que hace el metodo, un literal frame que contiene objetos que son utilizados mientras se ejecuta el metodo, una clase, que es donde fue compliado el metodo, y un entero que es un "puntero" al codigo fuente del metodo.


Alternativas para implementar method wrappers:

Source Code Modifications:

Se inserta el codigo del wrapper en el codigo fuente del metodo original, y se vuelve a compilar el metodo.
Desventajas: Requiere compilar el codigo, para agregar el wapper, y compilarlo denuevo para quitarlo. Esto es muy lento, y no se puede hacer en una imagen sin el compilador.

Byte Code Modifications:

Se modifica el byte code del metodo que se quiere wrappear. Ventajas: Es relativamente rapido.
Desventajas: Es muy complicado, ya que se tienen que cambiar los byte codes originales a byte codes equivalentes para un bloque, que sea llamado por valueNowOrOnUnwindDo:. No es portable.

New Selectors:

Mover el metodo original a un nuevo selector, y poner el method wrapper en el original.
Ventajas: No se tiene que recompilar el metodo original. Se pueden crear los method wrappers clonando otros de la misma cantidad de argumentos.
Desventajas: Hay que modificar los browsers, para que los nuevos selectores no sean visibles al usuario. Los nuevos selectores pueden traer conflictos con selectores de la super clase, o alguna subclase, o con un selector del usuario.

Dispatching Wrappers:

Reemplazar el objeto a wrappear con un proxy (Implementado con doesNotUnderstand:) que "monitoree" todos los mensajes que se envian.
Desventajas: Muy lento.

Class Wrappers:

Subclasificar la clase de los objetos que se quieren wrappear, y en dicha clase poner los methods wrappers deseados, que hagan el before, llamen a super del metodo, y luego el after.
Desventajas: Es muy lento, se debe cambiar la clase de todos los objetos a wrappear.

Instance Wrappers:

Es como el Class Wrappers, pero en vez de cambiar de clase todos los objetos de la clase wrappeada, cambiamos de clase solo los que nos interesan.

Method Wrappers:

Se reemplaza el metodo que se quiere wrappear, por un objeto polymorfico a el en dicho contexto, que cuando se "ejecuta", hace el before, llama al metodo original, y luego hace el after.
Ventajas: Los method wrappers se pueden crear a travez de un prototipo con la misma cantidad de argumentos.


Herramientas y extenciones que se construyeron usando wrappers:

Coverage Tool (Image Stripper):

Usar methods wrappers para detectar las clases y metodos que no son utilizados, y removerlos de la imagen.

Class Collaboration Diagram Tool:

Usar methods wrappers para monitorear los mensajes enviados, guardando la clase del sender y el receiver de cada mensaje y luego graficar las clases, uniendolas si sus instancias colaboran.

Interaction Diagram Tool:

Usar methods wrappers para monitorear los mensajes enviados, guardando los mensajes con los que colaboro cada par de objetos, y luego graficarlo.

Synchronized Methods:

Usar methods wrappers para limitar el acceso a un recurso. Puede sincronizar el acceso a el metodo original, o al objeto completo. Esto es una implementación de monitores con methods wrappers.

Assertions:

Implementar pre y post condiciones en smalltalk usando methods wrappers.

Multimethods:

Implementar multimethodos (CLOS) en smalltalk. Son mensajes para los cuales el metodo que se ejecutara para responderlo, se elije discriminando segun el receptor y todos los colaboradores enviados en el mensaje.

Conclusiones:

Smalltalk al ser un ambiente totalmente reflexivo y abierto, permite cambiar el modo en que los diferentes objetos del programa interactuan, lo que permite hacer un gran numero de modificaciones a como funciona el entorno, con extrema facilidad.