【问题标题】:Missing convention for C++ accessors?缺少 C++ 访问器的约定?
【发布时间】:2013-07-18 13:47:19
【问题描述】:

我已经阅读了关于 3 different conventions for accessor methods 的社区 wiki 问题,并且很惊讶没有看到以下约定:

const unsigned& amount() const { return _amount; }
unsigned& amount() { return _amount; }

确实,这与完全避免括号 () 不太一样——这(我觉得)是个好主意——但它仍然是一些东西;对吧?

【问题讨论】:

    标签: c++ class coding-style getter-setter


    【解决方案1】:

    它违背了访问者的目的。如果你提供这两个 功能,您不妨将数据成员公开并成为 完成了。

    编辑:

    只是为了让事情变得非常清楚:有 种情况 使用 C 风格 struct 是最合适的解决方案。在 那些情况,你把数据成员公开,别担心 关于访问器。对于具有显着行为的类,在 另一方面,您根本没有访问器,或者很少。为了 大多数情况下,内部状态直接反映在 公共接口(以及通常读取的状态) 只要)。您唯一需要访问器的时间是 基本上是数据的类,但必须强制执行 数据中的不变量,

    (以及它的价值:如果数据在逻辑上是一个属性 类,我使用:

    int amount() const { return myAmount; }
    void amount( int newValue ) { myAmount = newValue; }
    

    对于不属于逻辑属性的值的 getter, 但是,我将使用getAmount()。)

    【讨论】:

    • +1 - A-MEN!公共数据成员的弊端被大大夸大了。
    • @JohnDibling 这取决于上下文。在实践中,我发现我确实有许多实际上只是结构的类,所有数据成员都是公开的。还有一些没有公共数据成员的其他人。
    • 访问器至少可以让以后更容易切换到复杂的 getter 和 setter。
    • @NeilKirk 如果他们返回引用则不会。如果类的角色和职责是保持独立的属性,而不是其他,那么切换到执行其他操作的 getter 或 setter 将破坏客户端代码。
    • @NeilKirk - 违反像 YAGNI 这样的工程原则似乎是使用访问器的糟糕理由。
    【解决方案2】:

    您的第二个示例使用户可以访问班级中的原始_amount,而不受班级本身的任何形式的保护。作为 OOP 的一个重要方面的“封装”的目的是确保对变量的所有访问都在类本身内完成 - 这样类就可以控制值范围或其他有效性。

    如果您希望该类透明地允许用户使用amount,则将其命名为amount 并将其公开。那么就不需要访问器函数了。

    【讨论】:

      【解决方案3】:

      这样做的问题是它会破坏 getter/setter 约定的目的。如果您要传递对私有成员的可变引用,则不妨公开该成员并消除函数调用的麻烦。

      另外,我发现这种语法非常丑陋且难以阅读,但这是我个人的喜好:

      foo.amount() = 23;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-11
        • 2021-11-29
        • 2015-05-16
        • 2021-06-13
        • 1970-01-01
        • 1970-01-01
        • 2021-01-20
        • 1970-01-01
        相关资源
        最近更新 更多