一些类名会提示需要重构吗?

11
我看到了一些类似于这篇文章的内容,建议某些单词不应该用作类名的一部分。 当一个类名中有这些单词之一时,就意味着需要重构或重新设计代码。
例如:Manager 原因:由于几乎所有类都会“管理”某些东西,而“Manager”的含义非常广泛,人们可以将许多职责放到“Manager”类中,同时仍然能够声称该类只做“一件事”。 因此,使用“Manager”作为类名并不能说明该类实际上在做什么。早期提到的文章“不使用'Manager'命名Java类”就指出了这一点:

例如,考虑一个名为“UrlManager”的类-您无法判断它是否汇集URL、操作URL或审计其使用情况。 该名称只告诉您这不是URL,但它确实与URL一起工作。 另一方面,“UrlBuilder”的名称更清楚地说明了该类所做的事情。

另一个例子:Helper 原因:像“ThreadHelper”这样的类名会让人们想知道为什么需要它,以及为什么它不能成为“Thread”类的一部分。 它实际上是一个适配器或装饰器吗? 如果是这样,请用相应的名称命名。 “Thread”类是否已经承担了太多的责任? 如果是这样,请重构并为新类命名。 “Helper”无法说明它正在做什么或如何提供帮助。
还有哪些单词在类名中会提示需要重构或重新设计,并且应该避免使用? 为什么?
编辑:我认为这些单词经常被使用,因为
  • 它们通常具有广泛的含义
  • 它们可以适用于几乎所有情境
  • 它们会阻碍设计师思考更好的设计或名称
  • 人们认为使用它们没有问题

书籍《代码整洁之道》列举了更多类似的命名规则,但没有给出原因:

在类的名称中避免使用像Manager、Processor、Data或Info这样的词语。

如果有人能够提供可能的原因那就太好了。

相关问题:

命名类的最佳方法是什么?

11个回答

11

Utils。请参考Chris Missal的博客文章,了解更多信息。


7

任何名称中包含非7位ASCII字符。

我真的无法理解甚至编辑印地语字符。

class हिन्दी:হিন্দী ঠার
{
  // argh.. 
}

当然,每个人最好都用英语编写代码。但是如果有些人用母语编写代码,他们可能也可以使用自己语言的字符(如果编程语言支持Unicode标识符,例如Java)。外国人无论如何都不会理解它,但是母语为该语言的人可以更好地理解它,特别是如果没有1:1从US-ASCII字符进行转换(例如中文)。 - Esko Luontola
1
如果团队总是用他们的母语编写代码,我认为你不应该因此进行重构。 - R. Martinho Fernandes
6
英语也不是我的母语。如今,英语不仅是国际语言,更是程序员必备的语言,无论你身在何处。我坚持认为非英语名称是代码异味。如果你没有掌握英语,那么你受到的教育就糟糕透了(说真的,去要回你的学费吧)。对于程序员来说,这是必不可少的:编程语言、库、文档以及大量重要信息只有用英文才能得到(如果你不会讲英语,StackOverflow 对你来说是不存在的)。在我的监督下,我不会让任何不懂英语的人接触任何代码。 - Wouter van Nifterick

4

我最不喜欢的标识符有:

  1. 拼写错误的单词。GEM在其所有API调用中将palette拼写为“pallete”。非常令人恼火。
  2. 我无法区分字符1和l,0和O的标识符。
  3. 乔治·卡林的七个脏字。

3
2的大小取决于您选择的字体。 - Alex S
问题并不是它是1还是I,或者0还是O。问题在于它本身就是一个数字。请查看eed3si9n下面的答案。 - R. Martinho Fernandes

3

文章(TheAAn

代词和名字(MyTheirJohn

数字,除了特殊版本(235000

形容词(FastSmartGoodBetter

大部分团队不理解的外语(Ελληνικά)


2

1) 少于3个字符的任何内容都让我感到非常恼火。这真的会影响可读性,因为至少3个字符通常可以给你一个元音字母。就个人而言,我尽量使用至少5个字符。

2) 我有一个小抱怨,那就是类名以"class"结尾(例如:personClass或buttonClass),因为这会将注意力从你正在创建的对象上转移开来,不是一个类。创建类的实例同样我觉得还好(例如:blueButton、redLabel),因为这更容易阅读,但是类的命名方式可能会令人非常烦恼。


@nilamo 是的,那将是相当糟糕的,但也可以是blueClass或buttonClass。 @martlark 实际上是peeve... - TahoeWolverine

2
我认为这个问题应该从更大的视角考虑,选择任何媒介的正确名称。 当我的妻子让我从壁橱里拿某件东西时,我怎么知道她指的是哪个壁橱呢?
也许我的类对象确实创建了按钮,那为什么不叫ButtonFactory呢?也许这个对象确实管理临时文件的生命周期,所以我们可以把它称作TemporaryFileManager。
当你没有足够的上下文信息时,问题就出现了。这在创建可重用组件时尤其困难:我的TemporaryFileManager可能是通用Manager类的子类,而我的ButtonFactory可能是WidgetFactory的特殊情况。
只要名称描述了事物在其上下文中的功能,我就没问题。这就是所提到的文章所谈的内容。

1

列举出不好的想法可能需要很长时间,我能够马上想到很多不好的名字:Reader、Writer、Factory、Item、Timer、Reciever、Sender等等。

基本上,避免使用那些无法为你提供类的上下文或在更大的架构中发挥作用的名称。它并不必须像IHelpToSendXMLDataToTheServer这样过头,但是XMLBroadcastUtil似乎也不会糟糕。有些人甚至为类名添加特定的前缀、后缀以指定它所属模块。然而,我认为这是命名空间/包的职责之一。


3
“Reciever”符合我“我讨厌它因为它拼错了”的规则。 - Nosredna
我通过将XML数据编码为JSON来帮助助手向服务器发送数据。 - nilamo

1

1

这个

那总是一个糟糕的选择。


0

摘要 模板 模型 工厂 对象

这些都非常通用,其中一些可以从类定义中明显看出。其他的则最好在简短的文档中注明(易于参考是喜欢resharper的原因之一)。


那么您建议不要将类命名为RoomFactory,如果该类将为游戏中的迷宫生成房间? - Janusz
我知道人们喜欢抽象工厂模式之类的东西。但是我就是不明白为什么要这样命名类。此外,如果我有一个生成房间的类,我会首先想到是否可以定义一堆新的Room(),或者称其为RoomInit()等。 - dlamblin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接