Patrón de diseño para aplicar la conversión a múltiples propiedades en múltiples clases

StackOverflow https://stackoverflow.com/questions/254060

  •  05-07-2019
  •  | 
  •  

Pregunta

Estoy usando el editor de reducción de formato WMD en un proyecto para una gran cantidad de campos que corresponden a una gran cantidad de propiedades en una gran cantidad de clases de Entidad. Algunas clases pueden tener varias propiedades que requieren la reducción.

Estoy almacenando el markdown en sí mismo, ya que esto facilita la edición de los campos más adelante. Sin embargo, necesito convertir las propiedades a HTML para mostrarlas más adelante. La pregunta es: ¿hay algún patrón que pueda usar para evitar escribir el código de conversión de reducción en todas mis clases de entidad?

Creé una clase de utilidad con un método que acepta una cadena de reducción y devuelve el HTML. Estoy usando markdownj y esto funciona bien.

El problema es que para cada propiedad de cada clase que almacene markdown, es posible que necesite otro método que se convierta a HTML:

public class Course{

     private String description;
     .
     .
     .
     public String getDescription(){
          return description;
     }

     public String getDescriptionAsHTML(){
          return MarkdownUtil.convert(getDescription());
     }
     .
     .
     .
 }

El problema es que si la clase del curso tiene 2 propiedades más, la matrícula y los requisitos previos dicen que ambos necesitan convertidores, entonces tendré que escribir getTuitionAsHTML () y getPrerequisiteAsHTML ().

Lo encuentro un poco feo y me gustaría una solución más limpia. Las clases que requieren esto no forman parte de una sola jerarquía de herencia.

La otra opción que estoy considerando es hacer esto en el controlador en lugar del modelo. ¿Qué piensas sobre esto?

Gracias.

[EDITAR]: Nuevos pensamientos (Gracias Jasper). Dado que el proyecto usa struts2 (no dije esto antes), pude crear un componente de vista que diga que convertirá el markdown para mí. Luego lo uso donde sea necesario para mostrar el valor como HTML.

¿Fue útil?

Solución

  

Las clases que requieren esto no forman parte de una sola jerarquía de herencia.

Deben al menos implementar una interfaz común, de lo contrario, encontrar una solución genérica limpia va a ser incómodo.

  

La otra opción que estoy considerando es hacer esto en el controlador en lugar del modelo. ¿Qué piensas sobre esto?

Esto es claramente una responsabilidad de la Vista. La regla # 1 de MVC es que el modelo no se preocupa por su representación, la reducción en este caso.

Sin embargo, creo que hay pocos detalles sobre su arquitectura actual para dar una respuesta significativa a su pregunta.

Otros consejos

Tienes una opción para hacer esto si no puedes usar la herencia o una interfaz. Lo sé, lo sé refactor, pero esto es realidad y sucede * hit.

Puede usar la reflexión para iterar sobre sus propiedades y aplicarles el formato. Puede etiquetarlos con un atributo o puede adoptar un esquema de denominación (frágil, pero aún así es una opción).

Ignorando los problemas arquitectónicos, creo que la respuesta simple podría ser:

public String getDescription(MarkDownUtil converter)
{
    if (converter == null) return description;
    else return MarkdownUtil.convert(description);
}

Incluso mejor sería hacer que MarkDownUtil implemente IStringConverter, y podría haber varios StringConverters diferentes para diferentes trabajos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top