哪个更合适:吸气剂和制定者或功能?

时间:2008-10-06 17:06:45

标签: c++ coding-style setter getter

如果替代函数名称使API更明显,放弃getter和setter的“getMyValue()”和“setMyValue()”模式是否合适?

例如,假设我在C ++中有这个类:


public class SomeClass {
private:
    bool mIsVisible;

public:
    void draw();
    void erase();
}

我可以添加函数来获取/设置“mIsVisible”,如下所示:


bool getVisible() { return mIsVisible; };

void setVisible(bool visible) { if (!mIsVisible && visible) { draw(); } else if (mIsVisible && !visible) { erase(); }

mIsVisible = visible;

}

但是,同样可以使用以下方法:

mIsVisible = visible;

简而言之,拥有一个“setVisible(bool)”方法或一对“show()”和“hide()”方法会更好吗?是否有惯例,或者它纯粹是一种主观的东西?

10 个答案:

答案 0 :(得分:13)

在Pragmatic Programmers网站上阅读文章“Tell, Don't Ask”,我想你会看到第二个例子是要走的路。

基本上,你不应该通过你的第一个例子隐含的代码传播逻辑,即:

  1. 获取当前可见性值,
  2. 根据价值做出决定,
  3. 更新对象。

答案 1 :(得分:5)

在您提供的示例中,show()hide()很有意义,至少对我而言。

另一方面,如果您有一个属性skinPigment并且您决定使用名为tanMe()makeAlbino()的函数,这将是一个非常糟糕,非显而易见的选择。

这是主观的,你必须尝试思考你的用户(使用这个类的人)的想法。无论你决定哪种方式,它都应该是显而易见的,并且记录良好。

答案 2 :(得分:3)

我会使用isVisible()/ show()/ hide()设置。

setVisible()意味着它所做的就是改变内部变量。 show()和hide()使副作用变得清晰。

另一方面,如果所有getVisible()/ setVisible()的来改变内部变量,那么你将它们作为公共字段的变化非常小。

答案 3 :(得分:3)

setter实际上与面向对象关系不大,这是示例中应用的编程习惯。吸气剂略微好一些,但在很多情况下都可以存活。 如果可以获得并设置所有内容,那么拥有一个对象有什么意义呢?应该在对象上调用操作来完成事情,改变内部状态只是一个副作用。 在存在多态性(一个OO的基石)的情况下,一个setter的坏处是你强制每个派生类都有一个setter。如果有问题的对象不需要名为mIsVisible的内部状态,该怎么办?当然,他可以忽略调用并实现为空,但是你会留下毫无意义的操作。 OTOH,show和hide等操作可以通过不同的实现轻松覆盖,而不会泄露任何有关内部状态的信息。

答案 4 :(得分:2)

一般来说,我认为setter / getters应该只设置属性的值。在您的示例中,您还基于isVisible属性的值执行操作。在这种情况下,我认为使用函数执行操作并更新状态比使用setter / getter执行操作更好,因为这是更新属性的副作用。

答案 5 :(得分:2)

如果切换mIsVisible会立即打开和关闭对象的可见性,而不是使用show / hide场景。如果它将保持旧状态一段时间(例如,直到其他东西触发重绘),那么设置/获取方案将是可行的方法。

答案 6 :(得分:1)

我更喜欢show()和hide()方法,因为它们明确告诉你要去的东西。 setVisible(boolean)不会告诉您该方法是否会立即显示/绘制。加上show()和hide()是一个更好命名的接口方法(恕我直言)。

答案 7 :(得分:0)

隐含地,您列出的'show'和'hide'函数都是setter

对于布尔人来说,我认为你所展示的单一工具会很好。但是,.show和.hide函数看起来也像命令,而不是改变对象状态的函数。

答案 8 :(得分:0)

如果你真的需要编写像

这样的代码
if (shouldBeShowingAccordingToBusinessLogic()) w.show();
else w.hide();

到处都是,你可能会更好用

w.showIfAndOnlyIf(shouldBeShowingAccordingToBusinessLogic())

或者,对于真正奇怪的情况,当你的逻辑无法决定是否在某些代码延伸结束之前是否单桅帆船,你可以试试

w.setPostponedVisibility(shouldBeShowingAccordingToBusinessLogic());
...
w.realizeVisibility();

(我不是说这是古怪的吗?)

答案 9 :(得分:0)

显示/隐藏解决方案的另一个动机是作为制定者,

setVisible方法具有“副作用”,因为它还会显示或隐藏SomeClass。显示/隐藏方法更好地传达了所发生的事情的意图。