【发布时间】:2011-12-29 09:39:37
【问题描述】:
有些方法会对对象的属性进行操作(想不出例子),但有些方法实际上不会影响对象的属性而只是返回一个值(例如DateTime.Add())。
我知道这是一个简单的问题,但我不知道如何引用这两种方法。
【问题讨论】:
-
我真的认为这里有一些示例代码是合适的。
有些方法会对对象的属性进行操作(想不出例子),但有些方法实际上不会影响对象的属性而只是返回一个值(例如DateTime.Add())。
我知道这是一个简单的问题,但我不知道如何引用这两种方法。
【问题讨论】:
想不出第一个,但第二个可能被称为无副作用,如it doesn't mutate state。与其说是您如何引用它,不如说是对其行为的描述。
您往往会听到并发语言中使用的“副作用”,Axum 已经融入了这个概念。
例如,此方法无副作用:
public string GetName()
{
return "Adam";
}
而这种方法不是:
public int GetTotal(int optionalValue = 0)
{
_total += optionalValue;
return _total;
}
作为方法调用的一部分,它可能会改变状态(在本例中为 _total)。下次您调用它时,_total 可能与上次相同,也可能不同,这是方法调用本身的结果。
除非您正在考虑属性设置器...
public string Name
{
set { _name = value; }
}
...我认为没有任何通用术语来描述方法。对象中的大多数方法都会以某种方式使用内部状态 - 读取或写入。
【讨论】:
你可以简单地说
【讨论】:
属性访问方法和派生属性方法是我过去用来区分的。
例如,属性访问方法可以很好地对未存储为 DateTime 的虚构属性执行以下操作。
DateTime GetOrderDateTime()
{
return OrderDate.ConvertToDateTime();
}
派生的属性方法是:
DateTime GetNextOrderDate()
{
return GetOrderDate.AddOneMonth(...);
}
我故意避免讨论什么应该是属性和什么应该是方法,因为我理解这是在 OP 发布的上下文中明确定义的。
正如 Adam 所说,修改这些方法中的属性是引入副作用的好方法 - 最好坚持使用好名称(例如 ModifyTotal)和 Get 方法和属性获取的约定(通常)不应该修改属性。
【讨论】: