前言
我有一个组件,我们称之为IView。该组件由BaseView类实现,该类具有大部分功能。我们正在使用模板模式将逻辑委托给inheretting类。
问题:
我们有一个名为IView.Visible的属性,它指示组件是否应该可见。此属性不是虚拟,因为它涉及我们的BaseView中的一些逻辑。
我们创建了一个虚拟保护方法 IsVisible ,它从BaseView.Visible调用,以决定IView.Visible的最终值。
我们认为此属性名称IsVisible对于派生类的实现者来说不具有描述性和清晰性。
有人建议将其重命名为ShouldBeVisible,但我们仍然认为有更好的名称。
你怎么看?你有更好的名字吗?是否有一个涵盖模板方法主题的良好命名约定?更新:为了澄清一点,Visible和IsVisible属性对组件没有副作用,Visible属性使用IsVisible中的值来确定Visible的值是否应该是是的,但它不是唯一的考虑因素,并且可以将组件的其他内部状态与最终判决结合起来。
答案 0 :(得分:1)
我从来没有特别热衷于这个命名约定,但Framework Design Guidelines书建议使用'Core'作为此类模式的后缀。此代码取自Microsoft System.Windows.Forms.Control类
public bool CanSelect
{
get
{
return this.CanSelectCore();
}
}
internal virtual bool CanSelectCore()
{
...
}
我对这个解决方案的关注是你暴露了一个未知复杂性的方法,可能有副作用作为属性,但是因为你可以翻阅.NET框架代码并看到如果你正在寻找这个约定很常见对于一个标准,这可能会尽可能接近。
答案 1 :(得分:0)
这个问题没有“正确”或“错误”,只有“更好”或“更差”。
就个人而言,我会让属性“涉及一些逻辑”一个方法GetVisible(),以明确有一些逻辑(即使它很简单,它也可以是属性)。
持有信息的财产可能只是可见。
这就像不同的成员一样被理解:属性是数据(或数据的错觉),方法是逻辑。
答案 2 :(得分:0)
基类是实现属性还是由继承类实现,即它是抽象的吗?我的第一个想法是它应该被命名,因为它将在继承的类中。如果它控制类输出是否可见,那么Visible似乎是正确的名称。至少在我看来,这个名称不应反映实施而非目的。
答案 3 :(得分:0)
我认为“虚拟保护”确实足以达到目的,它已经指定它可以并且将在某个时候被覆盖并且由子类访问。
为了一次又一次地编码,命名不应该太大,并且IsVisible也是标准的命名方式。它也应该属于正确的英语。 ShouldBeVisible听起来像某种条件/验证,而不是财产。
成员姓名应该只描述目的而不是逻辑或太技术细节,这只会使名字变得越来越大。
答案 4 :(得分:0)
由于正在考虑的方法是Visible的继承类的实现,如果必须的话,我会使用可怕的丑陋但非常具有描述性的名称VisibleImplementation或VisibleImpl。开发人员非常清楚,这是他实现逻辑以使组件可见或不可见的地方。
protected bool VisibleImplementation() { ... }
或者,您可以为其命名为Visible,并要求它采用布尔参数,指示是否从基础实现调用它。就个人而言,我不喜欢引入一个参数来区分方法,但有时你必须妥协。
protected bool Visible( boolean fromBase ) { ... }