这是任何OOP的更普遍的问题,请在回答之前考虑可读性和效率。 以下是Javascript中的示例:
function fnc () {
this.var = "abc";
this.setVar = function (val) {
this.var = val;
}
this.getVar = function () {
return this.var;
}
}
现在,我可以通过方法设置var的值:
fnc.setvar("abc");
或
fnc.var = "abc";
我也可以直接得到它:
console.log(fnc.var)
或通过get方法:
console.log(fnc.getVar())
问题出现了:
如果结果相同哪个选项更好?直接或方法的利弊是什么?
答案 0 :(得分:1)
这在很大程度上取决于给定语言中使用的功能和模式。
在Java或C ++中,类由其行为定义,读取"方法"。接口和整个继承都基于方法。菲尔兹是二等公民。因此,您使用方法来获取和设置属性。这是覆盖访问权限的唯一方法,并确保在您稍后更改某些内容后进行集成。将所有字段隐藏在方法后面也可以实现更细粒度的控制(例如,没有相应的setter的getter,或者进行计算而不是简单地设置属性的setter),但是你需要大量的样板,所以你要编写大量的代码这并没有真正增加您的业务逻辑,并使代码更难从类中读取。然而,使代码更难阅读的原因使得从客户端通过接口更容易理解,因为它们完全定义了一个类。这种方法对属性的概念通常伴随着方法和属性的可见性设置。通过这种方式,您可以定义外部世界的含义以及仅适用于此类或包的含义。属性几乎总是私有的(读取"仅适用于此类")。
在JavaScript或Python等语言中,类/对象由其字段定义,读取"属性"。甚至方法只不过是属性,因此方法和属性都可以被覆盖(或隐藏),在运行时切换等等。鉴于使用getter和setter只获得错误的安全性,并且假设每个函数调用较少意味着更好的性能和较短的堆栈跟踪,直接使用字段是脚本语言中的首选用法。关于可读性:代码本身更容易阅读和理解,但是基于行为的语言已知的界面除了文档形式(如果代码作者写一个)之外不存在。方法和属性的可见性通常始终是公共的,但是某些语言提供特殊注释或命名模式以显示哪些方法或字段是私有的。根本没有强制执行或没有强制执行。
BTW-JFYI:Python为字段的可扩展性提供了一个特殊的解决方案:属性。这是一个特殊的东西,它允许你在类中使用具有适当逻辑的getter和setter,但是将该字段作为普通属性呈现给外部世界。有关详细信息,请参阅Python @property versus getters and setters。
答案 1 :(得分:1)
不要仅考虑即时结果。大多数软件都会在某些时候进行修改。考虑到这一点,使用getter和setter方法而不是直接属性访问时,您会更灵活。
然而,最好的选择 - 如果适用 - 是根本不使用setter,而是创建不可变对象。