有什么更好的,为什么?(从界面设计的角度来看):
a)具有两个Show()
和Hide()
函数
b)具有一项SetVisible(bool visible)
功能
编辑:例如,某些对象具有可见性状态,并且可以使用此功能对其进行更改。
c)向有三个Show()
,Hide()
,SetVisible(bool visible)
功能
有什么更好的,为什么?(从界面设计的角度来看):
a)具有两个Show()
和Hide()
函数
b)具有一项SetVisible(bool visible)
功能
编辑:例如,某些对象具有可见性状态,并且可以使用此功能对其进行更改。
c)向有三个Show()
,Hide()
,SetVisible(bool visible)
功能
Answers:
我更喜欢SetVisible(bool visible)
,因为它可以让我这样编写客户端代码:
SetVisible(DetermineIfItShouldBeVisible());
不必写
if (DetermineIfItShouldBeVisible()) {
Show();
} else {
Hide();
}
该SetVisible
方法还可以允许更容易地实现。例如,如果特定的具体类仅将方法委托给其复合类,则SetVisible
意味着要实现的方法要少一些。
void ButtonWithALabel::SetVisible(bool visible) {
myButton.SetVisible(visible);
myLabel.SetVisible(visible);
}
MyObject.Visible = false;
在我看来是一个更加直观的比MyObject.SetVisible(false);
SetVisible()
并没有(对我)暗示您实际上在显示任何东西。它读起来就像是在设置对象的可见性属性一样,可能将其留给相应的Refresh()
或Redisplay()
方法来检查此属性的值以确定该对象是显示还是隐藏。
setVisible(true)
可以启动一个过程,在该过程中,如果下一次系统空闲,则对象将在下次空闲时被绘制。我希望这refresh
可能有助于加快对象的显示,但是无论如何对象最终都会被绘制(除非它的可见性设置为false
发生之前)。
我不同意所有张贴者的意见,认为张贴者具有多种功能可以做同一件事。虽然三大功能,而不是一个可以看起来不多膨胀,记住,你的类是很有可能最终与很多这样的功能(例如setEnabled
,enable
,disable
),因此这种做法将结束与一个多较大的类接口。此外,您可能最终会在类中得到一堆类似的听起来功能/属性/所有内容,而函数的乘法将进一步模糊哪一个与什么一起使用。
在支持属性的语言中,应该首选这些属性,但是由于Java和C ++都不支持,所以我想这是有争议的。
我认为,setVisible()
出于以下原因,应首选:
setVisible(false)
你打电话setVisible(true)
,而相反hide()
可以很容易地reveal()
。setVisible(wantToSee)
而不是使用if
语句。setX()
格式即会泛化,因此您可以拥有一组一致的函数,而动词方法会产生许多函数,如果您不知道要查找的内容,这些函数可能很难定位。API的一致性使它们易于学习和记忆。这取决于在上下文中显示和隐藏的含义。首先,您想弄清楚哪一种是您的“主要方式”,然后着重开发:
setVisible(bool)
show()
和hide()
好的,现在您已经编码了它的“黄金标准”核心,您需要弄清楚它是否值得添加其他样式的便捷方法,以使使用对象的人更轻松。
setVisible(bool)
setVisible(a==b)
)show()
和的便利hide()
onSuccess(widget.show)
)TLDR:找出最重要的一种,实施它,然后问自己是否值得添加另一种样式作为简便方法。
我会说“全部三个”。
Show()
并且Hide()
往往比SetVisible(true)
和更容易被欺骗SetVisible(false)
。但是,当您想在逻辑上设置可见性时,最好采用一个采用a的方法,bool
而不是构造一个if
围绕that的方法bool
。
您可以支持所有这三个,而无需重复逻辑和简化模板:
void Show() {
foo.Show();
bar.Show();
}
void Hide() {
foo.Hide();
bar.Hide();
}
void SetVisible(bool visible) {
if (visible) {
Show();
} else {
Hide();
}
}
或者,如果您要包装的东西具有更多的SetVisible
-ish API:
void Show() {
SetVisible(true);
}
void Hide() {
SetVisible(false);
}
void SetVisible(bool visible) {
foo.SetVisible(visible);
bar.SetVisible(visible);
}
System.Windows.Forms.Timer
。我个人觉得这很令人困惑。当我同时看到Show
和时SetVisible
,我的第一个倾向是想知道这两个函数之间是否存在一些重要的区别。
我更喜欢show()和hide(),实际上,可以将每个接收一个布尔值的方法更改为两种,以便更好地表达API的意图。例如,罗伯特·马丁(Robert Martin)在干净代码中建议带零参数的方法比带一个参数的方法更受欢迎。
对我来说,另一个重要的论据是可读性,在我看来,好的代码可以像散文一样阅读,其真正奇怪的散文如“ main_window setVisible false”而不是“ main_window hide”,您通常会像这样写或说话吗?软件程序中的语言构造何时完全有可能使用更自然的语言?
it.setVisible(false); it.setVisible(true);
不会影响控件父级的可见性,也不会影响控件的Z顺序或位置。相比之下,hide(); show()
; 可能会迫使控件的父控件可见,将其移到其他控件上方,并将其位置限制在可以看到的位置。在某些情况下,有一种确保某种东西实际可见的方式很有用(与前面提到的一样show()
,但在其他情况下,更改可见性标志而不更改其他任何方式都是有用的
我的确相信,该方法表达性越强,代码就越易读,因此更易于维护。请考虑以下两种情况:
情况1:
void showCustomerData(customerId){
Customer customer = getCustomer(CustomerId);
customerPanel.setVisible(customer.isCustomerEnabled());
}
情况2:
void showCustomerData(customerId){
Customer customer = getCustomer(CustomerId);
//always show customer panel
customerPanel.setVisible(true);
}
在第一种情况下,很明显函数“ setVisible”正在做什么,但是如果您想阅读它,您会说:
如果启用了客户,则将客户面板设置为可见;如果禁用了客户,则将其设置为隐藏。
虽然更具描述性地说:
- 检查客户的状态:
- 如果启用了客户,则显示客户面板
- 否则,将其隐藏
这会将“案例1”功能更改为以下内容:
void showCustomerData(customerId){
Customer customer = getCustomer(CustomerId);
if(customer.isCustomerEnabled()){
customerPanel.Show();
}
else{
customerPanel.Hide();
}
}
它产生更多的代码,但更具可读性。
第二种情况有一个明显的缺陷,那就是,您已经知道要显示面板,那么为什么不使用“显示”功能呢?
我并不是说使用“ setVisible”是绝对错误的,但是当您尝试读取一段时间以来您自己编写的代码时,它会造成混乱,并且它不符合“一个函数应仅执行一个操作”规则。
show customer panel iff the user/customer is enabled
。我确实同意,可能有很多更复杂的条件不像您的示例那么容易理解,但是,在那种情况下,我会将这些条件分成不同的行。
我相信Hide()
/ Show()
替代方法很有吸引力,因为比起使用SetVisible(true)
,它更容易理解正在发生的事情,而具有单个函数是可取的,因为它避免了很多条件。
如果是这种情况,那么我建议使用枚举作为输入SetVisible
,因此您将获得SetVisible(Visibility.Visible)
或SetVisible(Visibility.Hidden)
。您只有一个功能,可以立即读取正在执行的操作。
使用Java的命名约定,您可能会有setVisible(Visibility.VISIBLE)
或setVisible(Visibility.HIDDEN)
。
我同意Darien的回答,但想从C#程序员的角度来补充一点观点。
当我看到说“ setXXX”的代码时,我读到它是在为某事物设置值,我不希望这会在该事物上产生副作用,除了设置该值,而且我希望这是幂等的(即我可以继续将其设置为相同的值,这没关系)。这就像访问一个字段。通常,我也希望看到一个“ getXXX”方法以及一个“ setXXX”。
我不知道这是否是您在Java和C ++中所期望的,但这就是我在C#中所期望的,尽管在C#中有一个简称为Properties。这是有关如何使用属性的一些不错的指导(http://msdn.microsoft.com/zh-cn/library/ms182181.aspx)。
给定此视图,那么我选择的接口将完全取决于是否存在任何副作用(除了更改该字段值之外):
如果执行该操作有副作用,例如,它显示一个对话框,那么我将使用“ Show()”和“ Hide()”。
如果没有副作用,例如说我正在设置“窗口小部件”的可见性,并且其他部件根据其状态渲染该窗口小部件,那么我将使用setVisibility或setIsVisible。(我不会将其称为SetVisible)。
在C#(不确定Java)中,采用观察者模式非常普遍,其中UI框架将侦听对象的更改,并在诸如Visibility之类的属性发生更改时自动重新呈现UI。这意味着通过调用setIsVisible设置值似乎具有副作用,但在我的定义中没有。通过设置代表“ IsVisible”的字段值来实现小部件的合同。
换句话说,我可以在显示表单之前切换标签在表单上的可见性。即label.getIsVisible == true,但是未显示该表单。
当表单不显示时,我不能调用Hide()。
getXXX()
和setXXX()
方法听起来像Java,而不是 C#。这是您在Java中必须执行的方法,因为它没有属性。如果我在C#中看到类似的代码,我猜它是由尚未了解C#属性的Java开发人员编写的。
SetVisibility
。
getXX
调用具有相应的setXX
方法,则setYY
不应影响它,但可能会影响getZZ
没有setZZ
方法的调用。
我建议稍微修改一下界面:
Show();
Hide();
ToggleVisible();
ToggleVisible(bool visible);
这些方法名称可帮助开发人员根据需要完成的工作来决定使用哪种方法。鉴于SetVisible(bool visible)
开发人员传达的语义与Show()
和相同,可能会使开发人员感到困惑Hide()
,这Toggle()
意味着存在确定操作的条件。因此,开发人员何时使用每种方法都变得直观。
在界面中具有多个方法的好处是它简化了调用代码。您可以公开Show()
和Hide()
,但是:
SetVisible()
私有方法来进行幕后的实际工作(或为Show()
和编写冗余代码Hide()
)。SetVisible()
(或Toggle()
)已经执行的操作以避免代码膨胀(我讨厌冗余代码)。因此,复制了可能已经在实现中作为私有方法存在的方法。我建议SetVisible(bool)
仅在两次切换可见性(显示并重新隐藏,或隐藏并重新显示)的情况下使用(如果有的话),这会使事物基本上保持与执行操作之前相同的状态(如果显示并重新隐藏则很好)反之亦然,如果需要“自动”发生,则需要重新绘制对象。如果隐藏和显示对象只改变一个状态就没有其他效果,那么对外部代码来说,拥有一些可以接受可见性参数的方法是有意义的,并且可以简化此类代码的编写SetVisible
。
如果隐藏和重新显示对象可能有副作用,例如更改Z顺序,则应更可能通过单独的方法执行此类操作。在这种情况下,接受“可见性”参数的外部方法的实用性将受到限制,因此简化这些方法的好处很小。此外,一种SetVisible
方法将(错误地)建议可以无副作用地完成对对象可见性的更改。