【问题标题】:Should I use a property or a method for a calculated value? [duplicate]我应该使用属性还是方法来计算值? [复制]
【发布时间】:2011-09-12 15:49:48
【问题描述】:

可能重复:
Properties vs Methods

我有一些矢量几何类,有很多功能我不知道是作为(只读)属性还是方法来实现。示例包括:

Vector.Length                   or              Vector.Length()
Vector.Perpendicular            or              Vector.Perpendicular()
Matrix.Determinant              or              Matrix.Determinant()
Matrix.Inverse                  or              Matrix.Inverse()

我应该将它们实现为方法还是属性?它们都不会改变它们应用的对象,因此在这方面,它们似乎适合作为属性。另一方面,它们涉及计算(尽管很小 - 这是二维几何),这显然对属性不利。

在这种情况下我应该使用哪些规则?

【问题讨论】:

  • @Kristopher:这些给我的印象是边缘情况:它们没有副作用,但包括计算。
  • 属性是用来计算的,而不仅仅是getter和setter。他们在那里进行统一访问,以便您可以例如表示 (x,y) 坐标中的一个点,并且仍然提供对 (r,theta) 的访问作为“属性”,而用户不会注意到它。
  • @Yet Another Geek:好点。这将Vector.LengthMatrix.Determinant 放在了财产方面。其他两个我不确定。

标签: c# properties semantics


【解决方案1】:

属性用于启用Uniform Access Principle,因此即使您进行了一些计算,属性也是此处的最佳选择。这是因为它们是描述一个对象的东西,而不是对一个对象做的事情,并且不需要任何外部计算的参数。

根据Command Query Separation Principle,getter 不应该变异,setter 可以变异。

【讨论】:

    【解决方案2】:

    我会将 Vector.LengthMatrix.Determinant 实现为属性,因为它们需要非常轻量级的计算 (2D)。

    但是,恕我直言,Matrix.InverseVector.Perpendicular 不适合作为属性,因为它们不描述对象。他们正在返回一个恰好符合某些数学条件的新对象。我会将这些实现为 Vector.GetPerpendicular()Matrix.GetInverse()

    当然,这只是个人喜好。我会这样做,但将它们全部实现为属性完全没问题。

    【讨论】:

    • 但是方法名称以Get 开头的事实意味着它们应该是属性!
    • 完全没有。将返回信息的方法命名为 GetInformation 是 .NET Framework 中的常用命名约定。例如检查Typeclass。
    • @Eric:不完全。尽管 FxCop 确实警告过这一点,但属性的用户不会期望调用属性不会期望它有任何性能损失,而假设方法更容易做出。如果您的 GetXXX() 方法很慢,请不要将其更改为属性。
    【解决方案3】:

    通常人们认为调用属性不会太昂贵,并且它们会在几乎恒定的时间内完成。听起来你可以拥有一个属性。

    【讨论】:

      【解决方案4】:

      人们通常期望方法需要一些时间来执行(并且可能会抛出),而对于属性来说则不然。

      例如,您更有可能在 for 循环中将属性作为条件,而不是在那里看到方法。方法在某种程度上预计会产生副作用,而属性预计不会改变对象。

      根据经验,如果您对自己的属性被执行数百次感到满意,那么它们是可以的。

      如果您使用方法,将它们称为 GetXxx() 可能会有所帮助。

      【讨论】:

      • 就目前而言,我正在缓存Matrix.Inverse 的结果,所以在第一次执行之后它只是一个字段访问。 (类是不可变的)
      • @Eric,Perpendicular 计算什么?甚至“逆”也可以是一个属性,只要您记录在第一次调用时有开销。
      • @Eric:所以它返回一个新向量。这可能更适合作为一种方法。
      猜你喜欢
      • 2022-08-16
      • 1970-01-01
      • 2012-06-21
      • 2014-04-11
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多