Modèle de conception pour appliquer la conversion à plusieurs propriétés dans plusieurs classes

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

  •  05-07-2019
  •  | 
  •  

Question

J'utilise l'éditeur de Markdown WMD dans un projet pour un grand nombre de champs qui correspondent à un grand nombre de propriétés dans un grand nombre de classes d'entités. Certaines classes peuvent avoir plusieurs propriétés qui nécessitent le démarquage.

Je stocke le démarquage lui-même car cela facilite la modification des champs ultérieurement. Cependant, je dois convertir les propriétés en HTML pour les afficher ultérieurement. La question qui se pose est la suivante: y a-t-il un modèle que je peux utiliser pour éviter l’écriture de code de conversion par réduction dans toutes mes classes d’entités?

J'ai créé une classe utilitaire avec une méthode qui accepte une chaîne de démarques et renvoie le code HTML. J'utilise markdownj et cela fonctionne très bien.

Le problème concerne pour chaque propriété de chaque classe qui stocke markdown. Une autre méthode de conversion au format HTML peut être nécessaire:

public class Course{

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

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

Le problème est que si la classe de cours a 2 propriétés supplémentaires, les droits de scolarité et les conditions préalables étant dit, que les deux ont besoin de convertisseurs, je devrai écrire getTuitionAsHTML () et getPrerequisiteAsHTML ().

Je trouve cela un peu moche et je voudrais une solution plus propre. Les classes qui en ont besoin ne font pas partie d'une hiérarchie d'héritage unique.

L’autre option envisagée est de le faire dans le contrôleur plutôt que dans le modèle. Que pensez-vous de ceci?

Merci.

[EDIT]: Nouvelles pensées (Merci Jasper). Étant donné que le projet utilise struts2 (je ne l’ai pas dit auparavant), je pourrais créer un composant de vue qui convertira le démarquage pour moi. Ensuite, je l’utilise partout où j’ai besoin d’afficher la valeur au format HTML.

Était-ce utile?

La solution

  

Les classes qui en ont besoin ne font pas partie d'une seule hiérarchie d'héritage.

Ils devraient au moins mettre en place une interface commune, sinon il serait fastidieux de proposer une solution générique propre.

  

L’autre option envisagée est de le faire dans le contrôleur plutôt que dans le modèle. Quelles sont vos pensées à ce sujet?

C’est clairement une responsabilité de View. La règle MVC n ° 1 est que le modèle ne se soucie pas de sa représentation, la démarque dans ce cas.

Cependant, j’estime que votre architecture actuelle manque de détails pour apporter une réponse significative à votre question.

Autres conseils

Vous avez une option pour cela si vous ne pouvez pas utiliser l'héritage ou une interface. Je sais, je connais le refactor, mais c’est la réalité et le * hit se produit.

Vous pouvez utiliser la réflexion pour parcourir vos propriétés et leur appliquer le formatage. Vous pouvez les étiqueter avec un attribut ou adopter un schéma de nommage (fragile, mais toujours une option).

Ignorant les problèmes d’architecture, je pense que la réponse simple pourrait être:

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

Mieux encore, MarkDownUtil implémenterait IStringConverter et vous auriez pu plusieurs StringConverters pour différents travaux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top