「計算された」値をプロパティまたはメソッドとして公開する必要がありますか?


13

Webコンテンツ管理システムのコンテンツタイプを表すC#クラスがあります。

Webコンテンツエディターがオブジェクトの表示方法のHTMLテンプレートを入力できるフィールドがあります。基本的に、オブジェクトプロパティ値をHTML文字列に代入するためにhandlebars構文を使用します。

<h1>{{Title}}</h1><p>{{Message}}</p>

クラス設計の観点から、フォーマットされたHTML文字列(置換あり)をプロパティまたはメソッドとして公開する必要がありますか?

プロパティとしての例:

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

メソッドとしての例:

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

設計の観点から、それが違いを生むかどうか、または一方のアプローチが他方のアプローチより優れている理由はありますか?


プロパティの利点は、XMLまたはJSOnでシリアル化されることですが、それはそれだと思います。
Knerd 14年

1
プロパティは状態情報を表す必要があります。計算されるかどうかは関係ありません。式で使用するのが簡単になります。HTMLがオブジェクトの状態を表すかどうかを知っているのはあなただけです。
Reactgular

回答:


18

更新:この質問は2014年5月の私のブログの主題でした。すばらしい質問をありがとう!


Robert Harveyの答えに追加するには、プロパティは次のようになります。

  • 論理的にはクラスのプロパティであり、その色、年、またはモデルが車のプロパティであるということです。

  • たとえば、フィールドから取得するよりも計算が10倍遅くなります。

  • デバッグ中に計算されてもかまいません。VSデバッガーは自動的にプロパティを計算します。

  • 失敗することはできません。ゲッターは、オブジェクトの状態に関係なく、常に値を返す必要があります。

私はあなたの提案されたHtml財産がそれらのどれにも当たらないと思います。それらがすべてヒットない限り、プロパティにしないでください。


「失敗することはありません。ゲッターは、オブジェクトの状態に関係なく、常に値を返す必要があります。」オブジェクトが破棄された後、プロパティは例外をスローすべきではありませんか?
スティーブン

6

ToHtmlどちらの場合もあなたが書いたように、正しくメソッドです。公開するだけです。

Knerdが良い点を示しています:プロパティをシリアル化できます。HTMLからデシリアライズすることは決してないので、その観点からプロパティにすることはあまり意味がありません。

ORMおよびリポジトリオブジェクトの動作方法と一致:レコードまたはタプルのフィールドはプロパティで表されますが、メソッドを使用してレコード(またはそのフォーム)を取得します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.