【问题标题】:Should instances use setters/getters for accessing their own private data members?实例是否应该使用 setter/getter 来访问自己的私有数据成员?
【发布时间】:2014-03-15 11:22:05
【问题描述】:

从每节介绍性编程课程开始,我们就被教导使用访问器和设置器,而不是暴露课程的内部工作。学生在以后学习练习的要点,但现在我明白,这种做法 (A) 会阻止实现成为合同导出 API 的一部分,(B) 改进封装和数据隐藏,以及 (C) 允许保证无论何时设置或访问变量时是否应该发生某些操作(增加计数器,记录某些内容等)。

如何在实例内部使用 getter/setter?例如,

class A {
  private:
    int number = 43;
  public:
    int getNumber();
    void setNumber(int);
};

归根结底,这真的很重要吗?有没有我们可以遵循的指导方针,或者有没有关于这种情况的任何内容?这个问题在我编程时经常出现在我的脑海中,但我从未见过有人讨论关于实例本身的访问器/修改器。

谢谢!

【问题讨论】:

标签: java c++ class oop


【解决方案1】:

从实例中调用 getter 或 setter 的正确用例是当您需要利用 getter 或 setter 提供的副作用、验证或计算时。如果不需要,为什么要从对象中复制此类功能?

纯粹主义者会将副作用、验证或计算重构为他们自己的私有方法,然后在内部和从 getter/setter 调用 that 方法。这样,您就不会将公共接口与任何内部实现细节耦合。

【讨论】:

    【解决方案2】:

    归结为一致性。恕我直言,一旦您创建了访问器方法,就没有业务可以直接访问实际变量——即使是在封闭类中也是如此。

    通过使用您在类本身中公开公开的相同 setter 和 getter,无论何时访问您的成员变量,您都会得到保证的通用行为。读取和修改将通过一个点:公开或内部。

    想一想,如果有一天您对名为myVar 的特定成员整数引入零校验会怎样?只有使用 setNumber 的代码才会具有该功能。类中所有直接使用该变量的行都必须单独修改。

    【讨论】:

      【解决方案3】:

      Getter/setter 用于封装。使用 getter/setter 访问自己的成员的类是极端封装!没有必要回答,这样做没有任何好处。

      当其中有一些逻辑并且您希望始终应用它时,您可以使用 getter/setter - 即使对于私有成员访问也是如此。一个这样的例子是由 getter 合成的派生值。无论是另一个班级还是同一个班级 - 他们都必须通过 getter。

      【讨论】:

        【解决方案4】:

        我目前正在使用 Mockito 框架编写大量测试,该框架用于制作模拟,当然,模拟对象的所有对象属性都设置为 null。因此,如果我想在该对象上调用一些真正的方法,如果该方法直接调用属性,我会得到 NullPointerExceptions,或者某种意外行为,因为属性为空!

        相反,如果我在我的类中使用 getter,我可以模拟 getX() 方法来返回属性应该设置的任何值,我不必担心。

        这是我发现在类中使用 getter 很有用的一个用例。

        我能想到的另一个原因是因为它们可能是获取或设置某些东西所需的其他计算,而不仅仅是赋值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-17
          • 1970-01-01
          • 1970-01-01
          • 2010-09-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多