У меня есть класс 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.
}
}
Я не уверен с точки зрения дизайна, имеет ли это значение или есть причины, почему один подход лучше другого?
c#
design-patterns
class-design
methods
properties
Чарльз Уэсли
источник
источник
Ответы:
ОБНОВЛЕНИЕ: Этот вопрос был темой моего блога в мае 2014 года . Спасибо за отличный вопрос!
Чтобы добавить к ответу Роберта Харви : свойство должно быть:
логически свойство класса, то, как его цвет или год или модель являются свойствами автомобиля.
не более чем, скажем, в десять раз медленнее для вычисления, чем выборка из поля.
что-то, что вы не против вычислить во время отладки. Отладчик VS автоматически вычисляет свойства.
не в состоянии потерпеть неудачу. Получатели всегда должны возвращать значение независимо от состояния объекта.
Я не думаю, что предложенная вами
Html
недвижимость ударит по любому из них. Не делайте это свойством, если оно не поражает их всех .источник
ToHtml
это правильно метод, как вы написали в обоих случаях. Просто разоблачить это публично.Knerd делает хорошую мысль: свойства могут быть сериализованы. Вы бы никогда не десериализовали из HTML, поэтому не имеет смысла делать его свойство с этой точки зрения.
В соответствии с тем, как работают объекты ORM и репозитория: поля в записи или кортеже представлены со свойствами, но вы извлекаете запись (или некоторую ее форму ) с помощью метода.
источник