ฉันควรเปิดเผยค่า“ คำนวณ” เป็นคุณสมบัติหรือวิธีการหรือไม่?


13

ฉันมีคลาส C # ที่แสดงประเภทเนื้อหาในระบบการจัดการเนื้อหาเว็บ

เรามีฟิลด์ที่อนุญาตให้แก้ไขเนื้อหาเว็บเพื่อป้อนเทมเพลต HTML สำหรับวิธีการแสดงวัตถุ โดยพื้นฐานแล้วมันใช้ไวยากรณ์แฮนด์บาร์สำหรับการแทนที่ค่าคุณสมบัติวัตถุลงในสตริง HTML:

<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

1
คุณสมบัติควรแสดงข้อมูลสถานะ ไม่สำคัญว่าจะคำนวณหรือไม่ มันทำให้ง่ายต่อการใช้พวกเขาในการแสดงออก มีเพียงคุณเท่านั้นที่รู้ว่า HTML แสดงถึงสถานะของวัตถุหรือไม่
ซ้ำ

คำตอบ:


18

UPDATE: คำถามนี้เป็นเรื่องของบล็อกของฉันพฤษภาคม 2014 ขอบคุณสำหรับคำถามที่ยอดเยี่ยม!


ในการเพิ่มคำตอบของ Robert Harvey : คุณสมบัติควรเป็น:

  • เหตุผลเชิงคุณสมบัติของคลาสวิธีบอกสีหรือปีหรือรุ่นของมันคือคุณสมบัติของรถยนต์

  • สมมติว่าช้ากว่าสิบครั้งในการคำนวณมากกว่าดึงข้อมูลจากเขตข้อมูล

  • สิ่งที่คุณไม่คิดว่าจะถูกคำนวณขณะทำการดีบั๊ก ตัวดีบัก VS จะคำนวณคุณสมบัติโดยอัตโนมัติ

  • ไม่สามารถล้มเหลว Getters ควรส่งคืนค่าเสมอไม่ว่าสถานะของวัตถุจะเป็นอย่างไร

ผมไม่คิดว่าคุณเสนอHtmlคุณสมบัติฮิตใด ๆของคนเหล่านั้น อย่าทำให้มันเป็นสถานที่ให้บริการจนกว่าจะฮิตทั้งหมดของพวกเขา


"ไม่สามารถล้มเหลว Getters ควรคืนค่าเสมอไม่ว่าสถานะของวัตถุจะเป็นอย่างไร" คุณสมบัติไม่ควรโยนข้อยกเว้นหลังจากวัตถุของพวกเขาถูกกำจัด?
Stephen

6

ToHtmlเป็นวิธีการที่ถูกต้องตามที่คุณเขียนทั้งสองกรณี เพียงเปิดเผยต่อสาธารณะ

Knerd เป็นจุดที่ดี: คุณสมบัติสามารถต่อเนื่องได้ คุณจะไม่เลิก deserialize จาก HTML ดังนั้นจึงไม่สมเหตุสมผลที่จะทำให้เป็นคุณสมบัติจากมุมมองนั้น

สอดคล้องกับวิธีการทำงานของวัตถุเก็บข้อมูลของ ORM: เขตข้อมูลในระเบียนหรือ tuple แสดงด้วยคุณสมบัติ แต่คุณดึงข้อมูลระเบียน (หรือบางรูปแบบ ) โดยใช้วิธีการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.