繁体   English   中英

设置/获取对象的属性值是直接还是通过方法?

[英]setting/getting object's property value directly or by method?

对于任何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())

问题来了:

如果结果相同,哪个选项更好? 直接或方法方式的优缺点是什么?

这在很大程度上取决于给定语言中使用的功能和模式。

行为驱动语言

在Java或C ++中,类是由其行为定义的,请阅读“方法”。 接口和整个继承都基于方法。 领域是二等公民。 因此,您使用方法来获取和设置属性。 这是覆盖访问并确保以后进行更改后确保集成正确的唯一方法。 将所有字段都隐藏在方法后面还可以使您进行更细粒度的控制(例如,没有相应设置器的getter或执行计算而不是简单地设置属性的设置器),但是您需要大量样板,因此您编写了大量代码但这并不会真正增加您的业务逻辑,并使代码很难从类中读取。 但是,使代码更难阅读的原因是,由于它们完全定义了一个类,因此使它们更易于从客户端通过接口进行理解。 这种基于属性的方法概念通常与方法和属性的可见性设置一起出现。 通过这种方式,您可以定义对外部世界的含义以及仅对此类或包的含义。 属性几乎总是私有的(请阅读“仅针对此类”)。

属性驱动语言

在JavaScript或Python之类的语言中,类/对象由其字段定义,请阅读“属性”。 甚至方法也不过是属性,因此方法和属性都可以被覆盖(或隐藏),在运行时进行切换等。假设使用getter和setter只能获得虚假的安全性,并且每个函数调用的减少意味着性能和性能的提高。较短的堆栈跟踪,在脚本语言中首选直接使用字段。 关于可读性:代码本身更易于阅读和理解,但是除了基于文档的形式(如果代码作者编写了代码)以外,这里不存在基于行为的语言所知的接口。 方法和属性的可见性通常始终是公开的,但是某些语言提供特殊的注释或命名模式以显示哪些方法或字段是私有的。 根本没有强大的执行力。

BTW-JFYI:Python对于字段的可扩展性有一个特殊的解决方案:属性。 这是一件特殊的事情,它使您可以在类内部使用具有适当逻辑的getter和setter,但可以将字段作为普通属性呈现给外界。 有关更多信息,请参见Python @property与getter和setter的比较。

不要只考虑立即的结果。 大多数软件将在某个时候进行修改。 考虑到这一点,与直接属性访问相比,使用getter和setter方法时更加灵活。

但是,最好的选择(如果适用)是根本不使用setter,而是创建不可变的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM