为什么我不应该直接访问Instance属性进行写操作?

时间:2014-09-09 11:01:41

标签: javascript object instance setter

所以我最近读了这个blog entry。作者说:

  

虽然直接访问和设置实例的属性仍然会引发我的内部bad-javascript蜂鸣器。随着时间的推移,我受到了错误和技术债务的培训,以避免在实例上任意设置值作为传递信息的手段。

之前我听过这个建议,但我仍然不知道它有什么不好之处。

我看到在实际设置值之前验证值的可能性,但我该如何处理错误的值呢?这是使用setter的唯一原因吗?

2 个答案:

答案 0 :(得分:2)

最重要的原因(对我来说)总是使用getter和setter而不是直接获取属性,这是因为你总是可以改变它们在以后的行为方式。

因此,如果您使用Cat方法发布具有setName类的产品或库,则始终可以确定设置名称将来还应执行任何操作。例如,写入日志文件“已设置名称”或其他更有效的内容。

如果您不使用setter,那么您就会陷入困境,因为您的库的所有用户都直接使用了属性name,因此您注定永远保留该属性并保留其名称并且永远不会更改任何有关我们将会破坏用户过去使用它构建的所有内容。

因此,对其他人使用的公共API来说,这是最重要的。如果你留在内部,你仍然会在代码中有一个集中点来改变行为。

看到区别:

 myCat.name = "Silvester"

如果您的代码中有5次,并且您想要将字符串“Cat:”添加到其中,则必须找到所有出现的内容并添加“Cat:”。

如果您使用:

 myCat.setName("Silvester");

只有一个地方可以更改,您可以轻松找到它,您的用户甚至不会注意到您更改了某些内容。

答案 1 :(得分:1)

使用Setter和Getter在其他语言中很常见。在Java中,我们有一个约定,Java Bean约定,它描述了Setters和Getters的用法。

有两个设计原则导致使用Setter和Getter:它的关注点和关注点#34;和#34;信息隐藏"。

第一个说,任务或功能应该在一个对象/模块中实现,并且它不应该分布在代码中的多个位置,并且对象不应该实现几个不同的功能。

第二个说,对象应该隐藏使用对象提供的功能/逻辑所不需要的每个逻辑和实现细节。

如果将这些原则应用于包含数据的对象,或者甚至使用数据,则需要隐藏数据存储方式。这是由Setters和Getters完成的。

例如。对象的用户不需要知道数据是否只是属性,或者是否由Map或Array保持。或想象一个绘制按钮的BUtton-Object。 setColor() - 函数可以在Button中设置color-property,也可以委托给底层UI框架。

此外,我看到了JavaSCript的一个特例。由于我们没有真正具有priveate属性,因此很难隐藏对象中不会被对象用户更改的属性,因为它们具有一些内部状态。因此,对象的调用者需要知道哪些属性可能会被更改,哪些属性不会...这不会使代码易于阅读...使用Setter和Getter可以清楚地表达。