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

例如,假设我在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;

}

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


bool isVisible() { return mIsVisible; };

void show() { 
    if (!mIsVisible) {
        mIsVisible = true;
        draw();
    }
}

void hide() {
    if (mIsVisible) {
        mIsVisible = false;
        erase();
    }
}

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

有帮助吗?

解决方案

阅读文章“告诉,不要问 "在Pragmatic Programmers网站上,我想你会看到第二个例子是要走的路。

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

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

其他提示

在你给出的例子中, show() hide()很有意义,至少对我而言。

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

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

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

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

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

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

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

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

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

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

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

如果你真的需要编写像

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

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

w.showIfAndOnlyIf(shouldBeShowingAccordingToBusinessLogic())

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top