Double Dispatch
Es una técnica que permite añadir operaciones a las clases sin tener que modificarlas. La operación a ejecutar depende de la clase de petición (acepta) y del tipo de los dos receptores (Visitor, Elemento). Este patrón sirve para indicar que alguien (visitador) visitó a otra cosa, y así saber que eso ha sido visitado, por un visitador.
La idea básica es que se tiene un conjunto de clases que forman la estructura de un objeto. Cada una de estas clases elemento, tiene un método aceptar que recibe al objeto visitador como argumento.
El visitor es una interfaz que tiene un método visitor diferente para cada clase elemento, esto es visitorClase1, visitorClase2… visitorClaseN. En programación orientada a objetos, el patrón visitor es una forma de separar el algoritmo de la estructura de un objeto.
El método aceptar de una clase elemento llama al método visit de su clase. Clases concretas de visitor pueden entonces ser escritas para hacer una operación en particular.
El visitor es una interfaz que tiene un método visitor diferente para cada clase elemento, esto es visitorClase1, visitorClase2… visitorClaseN. En programación orientada a objetos, el patrón visitor es una forma de separar el algoritmo de la estructura de un objeto.
El método aceptar de una clase elemento llama al método visit de su clase. Clases concretas de visitor pueden entonces ser escritas para hacer una operación en particular.
Uno de los métodos visit de un visitor concreto puede ser pensado como métodos que no son de una sola clase, sino métodos de un par de clases: el visitor concreto y clase elemento particular. Así el patrón visitor simula el envío doble, que es lo que se conoce como Double-Dispatch, ésto en un lenguaje convencional orientado a objetos de envío único (Como Java o C++).
El patrón visitor también especifica cómo sucede la interacción en la estructura del objeto. En su versión más sencilla, donde cada algoritmo necesita iterar de la misma forma, el método aceptar de un elemento contenedor, además de una llamada al método visitor, también pasa el objeto visitor al método accept de todos sus elementos hijos.
Este patrón es ampliamente utilizado en intérpretes, compiladores y procesadores de lenguajes, en general y debe utilizarse cuando:
- Una estructura de objetos contiene muchas clases de objetos con distintas interfaces y se desea llevar a cabo operaciones sobre estos objetos que son distintas en cada clase concreta.
- Se quieren llevar a cabo muchas operaciones dispares sobre objetos de una estructura de objetos sin tener que incluir dichas operaciones en las clases.
- Las clases que definen la estructura de objetos no cambian, pero las operaciones que se llevan a cabo sobre ellas.
Si se quiere realizar un cierto número de operaciones, que no están relacionadas entre sí, sobre instancias de un conjunto de clases, y no se quiere “contaminar” a dichas clases, entonces este patrón es el ideal, ésto se observa mejor en el siguiente ejemplo:
Ejemplo de aplicación Patrón Visitor (Double Dispatch) |
Visitor: declara una operación de visita para cada uno de los elementos concretos de la estructura de objetos. Esto es, el método visit().
VisitorConcreto : implementa cada una de las operaciones declaradas por Visitor.
Element: define la operación que le permite aceptar la visita de un Visitor.
ConcreteElement: implementa el método accept() que se limita a invocar su correspondiente método del Visitor.
ObjectStructure: gestiona la estructura de objetos y puede ofrecer una interfaz de alto nivel para permitir a los Visitor visitar a sus elementos.
Consecuencias de uso
- Es fácil añadir nuevas operaciones a un programa utilizando Visitantes, ya que el visitante contiene el código en lugar de cada una de las clases individuales. Además, los visitantes pueden recoger las operaciones relacionadas en una sola clase en lugar de obligar a cambiar o derivar clases para agregar estas operaciones. Esto puede hacer al programa más sencillo de escribir y mantener.
- El patrón Visitante es útil cuando se desea encapsular buscando datos desde un número de instancias de varias clases. Los patrones de diseño sugieren que el visitante puede proporcionar una funcionalidad adicional a una clase sin cambiarla. Pero es más práctico decir que un visitante puede agregar funcionalidad a una colección de clases y encapsular los métodos que utiliza.
- Se pueden tener problemas con la encapsulación, la solución para ello es que como los atributos de los elementos no pueden ser públicos se hace que todo este en un mismo paquete, es decir, visibilidad de paquete.
- Como se comenta anteriormente, es difícil añadir nuevas clases de elementos, ya que obliga a cambiar a los visitantes.
- Facilita la acumulación de estado, es decir, acumular resultados.
Grupo Javascript
Merly Sánchez
Jorge Palacios
Se puede entender que DOBLE ENVIO se refiere no solamente en Internet a una técnica que involucra métodos virtuales, y muchas implementaciones en C ++ se basan en construcciones como plantillas para aliviar parte del complicado uso de la técnica ya que no está incorporada al lenguaje. Esto puede hacer que esas técnicas sean malas elecciones para el desarrollo de aplicaciones u otros escenarios donde se requiera un alto rendimiento de una simulación que procesa una gran cantidad de choques potenciales por paso, porque la sobrecarga de algunas de esas técnicas puede ser distinta de cero, en particular, consigue tener problemas de coherencia de caché o problemas en plataformas restringidas como consolas.
ReplyDeleteAdemás, como se basa en el despacho dinámico, la implicación es que todas las primitivas de forma deben heredar una clase base común, lo que no siempre es un diseño anhelado. En toda materia, el código de doble envío puede volverse demasiado complejo, lo que dificulta su mantenimiento o ampliación.
Por esta razón, es posible que desee explorar enfoques alternativos, como simplemente reducir el número de inconvenientes simples que tiene en su juego hasta el punto en que una simple tabla de funciones es suficiente para resolver la función de choque o implementar la parte de despacho de la técnica de forma manual. el doble despacho no soluciona todos los problemas
El Double Dispatch también es un patrón de diseño por lo tanto facilita y es de gran ayuda a la hora de desarrollar software. En este caso este se ocupa principalmente de solucionar situaciones donde el resultado de un comportamiento no solo depende de un objeto que se encarga de recibir un mensaje sino que este a su vez es dependiente de los parámetros enviados en dicho mensaje. También resulta importante aquí mencionar que el mejor uso que se le puede dar al Double Dispatch es implementándolo para evitar el code smell, ya que este es cualquier señal en el código fuente de que un programa posiblemente tenga indicios de un problema más profundo, claro este tipo de double dispatch necesita de un diseño mucho mas laborioso.
ReplyDeleteComo ya Yorgelis y Andres expresaron, la capacidad de Double dispatch es ampliamente utilizado cuando en nuestro código existe un síntoma de un problema de diseño profundo que puede afectar el mantenimiento de nuestro sistema. Sin embargo, esta técnica que permite añadir operaciones a las clases sin tener que modificarlas como se mencionó a principios del post, a veces se confunde con una forma del Patrón de Estrategia donde este se caracteriza ser un patrón de diseño de software conductual que permite seleccionar un algoritmo en tiempo de ejecución. Mientras Double dispath tiene la capacidad de seleccionar dinámicamente un método no solo de acuerdo con el tipo de tiempo de ejecución del receptor (envío único), sino también de acuerdo con el tipo de tiempo de ejecución del argumento. Otra impórtate acotación y se debe aclarar es que dependiendo del lenguaje, se puede resolver de diferentes maneras el problema, algunos lenguaje admiten el Double dispatch directamente. El patrón de visitante es un patrón que se puede usar para resolver diferentes problemas. En el caso de C++, por ejemplo, es la solución más frecuente (pero no la única) utilizada para el Double dispatch, pero no se usa exclusivamente para eso.
ReplyDeleteEntonces, se puede decir que el despacho doble es una forma especial de despacho múltiple, y un mecanismo que distribuye una llamada de función a diferentes funciones concretas dependiendo de los tipos de tiempo de ejecución de dos objetos involucrados en la llamada. En la mayoría de los sistemas orientados a objetos, la función concreta que se llama desde una llamada de función en el código depende del tipo dinámico de un solo objeto y, por lo tanto, se conocen como llamadas de envío único o simplemente llamadas a funciones virtuales.
ReplyDeleteEsta vendría siendo un patrón de diseño para resolver situaciones en las que el comportamiento resultante no depende solamente del objeto que recibe el mensaje sino también de parámetro enviado en ese mensaje.
Indagando un poco mas el despacho doble es otra solución que reduce gradualmente el polimorfismo en los sistemas que no admiten envíos múltiples.
El envío doble es útil en situaciones donde la elección del cálculo depende de los tipos de tiempo de ejecución de sus argumentos. Podemos indicar que a la hora de programar se podría usar el despacho doble cuando al ordenar un conjunto mixto de algoritmos de objetos requiere que una lista de objetos se ordene en un orden acorde. Decidir si un elemento viene antes que otro elemento requiere el conocimiento de ambos tipos y posiblemente algún subconjunto de los campos
Como se ha mencionado en este post, los patrones de diseño nos permiten solucionar diferentes problemas en el desarrollo de software. Para la mayoría de los problemas a los que nos enfrentemos a la hora de diseñar una cierta aplicación, podremos encontrar algún patrón de diseño que nos ayude a plantear de forma adecuada el problema y nos facilite, de esta forma, su solución.
ReplyDeleteTodo patrón de diseño debe ser reusable y, por lo tanto, aplicable a diferentes problemas de diseño en distintas circunstancias. Este patrón sirve para indicar que alguien (visitador) visitó a otra cosa, y así saber que eso ha sido visitado, por un visitador. En programación orientada a objetos, el patrón visitor es una forma de separar el algoritmo de la estructura de un objeto. La idea básica es que se tiene un conjunto de clases que forman la estructura de un objeto. Cada una de estas clases elemento, tiene un método aceptar que recibe al objeto visitador como argumento.
El patrón visitor especifica cómo sucede la interacción en la estructura del objeto. En su versión más sencilla, donde cada algoritmo necesita iterar de la misma forma, el método aceptar de un elemento contenedor, además de una llamada al método visitor, también pasa el objeto visitor al método accept de todos sus elementos hijos. Este patrón es ampliamente utilizado en intérpretes, compiladores y procesadores de lenguajes, en general.
Double dispatch (despacho múltiple) como lo han dicho mis compañeros en comentarios anteriores este es también un patrón de diseño que es muy útil para mantener el nivel deseado de separación entre los actores. Claramente como se ha dicho este patrón permite añadir operaciones a las clases sin tener que modificarlas, lo que implica que en este patrón al agregar un nuevo método a las clases de todos los posibles objetos de los parámetros y luego llamarlo desde el método original con el receptor como parámetro. Un patrón de diseño que hace uso de esta técnica es el patrón Visitor se basa en el principio de envío doble (Double dispatch), pero este no es su objetivo principal. El patrón la verdad es que al final es un patrón que conlleva un acoplamiento enorme entre los Visitors y los visitados. Entonces cada vez que se añade un nuevo tipo de elemento a visitar, obliga a tocar todos los visitors que ya existen.
ReplyDeleteEl Double dispatch (Doble despacho) de acuerdo con la información posteada, forma parte de los patrones que tienen mayor utilidad, posee diferentes funcionalidades pero en algunos casos sirve especialmente cuando se deseen realizar diferentes operaciones sobre algunas instancias de la clase sin necesidad de afectar dichas clases. Cómo los diferentes métodos posee ciertos beneficios y desventajas, puesto que se considera un mecanismo que llama a la función dependiendo del tipo de objeto y que añade operaciones sin modificar sus clases, cuenta también con que se puede presentar una duplicación de código produciendo que la interfaz no tenga gran flexibilidad. Este tipo de métodos en sí, busca simular un polimorfismo doble, comportándose de manera distinta de acuerdo no sólo al objeto que ha sido invocado por el método sino también al parámetro que recibe.
ReplyDeleteAsí mismo es, el Double Dispatch es capaz de cambiar el comportamiento dependiendo de la clase de la persona que llama, y no solo en la clase llamada .Este mecanismo termina seleccionando el método a ejecutar en base a dos argumentos/objetos. ¿A qué les suena esto? Polimorfismo ¿verdad? Que básicamente se refiere a la capacidad de dos (o más) objetos de responder a un mismo mensaje. Permitiendo a un tercer objeto, el cliente de ellos, abstraerse de las implementaciones y sus diferencias. Bueno este despacho doble efectivamente trabaja con polimorfismo para realizar su función que es resolver la selección del método a utilizar.
ReplyDeleteEsta técnica es una solución común para proporcionar colaboradores a clases de entidades (por ejemplo, usuario, publicación, grupo, artículo ...) de un modelo de dominio. Con Double Dispatch, no necesitamos introducir otros objetos en Entidades, no sería muy apropiado, pues este tipo de dependencias se usa solo en uno o dos métodos.
Como ya se ha mencionado en este post, el Double dispatch es un truco que permite usar enlaces dinámicos junto con métodos sobrecargados, es decir, busca resolver situaciones en las que el comportamiento resultante no depende solamente del objeto que recibe el mensaje sino también de parámetro enviado en ese mensaje...... Dado que Double Dispatch es una técnica para llamar a métodos sobrecargados virtuales basados en tipos de parámetros que existen dentro de una jerarquía de herencia, su uso puede ser un síntoma de que se violan los principios de Open / Closed y Single responsibility, o que las responsabilidades pueden estar desalineadas. . Esto no quiere decir que cada caso de Doble Despacho significa que algo anda mal, pero solo que su uso debería ser una bandera para reconsiderar su diseño a la luz de las futuras necesidades de mantenimiento.Si bien hay algunos usos válidos de Double Dispatch, la propia naturaleza de la técnica tiende a conducir a una violación de los principios de Open / Closed y Single Responsibility.
ReplyDeleteEl despacho doble es otra solución que reduce gradualmente el polimorfismo en los sistemas que no admiten envíos múltiples.Ahora bien, el envío doble es útil en situaciones donde la elección del cálculo depende de los tipos de tiempo de ejecución de sus argumentos. Por ejemplo, un programador podría usar el despacho doble en situaciones como; ordenar los algoritmos de un conjunto mixto de objetos o sistemas de bloqueo y llave, sistemas de manejo de eventos o sistemas de gestión de personal, entre otras situaciones que se nos pudieran presentar.
Con la información proporcionada se puede decir que el doble de despacho es un patrón de diseño utilizando el jefe del visitante para implementar parcialmente el múltiple de despacho, que se extiende de un solo despacho utilizando el tipo dinámico de los argumentos.
ReplyDeleteEl principio es agregar un método en las clases de los argumentos llamado gracias al polimorfismo. Este método llama al método original con este puntero en el argumento cuyo tipo real se conoce en tiempo de compilación. Entonces el doble despacho es exactamente lo que es, una forma de que el software resuelva en tiempo de ejecución los métodos para ejecutar. Este tipo de patrón de diseño sirve para resolver situaciones en las que el comportamiento resultante no depende solamente del objeto que recibe el mensaje sino también de parámetro enviado en ese mensaje. Veamos un caso concreto para entender mejor esta situación.
Entre los patrones de diseño Encontramos el visitor o visitador que en un tipo de patrones conductista otro ejemplo de este tipo de patrones es el observador. Teniendo siempre presenta el objetivo principal de los patrones de diseño es que permite la reutilización de código al programador y hacer un poco más suave su trabajo mientras se programa o se crea un software. El visitor en una interfaz que tiene un método visitor diferente para cada clase elemento, como ya fue mencionado en el pots; su operación clave y de beneficio para nosotros es que permite que se le pueden anexar operaciones a las clases sin tener que ser totalmente modificadas, define una nueva operación a las ya existente. El doble envió que simula este patrón de diseño se conoce como Double Dispatch, en la ingeniería de software el doublé dispatch es una forma especial de despacho múltiple. También tiene como beneficio agrupar las operaciones relacionadas y permite visitar objetos que no están relacionados pero que tienen un padre en común.
ReplyDeleteDouble dispatch, como ya lo han dicjo intenta resolver la selección del método, pero utilizando polimorfismo. Específicamente resuelve el problema y no pregunta simplemente lo hace, en lugar de que el trabajador le pregunte de qué clase es al material, le va a llamar a un método diciéndole "decime vos quien sos, llamándome a diferentes métodos". asi funciona
ReplyDeleteUna de las cosas bellas acerca de la orientación a objetos (OO) es la noción de que el comportamiento del sistema no tiene que ocurrir en un solo objeto. En cambio, debería ocurrir en las interacciones entre objetos. Lo que un objeto trajo a la mesa fue una serie de métodos que realizan pequeñas unidades de trabajo primitivas. Para obtener un comportamiento útil, uno tenía que agrupar otros objetos (o actores) que también contenían métodos que por sí solos no parecían lograr mucho. El poder de esto es que estas pequeñas unidades de trabajo podrían reutilizarse en una variedad de situaciones. Las situaciones deben ser impulsadas por un actor o directorio más poderoso que reúna todas las piezas e impulse las interacciones necesarias para crear el resultado deseado.
ReplyDeleteTécnicamente, Double Dispatch se refiere a una técnica utilizada en el contexto de un método polimórfico para mitigar la falta de soporte multimétodo en los lenguajes de programación. Más simplemente, Double Dispatch se usa para invocar un método sobrecargado donde los parámetros varían entre una jerarquía de herencia. Desde mi punto de vista no estoy de acuerdo con las sobrecargas pero existen oportunidades en las que se puede necesitar acceder a diferentes métodos, es por esto que pueden ocurrir oportunidades en las que se haga necesario este método de doble despacho.Tenemos que conocer tambien si el lenguaje en el que estamos desarrollando permite el doble despacho para asi, leer un poco la documentacion y saber como se puede aplicar el doble despacho (en caso de necesitarlo) de una manera correcta y no tener inconvenientes a la hora de programar ya que este metodo podria ser un poco "delicado" por asi decirlo.
Por como ustedes lo plantean es una buena solución para suavizar la falta de soporte de varios métodos en cualquier lenguaje de programación, proporcionando colaboradores a clases de entidades de un modelo de domino. Se usa para invocar un método sobrecargado donde los parámetros varían entre una jerarquía de herencia. A veces no podemos incluir colaboradores en dichas clases, ya que el mapeo objeto-relacional no es capaz reconstituir los objetos a menos que configure algún detector que pase por cada objeto reconstituido lo cual imposibilita el uso de las características propias de la orientación a objetos como herencia y polimorfismo. Por otra parte, el usar este tipo de estructuras puede ser un síntoma de un problema con el diseño como se ha mencionado en clases anteriores, por lo tanto sería preferible no usarlas por lo complicadas que pueden llegar a ser, afectando a futuro el mantenimiento del software.
ReplyDeleteComo se ha dicho anteriormente el Double Dispatch es una técnica que permite añadir operaciones a las clases sin tener que modificarlas. La operación a ejecutar depende de la clase de petición y del tipo de los dos receptores (Visitor, Elemento). Es recomendable el uso de esta tecnica cuando: Una estructura de objetos contiene muchas clases de objetos con distintas interfaces y se desea llevar a cabo operaciones sobre estos objetos que son distintas en cada clase concreta. Se quieren realizar muchas operaciones distintas sobre los objetos de una estructura, sin incluir dichas operaciones en las clases o las clases que forman la estructura de objetos no cambian, pero las operaciones sobre ellas sí.
ReplyDeleteAudoble dispatch es una técnica utilizada para agregar clases sin hacer ningún tipo de modificaciones. Existen un conjunto de clases que comprenden la estructura de un objeto. La operación a ejecutar depende de la clase de petición y de los receptores. Con esto se logra que se pueda visualizar cuando se está siendo visitado y cuando un visitador visitó otra cosa.
ReplyDeletePara hacer una operación en particular, se utiliza una clase concreta de Visitor. El Visitor es una interfaz que posee un método Visitor distinto para cada clase. Con este patrón se logra separar el algoritmo de la estructura de un objeto.
Los Visit de un Visitor, también pueden interactuar como métodos que no son de una sola clase, sino de un par de clases. Para que el double-dispatch se ejecute, el Visitor simula un envío doble, dentro de un lenguaje tradicional de a objetos de envíos únicos como (C++ y Java) .
Todos y cada uno de los algoritmos necesitan iterar de la misma manera, lo que hace que el patrón Visitor registre todas las actividades e iteraciones que están ocurriendo y procese la información de manera específica. El método aceptar de un contenedor, además de una llamada al método receptor, el objeto Visitor al método accept, todos forman parte sus elementos descendientes y por ende, deben pasar por ellos.
Es tipo de patrón es utilizado en su mayoría en copiladores y procesadores e intérpretes de lenguajes. Por lo general, dentro de una estructura de objetos, hay muchas clases de objetos, existen operaciones dispares sobre objetos de una estructura de objetos sin tener que incluir dichas operaciones en las clases.
Para la aplicación de patrón visitor double dispatch es necesario que intervengan el element, que es quien concreta la operación que permite dar paso para aceptar visita de un visitor. ConcreteElement, implementa el método accept que se limita a invocar su correspondiente método del Visitor, mientras que declara una operación de visita para cada uno de los elementos concretos de la estructura de objetos. El visitorconcreto, es aquel que implementa cada una de las operaciones declaradas por Visitor y por último, ObjectStructure que condiciona la estructura de los objetos y puede dar un interfaz de alto nivel para permitir a los Visitor visitar sus elementos.
• Dentro de las consecuencias de uso, tenemos que: es difícil agregar nuevas clases de elementos porque obliga a cambiar a los visitantes. Facilita la acumulación de estado, es decir, acumular resultados. Es accesible añadir nuevas operaciones a un programa utilizando Visitantes, puesto que el visitante contiene el código en lugar de cada una de las clases individuales. Esto hace al programa más sencillo de escribir y de mantener. El patrón Visitante es muy aprovechable cuando se desea encapsular buscando datos desde un número de instancias de varias clases. Pero es más práctico decir que un visitante puede agregar funcionalidad a una colección de clases y encapsular los métodos que utiliza.
Si se usa Double Dispatch en un código, esto puede ser un síntoma de un problema de diseño subyacente que puede afectar el mantenimiento de una aplicación. Debido al hecho de que Double Dispatch a veces se confunde con una forma del Patrón de Estrategia , una descripción general puede ser para continuar con esta afirmación. El patrón de despacho doble es una forma de crear un comportamiento dinámico sostenible basado en el receptor y los tipos de parámetros. En lenguaje como C ++, C #, Java, este mecanismo no existe y el despacho de tipo de tiempo de ejecución funciona básicamente con un solo parámetro que, al ser solo uno, se hace implícito en la función al hacer que la función sea miembro de la clase.
ReplyDelete