Mar*_*tin 5 c# setter properties
我希望得到你的意见,与无副作用的制定者有多远.
请考虑以下示例:
Activity activity;
activity.Start = "2010-01-01";
activity.Duration = "10 days"; // sets Finish property to "2010-01-10"
Run Code Online (Sandbox Code Playgroud)
请注意,日期和持续时间的值仅用于指示目的.
因此,使用设定器用于任何属性Start,Finish并且Duration将因此改变其他特性,因此不能被认为是侧无效.同样适用于实例Rectangle类,其中制定者X正在改变的价值观Top和Bottom等.
问题是你在哪里使用setter之间画一条线,它们具有改变逻辑相关属性值的副作用,以及使用方法,这些方法无论如何都不会更具描述性.例如,定义一个名为的方法SetDurationTo(Duration duration)也不会反映Start或Finish将被更改.
我认为你误解了"副作用"一词,因为它适用于程序设计.设置属性是一个副作用,不管它多么内部钱多钱少的状态变化,只要改变一些排序的状态."无副作用的二传手"不是很有用.
副作用是你想要在属性吸气剂上避免的.读取属性的值是调用者不希望改变任何状态(即引起副作用)的东西,所以如果确实如此,则通常是错误的或者至少是有问题的(有例外,例如延迟加载).但无论如何,getter和setter都只是方法的包装器.Duration就CLR而言,该属性只是set_Duration方法的语法糖.
这正是类的抽象意图 - 提供粗粒度操作,同时保持一致的内部状态.如果你故意尽量避免在一个属性赋值中产生多个副作用,那么你的类最终只不过是愚蠢的数据容器.
所以,直接回答这个问题:我在哪里划线?只要方法/属性实际上符合其名称所暗示的那样,就没有任何地方.如果设置Duration也改变了ActivityName,那可能是个问题.如果它改变了Finish财产,那应该是显而易见的; 它应该是不可能改变Duration,Start并Finish保持和保持不变.OOP的基本前提是对象足够智能,可以自己管理这些操作.
如果这在概念层面上困扰你,那么根本就没有mutator属性 - 使用具有只读属性的不可变数据结构,其中所有必需的参数都在构造函数中提供.然后有两个重载,一个采用Start/ Duration和另一个采用Start/ Finish.或者只使其中一个属性可写 - 让我们说Finish保持一致Start- 然后使其成为Duration只读.使用可变和不可变属性的适当组合来确保只有一种方法可以更改某个状态.
否则,不要太担心这个.属性(和方法)不应该有意外或无证的副作用,但这是我将使用的唯一指南.