Patrones de Ruby on Rails - decorador vs presentador

112

Últimamente se habla de todo tipo en la comunidad de Ruby on Rails sobre decoradores y presentadores.

¿Cuál es la diferencia esencial entre los dos? Si es así, ¿cuáles son las pistas que me dicen cuál usar sobre el otro? ¿O quizás usar los dos en conjunto?

keruilin
fuente

Respuestas:

102

Un decorador es más un "agreguemos algunas funciones a esta entidad". Un presentador es más bien un "construyamos un puente entre el modelo / backend y la vista". El patrón de presentador tiene varias interpretaciones.

Los decoradores son genéricos / de uso general. Los presentadores tienen una gama más limitada de responsabilidades / usos. Los decoradores se utilizan en todos los dominios, los presentadores casi siempre están relacionados con la funcionalidad de visualización.

Dave Newton
fuente
3
Gracias. Parece que la gema de Draper es un híbrido de presentador y decorador.
keruilin
17
@keruilin Una cosa a tener en cuenta: los decoradores realmente deberían poder decorar a otros decoradores (además de decorar el objeto componente), porque uno de sus propósitos es sortear las limitaciones de la herencia. (Draper no hace esto). El patrón del decorador es muy similar al patrón compuesto en ese sentido, excepto que se maneja de afuera hacia adentro en lugar de adentro hacia afuera (si eso tiene sentido).
manchar el
7
Veo al decorador como un patrón de propósito general y al presentador como una aplicación específica del decorador relacionada con la capa de visualización.
Kris
2
@Smudge, los decoradores de cortinas pueden decorar otras decoraciones, al menos como si los modelos subyacentes tuvieran una relación STI.
keruilin
Parece que ahora Draper se identifica a sí mismo como envoltorio de la capa de presentación, por lo que ya no es un decorador, sino un presentador en realidad. De su GH: "Draper agrega una capa orientada a objetos de lógica de presentación a su aplicación Rails".
Jared
35

Le sugiero que compruebe esto: Exhibición vs Presentador .

Decorador es un patrón de diseño que se utiliza para ampliar la funcionalidad de un objeto específico envolviéndolo, sin afectar otras instancias de ese objeto. En general, el patrón de decorador es un ejemplo del principio de apertura / cierre (la clase está cerrada para modificaciones, pero disponible para extensiones).

Tanto los patrones de exhibición como de presentador son una especie de patrón de decorador.

dpaluy
fuente
+1 por vincular a esa publicación de blog de Mike Pack. Excelente publicación que explica las diferencias entre los patrones.
ki4jnq
+1 por mencionar el patrón de exhibición. Terminé recibiendo el libro de Avdi Grimm que lo explica. Aunque no fue la solución adecuada para mi problema, sigue siendo un patrón sorprendente. Excelente alimento para el pensamiento.
Yonk