|
|
1
16
我的看法是:
编辑-添加5,更改2和3 |
|
|
2
1
我同意getter/settings不应该有副作用的想法,但我会说它们不应该有不明显的副作用。 至于抛出异常,如果您将属性设置为无效值(在非常基本的意义上),那么验证异常是可以的。但是,如果setter正在运行一系列复杂的业务规则验证,或者试图关闭并更新其他对象,或者任何其他可能导致异常的事情,那么这是不好的。但这个问题实际上并不是异常本身的问题,而是setter正在关闭并秘密地执行调用方不期望(或不应该)的许多功能。 事件也是如此。如果一个setter抛出一个事件说“这个属性改变了”,那么它是可以的,因为这是一个明显的副作用。但是,如果它触发了其他自定义事件,从而导致一些隐藏的代码在系统的另一部分执行,那就不好了。 这也是我避免在getter中延迟加载的原因。事实上,它们可以让事情变得容易很多时候,但它们可以让事情变得更混乱一些时候,因为总是有一些复杂的逻辑在你想要加载子对象的时候出现。在填充父对象时,显式加载子对象通常只需要一行代码,这样可以避免对对象状态的混淆。但这方面可能会变得非常主观,而且很大程度上取决于具体情况。 |
|
|
3
0
不管怎么说,在C工作时,我总是认为保守的方法是最好的。因为属性在语法上与字段相同,所以它们应该像字段一样工作:没有异常,没有验证,没有有趣的业务。(实际上,我的大多数属性都是以简单字段开始的,直到绝对必要时才成为属性。)其想法是,如果您看到某个看起来像是正在获取或设置字段集的内容,那么就功能(没有例外)、总体效率(设置VA)而言,它就像获取或设置字段一样。例如,riables不会触发委托调用的级联,也不会影响程序的状态(设置一个变量设置该变量,并且不会调用很多可以做任何事情的委托)。 对一个属性集来说,明智的做法包括设置一个标志来指示发生了变化:
可能实际上在另一个对象上设置了一个值,例如:
也许可以将输入分离一点,以简化类的内部代码:
(当然,在后两种情况下,get函数可能正好相反。) 如果需要发生更复杂的事情,特别是调用委托、执行验证或抛出异常,那么我的观点是函数更好。(通常,我的字段会变成带有get和set的属性,然后最终成为get属性和set函数。)对于getter,类似;如果要返回对某个对象的引用,这没问题,但如果要创建一个全新的大对象,并在每次读取该属性时将其填充,则不会太热。 |
|
|
Phox · 为NSOperationQueue创建Setter 7 年前 |
|
|
Rich · 用getter和setter在JavaScript中封装 7 年前 |
|
|
Mumfordwiz · python属性的不同setter 9 年前 |