存在哪些命名反模式?[关闭]


35

有一些名字,如果您发现自己喜欢这些名字,那您就知道自己已经搞砸了。

例如:

XxxManager
这很不好,因为一个类应该描述该类做什么。如果您能为该班级提出的最具体的词是“管理”,则该班级太大。

还有哪些其他命名反模式?

需要澄清的是,我并不是在问“名字不好”的问题-这个问题完全是主观的,无法回答。我问,“什么名字表示系统的总体设计问题”。也就是说,如果您发现自己想调用组件Xyz,则可能表明该组件不安全。还要注意,每条规则都有例外-我只是在寻找警告标志,以指示何时确实需要停止并重新考虑设计。



4
对于那些投票赞成“不具有建设性”的人,您愿意解释原因吗?唯一不能很好解决的问题是答案可能很短,但肯定符合其他五项指导原则……
Billy ONeal


2
@Aaronaught:有什么建议吗?因为我能够在编辑我已经阐述这个问题,以及...
比利·奥尼尔

1
@jhocking-我同意其中的一些链接-特别是有关“经理”和“处理程序”的价值太高而无法放手。而且我还没有在基于设计模式的替代品和其他替代品上大卖,在许多情况下,它们似乎至少含糊不清。有时,“排队”或任何适当的方法都可以,但是通常,经理将项目保留(或引用)在队列中的事实仅仅是管理这些项目的一个方面。正如“经理”表示职务时有用的东西一样,IMO在OOP中也是如此。
Steve314 2011年

Answers:


22

以下命名反模式与.NET(尤其是C#)相关:

  • 不一致之处。如果您决定在每个字段名称前都使用下划线开头,请坚持使用
  • 带有元音缺失的Ambiguos缩写。我已经认真看过诸如的字段名称cxtCtrlMngr。您几乎无法猜测这应该代表什么。
  • 变量名太长且太冗长ILoginAttemptRepository很好且具有描述性- ILoginAttemptRepositoryUsingEntityFrameworkForObjectRelationalMapping具有描述性,但绝对不可行。

7
是在这里I意思是,还是第一人称单数?由于大多数类都实现了接口,因此太多类/接口以大写字母开头会使人烦恼,并且妨碍了可读性,并且代码本身就没有味道。interfaceimplementerI
用户未知,

3
对于“ Ambiguos缺少元音的缩写” +1,这些让我发疯!
FrustratedWithFormsDesigner

6
@Billy ONeal:C ++有接口;他们只是没有人为地与班级隔离。;)
乔恩·普迪

4
@Billy ONeal:那是我的意思。
乔恩·普迪

2
@MariusSchulz:哦,是的,我同意你的观点。
amara 2012年

9

我经常遇到的一种情况是,根本不使用任何命名模式。通常表示开发人员无知(命名模式是一件好事),并且这种反模式也倾向于通过将与类相关的各种方法填充到该类本身中来严重违反SRP,例如,客户类具有属性,CRUD方法以及应用程序某些部分所需的与Customer远程相关的任何内容。

我还要补充一点,使用“ Engine”作为后缀与使用“ Manager”大约相同。这是非常模糊的,一个叫做class的类XxxEngine往往相当于一个VB样式的模块,其中包含一堆方法,因此它处于一个“易于使用”的位置,而无需任何面向对象编程的知识或想法。


7

好吧,首先给出简单的答案:输入匈牙利语(http://mindprod.com/jgloss/unmainnaming.html,也有其他一些好主意。关于何时匈牙利语不是邪恶的观点更为平衡, http://www.joelonsoftware.com /articles/Wrong.html


7
匈牙利符号总是很邪恶:)
韦恩·莫利纳

12
@韦恩:实际上,这并不总是邪恶的。70年代后期,我在施乐公司为查尔斯工作,最初的命名系统是救生员。我们在BCPL中工作,它具有1种类型:整数。关于类型的其他所有内容都是通过使用和命名约定传达的。我们有7位程序员+ Charles,我们每个人都可以走进别人的代码,并立即变得有效率。这并不是说它不能被扭曲/滥用(即使是由查尔斯(Charles)),只是在正确的背景下这是正确的解决方案。
彼得·罗威尔

3
@Marius:请阅读Joel的文章。类型系统不能总是强制所有变量之间的语义差异。在这种情况下,Intellisense也无济于事。
Billy ONeal

4
类型比使用更容易推断,尤其是。与现代编辑。但是,这需要纪律。您不必在所有内容前加上前缀。我使用Java工作,大多数时候并不需要匈牙利语应用程序,但是当我在坐标系统中执行需要几个相同类型变量(例如fromX和toX)的任何操作时,它就是救生员。
Michael K

3
最好是能够轻松创建新类型的一般功能。“这就像一个整数,除了它适用于行号。”
David Thornley

6

在接口名称前添加“ I”,在抽象类名称前添加“ Abstract”。在没有抽象类概念的语言中,或者在接口和抽象类之间没有区别的语言中,这可能是可以原谅的,但是例如在Java中,这总是一个坏主意。

另外,在经理方面,我也不同意您的看法。有时,我会使用该模式,这意味着如果我尝试使用其他名称,该名称将比XxxxxManager更具描述性。有些任务(不一定是复杂的任务)只是不能用一两个词来巧妙地概括。


@麦克:我完全不同意你的说法,对不起。我认为,这XxxxManager是一个班级最糟糕的名字。当然,它确实可以管理一些东西!这就是它被写的原因。Manager是一个无意义的填充词,没有增加理解的价值-顾名思义,一个班级负责什么。
Marius Schulz

1
那怎么样TabManager呢?对控制JSP选项卡机制的类有一个更好的称呼?还是喘着粗气 TabController ...至于前缀Abstract,我觉得它已经被过度使用了,但通常是有效的(请参阅Java库以获取示例)。我想我可以肯定地说,我从来没有I在任何人试图针对不应该存在的接口进行编程的地方看到过接口。像,只有一个类实现该接口。
Michael K

1
@Darien(和其他人):两种方式都没关系。这些名称都不是反模式的(因此,这个问题不在主题范围之内)。从他们是否使用IXxx或,我认为您无法说出关于系统设计的任何内容XxxImpl
Billy ONeal

2
这完全是完全错误的。有非常好的理由视觉上区分的接口从类:(1)它们不能被实例化,(b)中它们不能被释放/设置,(c)中它们不能被序列化,(d)它们可以是等等),您只是抛出了个人不喜欢的东西(出于某些奇怪和无法解释的原因),作为没有任何理由的反模式示例。
亚伦诺特2011年

1
只要有可能,对于参数类型和返回类型,接口应优先于具体类。因此,让接口获取“纯净的”名称和获取疣的具体实现(调用者甚至可能不知道或关心的实际类型)都是有意义的。
凯文·克鲁姆维德2016年

6

撒尿:

我有严重的残疾,不会拼写。没有拼写检查器,我无能为力,我尝试将创建的所有名称复制到文字处理器中进行验证,但是我总是会错过一些名称。在我的上一个项目中,我编写了大部分的api,我想我第一次使用responce一词时并没有拼写检查,而且我认为这是正确的,因为没有人告诉我。我们至少有50个具有响应功能。一个新成员加入团队,问我为什么使用响应,我感到很愚蠢。


2
我简短地使用了一个jQuery插件,其中一个参数是affect(而不是效果)。这让我发疯,然后我迅速找到了一个不同的插件来做同样的事情。
zzzzBov 2011年

4
我遇到的最严重的问题是,一旦我看到一个拼写错误的名字,那确实会损害我记住名字的能力。
David Thornley

1
当同一件事在代码的不同部分中拼写不同时,情况会变得更糟。就像当您有一个由方法getStrenth()访问的Srtength类的字段强度时一样。
伊娃(Eva)2012年

5

好吧,恐怕我的观点有点争议。但是让我们尝试...

就我而言,我必须同意Mike Baranczak,像XxxController,XxxHandler这样的名字是我们真正经常使用的东西。对我们而言,Controller就像是“封装”的入口点,例如管理事务,处理意外错误,调用XxxHandler进行实际工作。我会说XxxManager是控制器的同义词。我认为重要的是,不要在一种情况下使用Manager,而在另一种情况下使用Controller。如果您在团队中工作,保持一致非常重要。

很难为这样的东西找到更好的名字,甚至是不可能。最好选择Xxx,以使情况更加清楚。

我个人不喜欢的是,当一个名为get ...或set ...的方法不仅仅是一个简单的访问器时。我喜欢det ...确定。

我想到的另一件事是:鲍伯叔叔。方法名称中的“ And”表示已做很多事情。但是生活并不总是黑白的-在某些情况下我认为还可以-例如。由于性能问题(当您已经有数据以检查为什么不处理它们时)...

我个人也是系统匈牙利表示法的忠实拥护者-大多数情况下,您在IDE ok中处理源代码。但是通常您只使用编辑器,或者在浏览器中浏览存储库。一个缺点可能是由于类型前缀而导致的工具支持...

我认为最重要的是,对我而言,养蜂是一种不理想的习惯,比没有习惯更好。


1
“控制器”与“管理器”的语义不同。就我个人而言,我都不喜欢,但是“ Controller”之所以获得成功,是因为它是许多模式(尤其是MVC)的共同组成部分。XxxHandler同样糟糕。如果该类只是“处理”某些东西-则该类太大,或者应仅将其称为“ Xxx”部分。
Billy ONeal

3
“很难为这样的东西找到更好的名称,甚至可能甚至找不到” -不是如果您使用定义良好的依赖关系和职责正确地设计了类型层次结构,那不是。当然,如果您将“控制器”用作通用事件/消息处理程序的MVC或“处理程序”的一部分,则情况有所不同-这些都是行话的示例-但如果它们只是被用作病假的通用名称,定义的类,那么这就是一个主要的危险信号。
亚伦诺特2011年

5

也许最糟糕的命名反模式是:

create table stuff(..., foo1 string, bar1 string,
                        foo2 string, bar2 string, 
                        foo3 string, bar3 string, ...)

我们有[foo,bar]对的三元素列表。如果需要第四列,则必须向表中添加新列。

导致这样的代码:

'SELECT foo' + i + ', bar' + i + ' FROM stuff'

应该使用foo和bar列创建一个单独的表,并将其链接到东西表:

create table fubar(foo string, bar string, stuff_id long)

第二个最糟糕的情况是:

class Student {
  ...
  String homeStreet;
  String homeCity;
  String homeState;
  String permStreet;
  String permCity;    
  String permState;
  ...
}

在这里,我们有六个字段,而不是Address类的两个实例。

此反模式由一系列由两部分组成的名称标记,列出了两组的每种组合,例如[foo,bar] x [1,2,3]或[home,perm] x [街道,城市,州]


-1-完全没有提到命名。
Billy ONeal

命名反模式不能包含多个名称?
凯文·克莱恩

如何==命名反模式的论点太多?我糊涂了。
Billy ONeal

1
据我所知,约定是允许使用数字作为实际名称的约定。这些数字导致错误的印象,即项目是某种列表或数组
keppla 2011年

3
@Billy ONeal:是的。设计问题是缺乏规范化,而数字后缀是指向它的命名模式。
reinierpost 2011年

3

重言式的任何类或接口命名都是不好的,不仅是链接所讨论的Java,而且是任何语言。

重言式(修辞格),即使重复没有提供清晰的含义,也使用不同的词来表达相同的意思。


2
有趣。有什么例子吗?
Mike Baranczak 2011年

2
我看过链接,上面写着“重言式” ...;)
Benjol 2011年

10
重言式俱乐部的第一条规则是重言式俱乐部的第一条规则。
Cercerilla 2011年

我阅读了链接(好的,链接的内容),没有发现任何示例
barjak 2011年

好的,因此根据该链接,我们应该停止使用I <InterfaceName>...。
Dal

3

我经常遇到带有通用名称(例如Library或)的软件库Common。它们表示次优设计:开发人员努力避免代码重复,但未尝试创建基于功能分解的设计。


+1-我一直都看到“ Common”。
Morgan Herlocker 2011年

1

Microsoft的命名开始,我可以提供以下不良名称列表:

  1. 它们不是语义的,这意味着它们具有名称,而不是强调其功能,而是强调其使用的技术或其基于的模式
  2. 他们没有遵循语法上的一致性。例如,名称的一部分用驼峰大小写,而另一部分则用pascal大小写。
  3. 它们是难以理解的缩写,例如ScrollableX而不是CanScrollHorizo​​ntally
  4. 选择它们的目的是使它们与该环境的关键字混淆。

2
实际上,我至少喜欢“ ScrollableX”和“ CanScrollHorizo​​ntally”一样。“ X”实际上不是缩写。
user1172763'2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.