哪个更合适:吸气剂和制定者或功能?
-
05-07-2019 - |
题
放弃“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网站上,我想你会看到第二个例子是要走的路。
基本上,你不应该通过你的第一个例子隐含的代码传播逻辑,即:
- 获取当前可见性值,
- 根据价值做出决定,
- 更新对象。 醇>
其他提示
在你给出的例子中, 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
。显示/隐藏方法更好地传达了所发生的事情的意图。