Haruskah saya mengekspos nilai "dihitung" sebagai properti atau metode?

13

Saya memiliki kelas C # yang mewakili jenis konten dalam sistem manajemen konten web.

Kami memiliki bidang yang memungkinkan editor konten web untuk memasukkan template HTML untuk bagaimana objek ditampilkan. Ini pada dasarnya menggunakan sintaks setang untuk menggantikan nilai properti objek ke dalam string HTML:

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

Dari perspektif desain kelas, haruskah saya mengekspos string HTML yang diformat (dengan substitusi) sebagai properti atau metode ?

Contoh sebagai properti:

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

Contoh sebagai metode:

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

Saya tidak yakin dari sudut pandang desain apakah ada bedanya atau ada alasan mengapa satu pendekatan lebih baik dari yang lain?

Charles Wesley
sumber
Keuntungan dari properti, mereka diserialisasi dalam XML atau JSOn, tapi hanya itu yang saya pikir.
Knerd
1
Properti harus mewakili informasi keadaan. Tidak masalah apakah mereka dihitung atau tidak. Itu membuatnya lebih mudah untuk menggunakannya dalam ekspresi. Hanya Anda yang tahu apakah HTML mewakili keadaan objek.
Reactgular

Jawaban:

18

UPDATE: Pertanyaan ini adalah topik blog saya pada Mei 2014 . Terima kasih atas pertanyaannya!


Untuk menambah jawaban Robert Harvey : properti harus:

  • secara logis properti kelas, cara yang mengatakan warna atau tahun atau modelnya adalah properti mobil.

  • tidak lebih dari, katakanlah, sepuluh kali lebih lambat untuk menghitung daripada mengambil dari bidang.

  • sesuatu yang Anda tidak keberatan dihitung saat debugging. VS debugger secara otomatis menghitung properti.

  • tidak bisa gagal. Getters harus selalu mengembalikan nilai tidak peduli apa status objek tersebut.

Saya tidak berpikir Htmlproperti yang Anda usulkan akan terkena semua itu. Jangan menjadikannya properti kecuali itu mengenai mereka semua .

Eric Lippert
sumber
"tidak bisa gagal. Surat kabar harus selalu mengembalikan nilai tidak peduli apa pun keadaan objek itu." Bukankah seharusnya properti mengeluarkan pengecualian setelah objeknya dibuang?
Stephen
6

ToHtmlbenar metode, seperti yang Anda tulis dalam kedua kasus. Buka saja di depan umum.

Knerd membuat poin yang bagus: properti dapat diserialisasi. Anda tidak akan pernah menghilangkan bakteri dari HTML, jadi tidak masuk akal untuk menjadikannya properti dari perspektif itu.

Konsisten dengan cara ORM dan objek repositori bekerja: bidang dalam rekaman atau tupel diwakili dengan properti, tetapi Anda mengambil catatan (atau beberapa bentuknya ) menggunakan metode.

Robert Harvey
sumber