如果替代函数名称使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()”方法会更好吗?是否有惯例,或者它纯粹是一种主观的东西?
答案 0 :(得分:13)
在Pragmatic Programmers网站上阅读文章“Tell, Don't Ask”,我想你会看到第二个例子是要走的路。
基本上,你不应该通过你的第一个例子隐含的代码传播逻辑,即:
答案 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
。显示/隐藏方法更好地传达了所发生的事情的意图。