web-dev-qa-db-ja.com

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

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

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

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

クラス設計の観点から、(置換された)フォーマットされたHTML文字列をpropertyまたはmethod

プロパティの例:

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

設計の観点からは、それが違いを生むのか、または一方のアプローチが他方よりも優れている理由があるのか​​わかりません。

13
Charles Wesley

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


Robert Harvey's answer に追加するには、プロパティは次のようにする必要があります。

  • 論理的には、クラスのプロパティであり、その色、年式、モデルは車のプロパティです。

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

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

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

私はあなたの提案されたHtmlプロパティヒットのいずれかはないと思います。それらがallにヒットしない限り、それをプロパティにしないでください。

18
Eric Lippert

ToHtmlは、どちらの場合でも記述したとおり、正しくメソッドです。公開するだけです。

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

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

6
Robert Harvey