我应该将“计算”值公开为属性还是方法?


13

我有一个C#类,它表示Web内容管理系统中的内容类型。

我们有一个字段,允许Web内容编辑器输入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 2014年

1
属性应表示状态信息。不管是否计算它们都没有关系。它使在表达式中使用它们变得更加容易。只有您知道HTML是否代表对象的状态。
Reactgular 2014年

Answers:


18

更新:这个问题是2014年5月我博客的主题。感谢您提出的好问题!


要补充罗伯特·哈维的答案:属性应为:

  • 从逻辑上讲,这是类的属性,用颜色或年份或型号来表示汽车的属性。

  • 可以说,它的计算速度不比从字段获取慢十倍。

  • 您不介意在调试时进行计算。VS调试器会自动计算属性。

  • 无法失败。无论对象的状态如何,获取器都应始终返回值。

我认为您提议的Html财产没有任何影响。除非将其全部击中,否则不要使其成为财产。


“无法失败。无论对象的状态如何,获取器都应始终返回一个值。” 属性在处理完对象后是否不应引发异常?
斯蒂芬

6

ToHtml这是正确的方法,正如您在两种情况下均已编写的那样。只是公开公开它。

Knerd提出了一个很好的观点:可以序列化属性。您永远不会从HTML反序列化,因此从该角度来看,使其成为属性没有多大意义。

与ORM和存储库对象的工作方式一致:记录或元组中的字段用属性​​表示,但是您使用一种方法检索记录(或记录的某种形式)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.