Hola, este video explicará una característica importante de Pharo,
el gancho doNotUnderstand.
Ya habrás visto ya una ventana de depuración con este mensaje.
De dónde viene ¿Y, para qué es esto?
Veamos un ejemplo.
Tenemos el objeto node1.
Enviaremos este objeto el mensaje coucou:stef.
Desde el nodo1, seguimos el método de búsqueda
Volver a la clase del objeto.
No encontramos el método coucou en esta clase.
Entonces, vamos a la superclase, pero tampoco está allí.
El sistema virtual nos informa
que no puede encontrar un método coincidente, por lo que reifica el mensaje.
Discutimos sobre la reificación en el video. en introspección y reflexión.
Reify significa representar Un concepto implícito como un objeto.
Aquí, es un mensaje.
Creamos un objeto para representar el mensaje
Es una instancia de clase de mensaje.
El sistema virtual reenviará un mensaje
al objeto node1.
Envía el mensaje doesNotUnderstand, Pasando el objeto como un parámetro.
Esta es una nueva ejecución. del algoritmo de búsqueda.
El sistema no encontrará el método doesNotUnderstand en la clase Node.
Entonces regresa para buscar en la superclase.
Encuentra el método, abreviado a DNU.
Ahora puede ejecutar el método ahora.
Does Not Unstandstand es un mensaje
que la maquina virtual te envía a los objetos
cuando un mensaje ha fallado
Todas las clases pueden redefinir este método.
para darle un comportamiento específico cuando no se comprende un mensaje
Este método es una herramienta importante.
Eso nos permite construir muchas características.
Se usa en la delegación automática,
programación distribuida, y así sucesivamente.
Aquí veremos algunos usos de doesNotUnderstand.
Supongamos que queremos redirigir Todos nuestros mensajes a un objeto diferente.
En una simple delegación, creo un objeto que almacena el objetivo,
donde se enviarán los mensajes.
Redefinir el método doesNotUnderstand.
Lleva el objeto un mensaje como un parámetro,
que contiene el selector de mensajes fallidos.
Entonces puedo preguntar este mensaje para reenviarse.
Uso sendTo:self target, que es la variable de instancia.
Reenvío el mensaje a otro objeto.
Ten cuidado, esta es una función poderosa.
eso puede interferir con La legibilidad del código.
Como se explica aquí.
El código mostrará quien finalmente recibe el mensaje.
Es muy útil para construir herramientas.
y la construcción de mecanismos avanzados.
Otro ejemplo que veremos es LoggingProxy.
La idea básica aquí
es crear un objeto mínimo que contiene pocos métodos,
y para personalizar its doesNotUnderstand:method.
Luego intercambiaremos un objeto de dominio
con este proxy, o objeto mínimo, usando "convertido".
Primero, creamos un objeto proxy.
Le damos un objeto al objeto proxy,
que es el objeto vamos a reemplazar,
o el objetivo.
Agregamos InvocationCount para incrementar el contador con cada mensaje
Ponemos el contador en inicializar a 0, ya que no ha recibido mensajes
Luego agregamos el tema, que es lo que será reemplazado.
Ahora redefinimos el método DNU en este proxy.
Cada vez que un nuevo mensaje No se entiende,
su recepción aparece en la transcripción, y el contador se incrementa.
Luego reenviamos el mensaje al sujeto
Como antes, redirigimos el mensaje a otra parte.
Para sendTo, como ves en la implementación de la clase Mensaje,
simplemente utilizamos el método Perform con argumentos
Ya explicamos esto en un curso anterior
Veamos un ejemplo.
¿Cómo utilizamos este LoggingProxy?
Vamos a crear una instancia, el punto objeto.
Luego usaremos "convertido"
para que todo eso apunta a este punto
inadvertidamente señale a LoggingProxy,
a lo que instamos.
Ahora si enviamos mensajes al punto del objeto,
observando que "convertirse" ahora es una instancia de LoggingProxy,
cada vez que le enviemos un mensaje,
se mostrará en la transcripción
y el contador se incrementará.
esto es lo que hicimos en doesNotUnderstand
Al final, el contador muestra un valor de 3.
Hay limites al marco del proxy,
como se ve en el último ejemplo.
Por ejemplo, no podemos capturar mensajes que un objeto envía a sí mismo.
Eso se vuelve complicado.
No podemos usar "convertirse" con clases, ya que los modelos reflectantes tienen limitaciones.
También es arriesgado cuando el proxy y el objeto a reemplazar
Ambos entienden el mismo mensaje.
Cuando envío el mensaje al proxy,
responderá, en lugar de capturarlo con DNU
y transfiriéndolo al objeto de destino.
Pharo tiene otros más poderosos marcos proxy que atrapan todo,
pero son más complejos que este simple ejemplo.
Otro ejemplo de cómo aplicar esta técnica
es generar dinámicamente accesores, o incluso métodos.
Aquí he redefinido el método doesNotUnderstand.
Veo que se ha recibido un mensaje,
entonces pruebo si tengo la instancia variables que incluyen el mensaje.
Si es así, genero un nuevo método usando "compilar"
para definir un nuevo método para la clase.
Esto devolverá el valor de la variable
Aquí estoy generando el read-accessor de la variable.
Si el mensaje enviado no coincide con el nombre
de una variable de instancia, Envío un super doesNotUnderstand.
Esto nos permite cargar read-accessors automáticamente,
Dependiendo de si han sido llamados o no.
En conclusión,
Hemos visto cómo usar objetos mínimos.
No son instancias directas de la clase de objetos,
pero de la clase de objeto proto.
Pueden ser la base de proxies.
Al redefinir doesNotUnderstand método, podemos capturar
la existencia de un mensaje fallido y luego redirigir el mensaje.
Es un gancho poderoso que proporciona la base de muchas herramientas en Pharo.
Pero debes ser muy cuidadoso cuando lo usas
Solo se debe usar cuando sea necesario.
No lo coloque en el código de dominio todavía, Es una técnica muy avanzada.