Чи варто виставляти «обчислене» значення як властивість чи метод?


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, але це я думаю.
Кнерд

1
Властивості повинні представляти інформацію про стан. Не має значення, чи обчислюються вони чи ні. Це полегшує їх використання у виразах. Тільки ви знаєте, чи HTML представляє стан об'єкта.
Реакційний

Відповіді:


18

ОНОВЛЕННЯ: Це питання було предметом мого блогу в травні 2014 року . Дякую за чудове запитання!


Щоб додати відповідь Роберта Харві : властивість має бути:

  • логічно властивість класу, спосіб, який говорить про його колір, рік чи модель - це властивості автомобіля.

  • не більш ніж, скажімо, в десять разів повільніше обчислювати, ніж отримувати з поля.

  • те, що ви не проти зарахувати під час налагодження. Відладчик VS автоматично обчислює властивості.

  • не в змозі провалитися. Геттери завжди повинні повертати значення незалежно від стану об'єкта.

Я не думаю, що запропонована Htmlвласність не стосується жодної з них. Не перетворюйте його у власність, якщо вони не вражають усіх .


"не вдається вийти з ладу. Геттери завжди повинні повертати значення незалежно від стану об'єкта." Чи не повинні властивості кидати виняток після того, як їх об’єкт було розміщено?
Стівен

6

ToHtmlце правильно метод, як ви його написали в обох випадках. Просто викрийте це публічно.

Кнерд говорить про те, що властивості можна серіалізувати. Ви ніколи не десеріалізуєтеся з HTML, тому не має сенсу робити його властивістю з цієї точки зору.

Відповідно до того, як працюють ORM та об'єкти сховища: поля в записі або кортежі представлені властивостями, але ви отримуєте запис (або якусь його форму ) за допомогою методу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.