3 Stimmen

Entwurfsmuster zur Anwendung der Konvertierung auf mehrere Eigenschaften in mehreren Klassen

Ich verwende den WMD Markdown-Editor in einem Projekt für eine große Anzahl von Feldern, die einer großen Anzahl von Eigenschaften in einer großen Anzahl von Entitätsklassen entsprechen. Einige Klassen können mehrere Eigenschaften haben, für die das Markdown erforderlich ist.

Ich speichere das Markdown selbst, da dies die spätere Bearbeitung der Felder erleichtert. Allerdings muss ich die Eigenschaften für die spätere Anzeige in HTML umwandeln. Die Frage ist: Gibt es ein Muster, das ich verwenden kann, um das Schreiben von Markdown-Konvertierungscode in allen meinen Entitätsklassen zu vermeiden?

Ich habe eine Utility-Klasse mit einer Methode erstellt, die einen Markdown-String akzeptiert und den HTML-Code zurückgibt. Ich verwende markdownj und das funktioniert gut.

Das Problem ist, dass ich für jede Eigenschaft jeder Klasse, die Markdown speichert, möglicherweise eine andere Methode benötige, die in HTML konvertiert:

public class Course{

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

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

Das Problem dabei ist, dass, wenn die Klasse Course 2 weitere Eigenschaften Tuition und Prerequisites hat, die beide Konverter benötigen, ich dann getTuitionAsHTML() und getPrerequisiteAsHTML() schreiben muss.

Ich finde das ein bisschen hässlich und hätte gerne eine sauberere Lösung. Die Klassen, die dies erfordern, sind nicht Teil einer einzigen Vererbungshierarchie.

Die andere Option, die ich in Betracht ziehe, ist, dies im Controller und nicht im Modell zu tun. Was sind Ihre Gedanken zu diesem Thema?

Danke.

[EDIT]: Neue Gedanken (Danke Jasper). Da das Projekt Struts2 verwendet (Ich habe nicht gesagt, dies vor) Ich könnte eine Ansicht Komponente sagen, dass die Markdown für mich konvertieren wird erstellen. Dann verwende ich das, wo immer ich brauche, um den Wert als HTML anzuzeigen.

2voto

Jasper Bekkers Punkte 6545

Die Klassen, die dies erfordern, sind nicht Teil einer einzigen Vererbungshierarchie.

Sie sollten zumindest eine gemeinsame Schnittstelle implementieren, sonst wird die Entwicklung einer sauberen generischen Lösung sehr mühsam.

Die andere Option, die ich in Erwägung ziehe, ist, dies im Controller und nicht im Modell zu tun. Was sind Ihre Gedanken zu diesem Thema?

Dies liegt eindeutig in der Verantwortung der Ansicht. Die MVC-Regel Nr. 1 besagt, dass sich das Modell nicht um seine Darstellung kümmert, in diesem Fall um den Markdown.

Ich habe jedoch das Gefühl, dass es zu wenig Details über Ihre derzeitige Architektur gibt, um eine sinnvolle Antwort auf Ihre Frage zu geben.

1voto

Justin Bozonier Punkte 7280

Sie haben eine Möglichkeit, dies zu tun, wenn Sie keine Vererbung oder eine Schnittstelle verwenden können. Ich weiß, ich weiß refactor aber das ist die Realität und *hit passiert.

Mit Hilfe der Reflexion können Sie Ihre Eigenschaften durchlaufen und die Formatierung auf sie anwenden. Sie können sie entweder mit einem Attribut kennzeichnen oder ein Benennungsschema verwenden (spröde, aber immer noch eine Option).

1voto

Chris Cudmore Punkte 28967

Sieht man von den architektonischen Problemen ab, könnte die einfache Antwort lauten:

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

Noch besser wäre es, wenn MarkDownUtil IStringConverter implementieren würde, und Sie könnten mehrere verschiedene StringConverter für verschiedene Aufgaben haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X