Ich habe eine C # -Klasse, die einen Inhaltstyp in einem Webinhaltsverwaltungssystem darstellt.
Wir haben ein Feld, in das ein Webinhaltseditor eine HTML-Vorlage für die Darstellung des Objekts eingeben kann. Grundsätzlich wird die Handlebars-Syntax zum Ersetzen von Objekteigenschaftswerten in die HTML-Zeichenfolge verwendet:
<h1>{{Title}}</h1><p>{{Message}}</p>
Soll ich aus Sicht des Klassendesigns die formatierte HTML-Zeichenfolge (mit Ersetzung) als Eigenschaft oder Methode verfügbar machen ?
Beispiel als Eigenschaft:
public class Example
{
private string _template;
public string Title { get; set; }
public string Message { get; set; }
public string Html
{
get
{
return this.ToHtml();
}
protected set { }
}
public Example(Content content)
{
this.Title = content.GetValue("title") as string;
this.Message = content.GetValue("message") as string;
_template = content.GetValue("template") as string;
}
private string ToHtml()
{
// Perform substitution and return formatted string.
}
}
Beispiel als Methode:
public class Example
{
private string _template;
public string Title { get; set; }
public string Message { get; set; }
public Example(Content content)
{
this.Title = content.GetValue("title") as string;
this.Message = content.GetValue("message") as string;
_template = content.GetValue("template") as string;
}
public string ToHtml()
{
// Perform substitution and return formatted string.
}
}
Ich bin mir aus gestalterischer Sicht nicht sicher, ob es einen Unterschied macht oder gibt es Gründe, warum ein Ansatz besser ist als der andere?
c#
design-patterns
class-design
methods
properties
Charles Wesley
quelle
quelle
Antworten:
UPDATE: Diese Frage war Gegenstand meines Blogs im Mai 2014 . Danke für die tolle Frage!
Um zu Robert Harveys Antwort hinzuzufügen : Eine Eigenschaft sollte sein:
Logischerweise sind eine Eigenschaft der Klasse, die Art und Weise, wie ihre Farbe, ihr Jahr oder ihr Modell angegeben werden, die Eigenschaften eines Autos.
nicht mehr als zum Beispiel zehnmal langsamer als das Abrufen von einem Feld.
Es macht Ihnen nichts aus, während des Debuggens berechnet zu werden. Der VS-Debugger berechnet automatisch die Eigenschaften.
kann nicht scheitern. Getter sollten immer einen Wert zurückgeben, unabhängig vom Status des Objekts.
Ich glaube nicht , Ihre vorgeschlagene
Html
Eigenschaft trifft jede von denen. Machen Sie es nicht zu einer Eigenschaft, es sei denn, es trifft alle von ihnen.quelle
ToHtml
ist korrekterweise eine Methode, wie Sie sie in beiden Fällen geschrieben haben. Mach es einfach öffentlich.Knerd macht einen guten Punkt: Eigenschaften können serialisiert werden. Sie würden niemals aus dem HTML-Code deserialisieren, daher ist es aus dieser Perspektive nicht sehr sinnvoll, ihn zu einer Eigenschaft zu machen.
In Übereinstimmung mit der Funktionsweise von ORMs und Repository-Objekten: Felder in einem Datensatz oder Tupel werden mit Eigenschaften dargestellt, aber Sie rufen den Datensatz (oder eine Form davon) mithilfe einer Methode ab.
quelle