还有其他人发现命名类和方法是编程中最困难的部分之一吗?[关闭]


275

因此,我正在研究该类,该类应通过Web服务向供应商索取帮助文档。我试着将它命名DocumentRetrieverVendorDocRequesterDocGetter,但他们就是不健全的权利。我最终浏览了dictionary.com半个小时,试图提出一个适当的单词。

用坏名字开始编程就像早上头发非常糟糕,一天的其余部分从那里走下坡路一样。觉得我吗?


2
当您显然只需要一个函数时,为什么还要一个类呢?确保您检出了steve-yegge.blogspot.com/2006/03/…中的动词作为类名问题。
user51568

或者,在最终知道应该调用什么时继续前进并进行重构。
Esteban Araya

16
名称: 方法:使用动词,例如get,set,save等。变量:使用名词,例如document,user,context等。接口:使用形容词,例如可打印,可克隆,可迭代等。阅读此主题后,我喜欢Spolsky关于类和变量的建议(使用名词)和TravisO关于方法的建议(使用动词)。也不要制作以'er'结尾的对象
丹尼尔·加索

5
“计算机科学中存在两个难题:缓存失效,命名约定和无提示溢出。”
Karakuri 2014年

6
@karakuri我听到的版本是“计算机科学中有2个难题:命名和1个错误所抵消 ”。
Haoest

Answers:


121

您现在正在做的事还不错,我强烈建议您坚持使用当前的语法,即:

上下文+动词+方式

我使用这种方法来命名函数/方法,SQL存储过程等。通过保持这种语法,它将使您的Intellisense /代码窗格更加整洁。因此,您需要EmployeeGetByID()EmployeeAdd(),EmployeeDeleteByID()。当您使用语法上更正确的语法(例如GetEmployee(),AddEmployee())时,如果在同一个类中有多个Get,则将变得非常混乱,因为无关的东西将被组合在一起。

我类似于将文件命名为日期,您想说的是2009-01-07.log而不是1-7-2009.log,因为当您拥有一堆文件之后,该命令就变得毫无用处。


28
我更喜欢在命名方法时从类型名推断出上下文... class EmployeeRepository {void Add(Employee employee); 无效Get(int id); 无效的GetAll(); 无效的GetAll(Action <FilterCriteria>过滤器); } 你怎么看?
Vyas Bharghava 09年

5
如果您有“ house”动词的标准列表,也将有所帮助。所以它总是找不加载/读取/检索/选择/查找....等
死帐

2
理查德(Richard),您在OOP场景中是正确的,我的回答有些退缩,更多的是一般性的编码建议。我认为从技术上讲,它更适用于非OOP语言。Employee.Add()和Employee.GetByID()将是OOP中的最佳用法。
TravisO 2009年

6
我喜欢您的建议的Intellisense效果,但我更喜欢一种略带文字的方法。所以,我宁愿Employee.SetSupervisor()在Employee.SupervisorSet(),因为它读取(更喜欢自然的英语。
马修的Maravillas

12
但是@TravisO,英语听起来不太好。你没有雇员,你得到了雇员。如果您有涉及形容词的更复杂的动作,例如InvalidateObsoleteQueriesQueriesInvalidateObsolete很难阅读,没有任何意义。此外,在C#中,尤其是在Resharper中,字母顺序无关紧要。如果您开始输入“ emp”,Resharper将为您提供GetEmployeeSetEmployee甚至PopulateInactiveEmployeesList
Ilya Kogan

54

我学到的一个教训是,如果您找不到一个班级的名称,那么该班级几乎总是有问题:

  • 你不需要它
  • 它做得太多

13
还是做得太少。
user51568

4
谢谢,这实际上与我有关。
2009年

52

好的命名约定应尽量减少可用于任何给定变量,类,方法或函数的名称的数量。如果只有一个可能的名称,您将永远不会忘记它。

对于函数和单例类,我仔细检查该函数,以查看其基本功能是否是一种事物转换为另一种事物。我使用的术语非常宽松,但是您会发现,编写的大量函数本质上采取一种形式,而产生另一种形式。

在您的情况下,听起来您的班级 Url转换为Document。这样想起来有点奇怪,但是完全正确,当您开始寻找这种模式时,到处都会看到它。

找到此模式后,我总是将函数命名为x Fromy

由于您的函数 Url转换为Document,因此我将其命名为

DocumentFromUrl

这种模式非常普遍。例如:

atoi -> IntFromString
GetWindowWidth -> WidthInPixelsFromHwnd // or DxFromWnd if you like Hungarian
CreateProcess -> ProcessFromCommandLine

UrlToDocument如果您对该命令比较满意,也可以使用。您说的是x Fromy还是y Tox可能是个问题,但是我更喜欢From顺序,因为那样的话,函数名称的开头已经告诉您返回的类型。

选择一项惯例并坚持下去。如果您小心地在x Fromy函数中使用与类名相同的名称,则记住使用的名称会容易得多。当然,这种模式并不适用于所有情况,但是它在您编写可被认为是“功能性”代码的地方有效。


一个很好的提醒是,在OOP语言中,类名不一定总是必须为名词,但可以使它们偶尔“显得很笨拙”。因此,为什么OOP从业者常常会绊倒(就像问问题的人一样),因为太多的人强调班级必须是现实世界中的“事物”。

7
xFromY-Convetion基本上重复返回类型和参数列表中的内容:Foo fooFromBar(条形图)。您是否称呼此一致性或冗余性取决于您。
Lena Schimmel,2009年

“就您而言,这听起来像您的班级将Url转换为Document”。从什么时候开始,类应该“做什么”而不是代表概念?
user51568

6
@Brian:在声明中只有一个地方是多余的。您在其他任何地方使用它时,都有一些数据类型的提示是很好的。使代码更具可读性,而不必返回到声明。
乔尔·斯波斯基

3
@ stefan-在某些语言中,例如C#和Java,所有代码都必须封装在一个类中,这与C ++不同。如果您想对代码进行模块化,则函数并不是这些语言的一等公民。因此,有时您会遇到可能“做”函数之类的类。

31

有时,类或方法没有一个好名字,它发生在我们所有人身上。但是,通常情况下,无法提出名称可能暗示您的设计有问题。您的方法是否职责过多?您的班级是否封装了一个连贯的想法?


3
很好,真的。
卡米洛·马丁

27

线程1:

function programming_job(){
    while (i make classes){
         Give each class a name quickly; always fairly long and descriptive.
         Implement and test each class to see what they really are. 
         while (not satisfied){
            Re-visit each class and make small adjustments 
         }
    }
}

线程2:

while(true){
      if (any code smells bad){
           rework, rename until at least somewhat better
      }
}

这里没有任何Thread.sleep(...)。


24

我确实花了很多时间,也担心在我编程时可以命名的任何东西的名字。我会说它的回报很好。有时,当我被卡住时,我会把它搁置一会儿,在喝咖啡休息时间,我会问一些人是否有好的建议。

我建议你为上课VendorHelpDocRequester


1
> VendorHelpDocRequester好一个。我实际上用Google搜索了Requestor而不是Requester,两者似乎都是合法的英语单词。
Haoest

1
我曾经做过一两次:)
willcodejavaforfood 2009年

1
在班级名称中使用动词对我来说总是错的。另外,它总是导致用法上的某些重复(即:)VendorHelpDocRequester.request()。我只希望使用像“ VendorHelpDocs.request()”这样的复数形式
Edson Medina,


15

我认为这是一个副作用。

实际的命名并非难事。很难的是,命名过程使您面对一个可怕的事实,即您不知道自己在做什么。


12

我实际上是昨天在37Signals 的Signal vs.Noise博客上听到了这句话,我当然同意:

“计算机科学中只有两件难事:缓存无效和命名。” —菲尔·卡尔顿


simonwillison.net/2007/Jul/5/hard使我进入tbray.org/ongoing/When/200x/2005/12/23/UPI,这使我进入karlton.hamilton.com,然后进入karlton.hamilton.com/quotes /showallquotes.cgi,其中不包括引号!(但我认识到Scrum的#5。)
Daryl Spitzer

1
“计算机科学中的两件硬事:缓存无效化,命名问题和一处错误。”
Dan Lugg

7

很难,这很好。它迫使您考虑问题以及该班实际上应该做什么。好的名字可以帮助设计。


6

同意 我喜欢尽可能地保持类型名称和变量的描述性,而又不要太长,但有时某些概念是您找不到合适的词的。

在这种情况下,它总是可以帮助我向同事寻求帮助-即使他们最终没有帮助,它通常也可以帮助我至少大声地解释它并使我的方向盘转动。


6

我上个月只是在写命名约定:http : //caseysoftware.com/blog/useful-naming-conventions

要点:

verbAdjectiveNounStructure-结构和形容词为可选部分

对于动词,我坚持使用动作动词:保存,删除,通知,更新或生成。偶尔,我使用“进程”,但仅是专门指队列或工作积压。

对于名词,我使用与之交互的类或对象。在web2project中,这通常是“任务”或“项目”。如果是Javascript与页面交互,则可能是正文或表格。关键是代码清楚地描述了与之交互的对象。

结构是可选的,因为它是唯一的情况。列表屏幕可能会请求一个列表或一个数组。用于web2project的项目列表中使用的核心功能之一就是getProjectList。它不修改基础数据,仅修改数据的表示形式。

形容词是别的东西完全。它们用作名词的修饰语。使用getProjects和switch参数可以很容易地实现像getOpenProjects这样简单的操作,但这往往会生成一些方法,这些方法需要对底层数据和/或对象的结构有相当的了解...不一定需要您想要的东西鼓励。通过具有更多显式和特定的功能,您可以使用该代码完全包装和隐藏实现。这不是OO的要点之一吗?


4

创建一个合适的包结构不仅仅是命名一个类,这可能是一个困难但有益的挑战。您需要考虑分离模块的关注点以及它们与应用程序愿景的关系。

现在考虑您的应用布局:

  • 应用程式
    • VendorDocRequester(从Web服务读取并提供数据)
    • VendorDocViewer(使用请求者提供供应商文档)

我敢冒险猜测,在几个班级里有很多事情要做。如果要将其重构为更MVC风格的方法,并允许小类处理各自的职责,则可能会得到以下结果:

  • 应用程式
    • 供应商文档
      • 模型
        • 文档(保存数据的普通对象)
        • WebServiceConsumer(处理Web服务中的具体问题)
      • 控制者
        • DatabaseAdapter(使用ORM或其他方法处理持久性)
        • WebServiceAdapter(利用使用者获取文档并将其粘贴在数据库中)
      • 视图
        • HelpViewer(使用DBAdapter吐出文档)

然后,您的类名称将依赖于名称空间来提供完整的上下文。类本身可以与应用程序固有地相关,而无需明确说明。结果,类名更简单,更容易定义!

还有一个非常重要的建议:请帮自己一个忙,拿起一份Head First Design Patterns的副本。这是一本很棒的,易于阅读的书,它将帮助您组织应用程序并编写更好的代码。欣赏设计模式将帮助您理解所遇到的许多问题已经解决,并且您可以将解决方案合并到代码中。


4

Leo Brodie在他的著作《 Thinking Forth》中写道,程序员最困难的任务是正确地命名事物,并且他说最重要的编程工具是同义词库。

尝试在http://thesaurus.reference.com/上使用同义词库。

除此之外,请不要使用匈牙利记法EVER,避免使用缩写词并保持一致。

最好的祝愿。


1
+1并注意您不应该使用经过校准的匈牙利系统;应用匈牙利语有时会很有帮助,尤其是在没有良好打字系统的编程语言中。
user51568

我从未听说过匈牙利语与系统匈牙利语的比较,但在任何环境下都不是一个好主意-您应该始终基于WHAT(而不是HOW)来命名,而匈牙利语完全基于方式。
罗布·威廉姆斯

@RobWilliams我认为他们指的是Joel Spolsky的文章
Alois Mahdal 2015年

1
@RobWilliams另外,您是否确定“我从未听说过X vs Y,但从来都不是个好主意……” ...?:)
Alois Mahdal 2015年

4

简而言之:
我同意好名字很重要,但我认为您不必不惜一切代价就找到它们。

当然,从一开始就拥有好名字更好。但是,如果您无法在2分钟内提出建议,那么以后重命名将花费更少的时间,从生产率的角度来看,这是正确的选择。

长:
通常,在实施名称之前,通常不值得考虑太久。如果实现您的类,则将其命名为“ Foo”或“ Dsnfdkgx”,而在实现时,您将看到应为其命名的名称。

尤其是对于Java + Eclipse,重命名完全没有麻烦,因为它会仔细处理所有类中的所有引用,警告您名称冲突等。而且,只要该类尚未在版本控制存储库中,我就不会认为重命名5次没有任何问题。

基本上,这是您如何考虑重构的问题。就个人而言,我喜欢它,尽管有时它会使我的队友感到烦恼,因为他们相信永远不要接触正在运行的系统。从您可以重构的所有内容来看,更改名称是您可以做的最无害的事情之一。


3

为什么不让HelpDocumentServiceClient这么大嘴,或者说HelpDocumentClient ...没关系,它是供应商,而是它是处理帮助文档的Web服务的客户端。

是的,命名很难。



2

投资一个好的重构工具!


大声笑。有时候,重构并不是最好的选择(大型C ++项目),但是我之前肯定会采用它。有时我只需要把事情做好,这些名字以后就会出现。
史蒂夫S

2

我坚持基础:VerbNoun(参数)。示例:GetDoc(docID)。

无需花哨。从现在开始,不管是您还是其他人,一年后都会很容易理解。


虽然读起来不错,但组织性很差,因为它是倒退的。最好说DocGet(),因为当您还创建DocAdd()DocRemove()等时,它们都会一起出现在列表中。您的方法实际上显示了当您有数十个Gets或诸如此类时,它变得多么丑陋。
2009年

很好的建议,TravisO。
乔恩·斯莫克

我一般不会在课堂上使用动词。
willcodejavaforfood

2

对我来说,我不在乎方法或类名的描述性和正确的库多长。您应该记住API的每个部分所在的日子已经一去不复返了。

Intelisense适用于所有主要语言。因此,当使用第三方API时,我喜欢将其intelisense用于文档,而不是使用“实际”文档。

考虑到这一点,我可以创建一个方法名称,例如

StevesPostOnMethodNamesBeingLongOrShort

长-但那又怎样。这些天谁不使用24英寸屏幕!



1

这是拥有编码标准的原因之一。拥有标准往往有助于在需要时提出名称。它有助于腾出您的精力来处理其他更有趣的事情!(-:

我建议您阅读史蒂夫·麦康奈尔(Steve McConnell)的《 Code Complete》(亚马逊链接)的相关章节)其中有几条规则有助于提高可读性,甚至可维护性。

高温超导

干杯,


1

不,调试对我来说是最困难的事情!:-)


调试通常归结为提出正确的问题。在这个数字游戏中,您必须猜测一个从1到1000的数字。如果您的猜测太低或太高,控制台都会告诉您,您只有10次尝试。你是做什么?
Haoest

1

DocumentFetcher?没有上下文很难说。

它可以像数学家一样工作,并在您使用时为您的领域借用/发明词典:使用简短的简单词来暗示该概念,而不必每次都将其拼写出来。我经常看到长长的拉丁语短语变成缩写词,这使您无论如何都需要字典。


1

描述问题所使用的语言是变量,方法,对象,类等应使用的语言。名词与对象匹配,而动词与方法匹配。如果您缺少描述问题的语言,也就缺少对问题的完整理解(说明)。

如果只是在一组名称之间进行选择,那么它应该由您用来构建系统的约定驱动。如果您来到了以前的惯例所未发现的新地方,那么花一些精力尝试扩展它们(适当,一致)以涵盖这种新情况总是值得的。

如有疑问,请睡一觉,并在第二天早上挑选最明显的名字:-)

如果您有一天醒来,发现自己错了,请立即进行更改。

保罗

顺便说一句:Document.fetch()很明显。


1

我发现我在局部变量方面最麻烦。例如,我要创建一个DocGetter类型的对象。所以我知道这是DocGetter。为什么需要给它起另一个名字?我通常最终给它起一个名称,例如dg(对于DocGetter)或temp或类似的非描述性名称。


1

不要忘记设计模式(不仅仅是GoF模式)是提供通用词汇表的一种好方法,并且只要适合情况,都应使用其名称。这甚至可以帮助熟悉术语的新手快速了解该体系结构。您正在从事的这门课程应该像代理人一样,甚至可以充当立面吗?


1

供应商文档不应该作为对象吗?我的意思是说,那是有形的,而不仅仅是对程序的一部分进行拟人化。因此,您可能有一个VendorDocumentation带有构造函数的类来获取信息。我认为,如果一个类名包含一个动词,通常会出错。


1

我一定感觉到你。我感到你很痛苦。我想到的每个名字在我看来都是垃圾。一切似乎太普通了,我最终想学习如何为我的名字注入一点天赋和创造力,使它们真正体现出他们所描述的内容。

我的一个建议是咨询同义词库。Word有一个不错的选择,Mac OS X也是如此。这确实可以帮助我摆脱困境,并为我提供了良好的起点和灵感。


0

如果该名称可以向专业程序员解释,那么可能无需更改它。

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.