Должен ли я выставлять «вычисленное» значение как свойство или метод?

13

У меня есть класс C #, который представляет тип контента в системе управления веб-контентом.

У нас есть поле, которое позволяет редактору веб-материалов вводить HTML-шаблон для отображения объекта. Он в основном использует синтаксис handlebars для подстановки значений свойств объекта в строку 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 состояние объекта.
Reactgular

Ответы:

18

ОБНОВЛЕНИЕ: Этот вопрос был темой моего блога в мае 2014 года . Спасибо за отличный вопрос!


Чтобы добавить к ответу Роберта Харви : свойство должно быть:

  • логически свойство класса, то, как его цвет или год или модель являются свойствами автомобиля.

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

  • что-то, что вы не против вычислить во время отладки. Отладчик VS автоматически вычисляет свойства.

  • не в состоянии потерпеть неудачу. Получатели всегда должны возвращать значение независимо от состояния объекта.

Я не думаю, что предложенная вами Htmlнедвижимость ударит по любому из них. Не делайте это свойством, если оно не поражает их всех .

Эрик Липперт
источник
«невозможно завершиться ошибкой. Получатели всегда должны возвращать значение независимо от состояния объекта». Разве свойства не должны генерировать исключение после удаления их объекта?
Стивен
6

ToHtmlэто правильно метод, как вы написали в обоих случаях. Просто разоблачить это публично.

Knerd делает хорошую мысль: свойства могут быть сериализованы. Вы бы никогда не десериализовали из HTML, поэтому не имеет смысла делать его свойство с этой точки зрения.

В соответствии с тем, как работают объекты ORM и репозитория: поля в записи или кортеже представлены со свойствами, но вы извлекаете запись (или некоторую ее форму ) с помощью метода.

Роберт Харви
источник