C++ 中单一方法与获取/设置属性的重载? [关闭]

Posted

技术标签:

【中文标题】C++ 中单一方法与获取/设置属性的重载? [关闭]【英文标题】:Overload of single method vs get/set for properties in C++? [closed] 【发布时间】:2015-07-29 20:59:51 【问题描述】:

我有一个类A,其属性名为prop,类型为int。 getter 和 setter 通常是这样实现的:

class A

    void set_prop(int value);   // set
    int get_prop() const;    // get

是否有理由更喜欢这种设计,而不是使用两个同名的重载,如下所示?

class A

    void prop(int value);   // set
    int prop() const;    // get

我更喜欢最后一种形式(也许只是口味问题)。但我通常看到第一种形式。所以我想知道是否有深层次的理由更喜欢一个而不是另一个?也就是说,这只是风格问题,还是有一个面向对象的原则说一个比另一个更好?

【问题讨论】:

最好完全避免这种愚蠢的模式......你的const呢? 第一个在C++中更具可读性和更广泛的应用。第二个是更多 .NET、属性驱动的语言类型交易,几乎与公开价值相同。最好避免前面提到的所有这些。 @LightnessRacesinOrbit Ups,忘记了const。固定。 @becko:最接近的一票是我的,因为你在征求关于编码风格的意见。这是题外话。 @Jashaszun: Always..... 不改变其类实例的成员函数应标记为const,以便可以在const 类实例上调用它(或通过其他方式) const 类类型的表达式)。如果函数没有改变它的类实例,那么禁止这样的调用(你可以通过省略const)是没有意义的。如果不在这里,你什么时候使用成员函数const?!而且我不知道返回类型与它有什么关系。 【参考方案1】:

选择第一种样式的基本原理是语义。一个(在这种情况下为成员)函数代表一个动作,调用函数的含义是请求执行关联的动作。因此,它们通常以动词命名:

get_property() create_foo() compute_bar() show_button()

在某些情况下你在做什么也更清楚,例如在获取成员函数的地址时:

auto foo = &A::property; 
// Is property a member function or a member variable here?

没有人阻止你选择第二种选择,事实上很多人use a mix of both 但第一种肯定更符合编程语言中函数或方法所代表的含义。

【讨论】:

【参考方案2】:

从维护的角度来看,第一种形式更容易理解。

请记住,您不仅仅是为自己编程,而是为之后必须阅读/修改您的代码的每个人。所以我会使用第一种形式,因为函数名称很容易说明什么他们会的。

【讨论】:

什么“标准”?第一种形式实际上不是 C++ 标准使用的;第二种形式是。所以,嗯.. 已更改。我的意思是“标准”,因为第一种形式是我所看到的方式,并且愿意打赌大多数其他人也看到了。 “标准”在这样的事情上相当微不足道。我同意,最好用可读的东西。 这个“标准”写在哪里?如果这只是一个可读性的问题,那么这就是一个品味问题,我认为。我发现第二种形式更具可读性。无论如何,这是我的看法。 @LawrenceAiello:那里没有正确的“标准”含义。这是我的主要观点。 C++ 标准恰好不同意您的观点这一事实是一个具有讽刺意味的额外奖励;)【参考方案3】:

您有两个同名的函数,但它们的职责是相互独立的。其中一种具有修改对象状态的副作用,另一种仅读取并返回对象的状态。我相信这里的基本原则只是关注点分离。

【讨论】:

以上是关于C++ 中单一方法与获取/设置属性的重载? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C++基础总结:C++ 类与对象初探——继承和重载

如何创建CRUD方法的多个重载? [关闭]

在 Python 中,是不是有一种方便的方法来重载 C++ 中的方法? [复制]

PHP类和对象之重载

PHP类和对象之重载

C++ 多态性和重载?