为什么不应该't我直接访问实例属性进行写操作

Why shouldn't I directly access Instance properties for write operations?

本文关键字:属性 实例 访问 操作 不应该 为什么      更新时间:2023-09-26

所以我最近读了这篇博客文章。作者说:

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

我以前听过这个建议,但我仍然不知道它有什么不好的地方。

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

(对我来说)总是使用getter和setter而不是直接处理属性的最重要原因是,您总是可以在以后的时间点更改它们的行为方式。

因此,如果您发布了一个产品或库,该产品或库具有带有setName方法的Cat类,那么您总是可以决定在将来设置名称时还应该执行其他操作。例如,写入日志文件"名称已设置"或其他更有效的内容。

如果你不使用setter,你就会陷入困境,因为你的库的所有用户都直接使用了属性name,所以你注定要永远保留这个属性,保留它的名称,永远不会更改它的任何内容——你会破坏你的用户过去用它构建的一切。

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

看看区别:

 myCat.name = "Silvester"

如果你在代码中有5次这样的情况,并且你想添加字符串"Cat:",你必须找到所有发生的情况,并添加"Cat:"。

如果您使用:

 myCat.setName("Silvester");

只有一个地方可以更改,你可以很容易地找到它,你的用户甚至不会注意到你更改了什么。

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

使用Setter和Getter有两个设计原则:"关注的分离"answers"信息隐藏"。

第一个是说,一个任务或功能应该在一个对象/模块中实现,它不应该分布在代码中的几个地方,一个对象不应该实现几个不同的功能。

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

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

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

此外,我看到了JavaSCript的一个特殊情况。由于我们并没有真正的私有属性,所以很难隐藏对象中不打算由对象用户更改的属性,因为它们包含一些内部状态。因此,对象的调用者需要知道哪些属性可以更改,哪些属性不可以更改。。。这并不能使代码变得易读。。。使用Setter和Getter可以清楚地表明这一点。