Tôi có nên trưng ra một giá trị được tính toán trên một nền tảng hay một phương pháp hay không?


13

Tôi có một lớp C # đại diện cho một loại nội dung trong hệ thống quản lý nội dung web.

Chúng tôi có một trường cho phép trình soạn thảo nội dung web nhập mẫu HTML để biết cách hiển thị đối tượng. Về cơ bản, nó sử dụng cú pháp tay cầm để thay thế các giá trị thuộc tính đối tượng vào chuỗi HTML:

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

Từ góc độ thiết kế lớp, tôi có nên hiển thị chuỗi HTML được định dạng (có thay thế) dưới dạng một thuộc tính hoặc phương thức không?

Ví dụ như tài sản:

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

Ví dụ như phương thức:

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

Tôi không chắc chắn từ quan điểm thiết kế, nó có tạo ra sự khác biệt hay có lý do tại sao một cách tiếp cận tốt hơn phương pháp kia không?


Lợi thế của các thuộc tính, chúng được tuần tự hóa trong XML hoặc JSOn, nhưng đó là điều tôi nghĩ.
Knerd

1
Các thuộc tính nên đại diện cho thông tin nhà nước. Không quan trọng nếu chúng được tính toán hay không. Nó làm cho nó dễ dàng hơn để sử dụng chúng trong các biểu thức. Chỉ bạn biết nếu HTML đại diện cho trạng thái của đối tượng.
Phản ứng

Câu trả lời:


18

CẬP NHẬT: Câu hỏi này là chủ đề của blog của tôi vào tháng 5 năm 2014 . Cảm ơn vì câu hỏi tuyệt vời của bạn!


Để thêm vào câu trả lời của Robert Harvey : một tài sản nên là:

  • về mặt logic một thuộc tính của lớp, cách nói màu sắc hoặc năm hoặc kiểu của nó là các thuộc tính của một chiếc xe hơi.

  • không quá, giả sử, tính toán chậm hơn mười lần so với tìm nạp từ một trường.

  • một cái gì đó bạn không nhớ được tính toán trong khi gỡ lỗi. Trình gỡ lỗi VS tự động tính toán các thuộc tính.

  • không thể thất bại Getters phải luôn trả về một giá trị bất kể trạng thái của đối tượng là gì.

Tôi không nghĩ rằng Htmltài sản được đề xuất của bạn đạt được bất kỳ trong số đó. Đừng biến nó thành tài sản trừ khi nó đánh vào tất cả chúng.


"không thể thất bại. Getters phải luôn trả về một giá trị bất kể trạng thái của đối tượng là gì." Các thuộc tính không nên ném một ngoại lệ sau khi đối tượng của chúng đã được xử lý?
Stephen

6

ToHtmlđúng là một phương pháp, như bạn đã viết nó trong cả hai trường hợp. Chỉ cần phơi bày công khai.

Knerd làm cho một điểm tốt: các thuộc tính có thể được tuần tự hóa. Bạn sẽ không bao giờ giải trừ khỏi HTML, vì vậy sẽ không có ý nghĩa gì khi biến nó thành một tài sản theo quan điểm đó.

Phù hợp với cách thức hoạt động của ORM và các đối tượng kho lưu trữ: các trường trong một bản ghi hoặc bộ dữ liệu được biểu diễn bằng các thuộc tính, nhưng bạn truy xuất bản ghi (hoặc một số dạng của nó) bằng một phương thức.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.