【问题标题】:setting/getting object's property value directly or by method?直接或通过方法设置/获取对象的属性值?
【发布时间】:2016-07-15 01:48:18
【问题描述】:

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

问题来了:

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

【问题讨论】:

    标签: oop object methods properties


    【解决方案1】:

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

    行为驱动语言

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

    属性驱动的语言

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

    BTW-JFYI:Python 对字段的可扩展性有一个特殊的解决方案:属性。这是一个特殊的东西,它使您能够在类内部使用具有适当逻辑的 getter 和 setter,但将字段作为普通属性呈现给外部世界。如需进一步阅读,请参阅Python @property versus getters and setters

    【讨论】:

    • 从未听说过“行为驱动”与“属性驱动”语言这两个术语。可以发个参考吗?
    • 对不起,我没有。上面的文字完全基于我的经验。上述两种范式可能有更好的术语。
    • JS 的属性方法和 Python 一样,不是吗?除此之外,我在您对两种范式的描述中没有读到太多,这两种范式在两者之间有着明显的区别,而有些范式同样适用于两者。
    • @DaveNewton 整个文本都是关于差异的。哪一部分适用于这两种范式?
    • @HubertGrzeskowiak 很多,AFAICT。我更多地将其解读为静态/动态类型、运行时动态和语言实现细节之间的差异。除了“Java 通过 getter 公开属性,而 Python [和 JS] 不必这样做”和“访问器使代码更难阅读 [in Java-the-language]”之外,您实际上说了什么?不相关,但 C 没有类。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-17
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多