Soll ich einen berechneten Wert als Eigenschaft oder Methode verfügbar machen?

13

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?

Charles Wesley
quelle
Der Vorteil von Eigenschaften ist, dass sie in XML oder JSOn serialisiert sind, aber ich denke, das ist es.
Knerd
1
Eigenschaften sollten Statusinformationen darstellen. Es spielt keine Rolle, ob sie berechnet werden oder nicht. Es macht es einfacher, sie in Ausdrücken zu verwenden. Nur Sie wissen, ob HTML einen Status des Objekts darstellt.
Reactgular

Antworten:

18

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 HtmlEigenschaft trifft jede von denen. Machen Sie es nicht zu einer Eigenschaft, es sei denn, es trifft alle von ihnen.

Eric Lippert
quelle
"Kann nicht fehlschlagen. Getter sollten immer einen Wert zurückgeben, unabhängig vom Status des Objekts." Sollten Eigenschaften keine Ausnahme auslösen, nachdem ihr Objekt entsorgt wurde?
Stephen
6

ToHtmlist 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.

Robert Harvey
quelle