有人发现命名类和方法是编程中最难的部分吗?

因此,我正在处理这个类,它应该通过web服务从供应商请求帮助文档。我试着把它命名为DocumentRetrieverVendorDocRequesterDocGetter,但它们听起来就是不对。我最后浏览了dictionary.com半个小时,试图想出一个足够的词。

带着坏名字开始编程就像早上头发很糟一样,接下来的一天就会每况愈下。感觉我吗?

58804 次浏览

我不得不承认命名是一门艺术。如果你的类遵循特定的“设计模式”(工厂等),事情就会变得简单一些。

在编程时,我也花了很多时间担心任何可以命名的东西的名称。不过我得说这很值得。有时,当我陷入困境时,我会把它放在一边,在喝咖啡休息的时候,我会问问周围的人是否有好的建议。

对于你的课程,我建议VendorHelpDocRequester

投资一个好的重构工具!

这很困难,这是好事。它迫使你思考这个问题,以及这门课实际上应该做什么。好的名字有助于产生好的设计。

为什么不叫HelpDocumentServiceClient有点拗口,或者叫HelpDocumentClient…它是供应商并不重要,重要的是它是处理帮助文档的web服务的客户端。

是的,命名很难。

如果这个名称可以向外行程序员解释清楚,那么可能就没有必要更改它。

同意了。我喜欢让我的类型名称和变量尽可能具有描述性,而不太长,但有时只是有一个特定的概念,你找不到一个好的词来形容。

在这种情况下,向同事寻求帮助总是有帮助的——即使他们最终没有帮助,它通常至少能帮助我大声解释出来,让我的车轮转动起来。

有时候,一个类或方法没有一个好名字,我们都会遇到这种情况。然而,通常情况下,无法想出一个名称可能暗示您的设计存在问题。你的方法是否有太多的责任?你的类是否封装了一个连贯的想法?

我觉得这不难。如果你叫不出名字,也许你就不需要它。你的设计越好,你就越容易为你的设计命名。

现在来看临时变量,这是另一回事了。:)

我从另一个角度来看,如果你想让你的代码被其他人读懂,这是最重要的事情之一。

尽量使它具有描述性,如果它来自第三方,为什么不在类或方法名中包含[第三方的]名称呢?

如果嫌时间长,随便取个名字,后记可以改。

这是有编码标准的原因之一。有一个标准往往有助于在需要时想出名字。它有助于解放你的思想,让你去做其他更有趣的事情!(-):

我建议阅读Steve McConnell的Code Complete (亚马逊的链接)的相关章节,其中介绍了一些有助于可读性甚至可维护性的规则。

HTH

欢呼,

抢劫

我坚持基本的:VerbNoun(参数)。例子:GetDoc (docID)。

没有必要太花哨。一年后,不管是你还是其他人,都很容易理解。

我能感受到你的痛苦。: /

我希望有一种工具可以与数据字典(描述各种变量/方法名称的文件,我猜有点像javadoc)一起检查源代码,这样你就可以编写这样的代码:

class Battery
{
double I; // current
double T; // temperature
double V; // voltage
double Q; // charge


void update(double Inew, double dt) { I = Inew; Q += I*dt; }
// ... etc ...
};

代码检查工具可以做许多不同的事情,使它更容易在上下文中查看代码,包括显示提醒,I = current(例如,在窗口右侧的窗格中,它将显示变量定义/语义/注释,在你点击的代码中),或者甚至允许你做“虚拟重构”,作为一个代码审查员,你可以根据自己的喜好重命名一些东西,而不需要真正改变存储在磁盘上的代码。

就像我喜欢自我描述的名字一样,我讨厌读BatteryFilteredCurrentInMilliamps这样的东西。通常在嵌入式系统中,我们是基于代数方程来建模对象的,这样的方程名称非常麻烦。(另一方面,“I”上面有一顶帽子,下标“d”和上标“*”是相当令人困惑的。)

我首先是一个EE /系统工程师,负责少量的软件工作,最后我真的不关心变量的名称,只要我有一种方便的方法来告诉它是什么,并将它映射到我自己的被控制系统的内部模型。

这对我来说通常是很自然的。我总是创建非常短的方法,从不超过6行Smalltalk代码(自动格式化),所以我说这个方法是关于什么的真的没有任何困难。

有时类名很困难,因为我想选择的单词在系统的某个地方正在使用,因为有时同一个单词在不同的上下文中有不同的含义。我希望在这些情况下,允许一些类似维基百科的语法,这样我就可以将我的类命名为“Task (To do list item)”。在这是合法的之前,我用了一个很大的德语风格的单词:ToDoListItemTask。您可能已经猜到了:我的方法名也可以很长。但我认为它们是可读的。

所以,在你的例子中,你的类是一个“getter”,或检索器,或其他什么。你确定这应该在课堂上模仿吗?难道供应商文档不应该请求自己吗?类似于vendorDoc.requestFrom(source);说出名字就容易多了,不是吗?

欢呼,

妮可

你现在所做的很好,我强烈建议你坚持你当前的语法,是:

语境+动词+ how

我使用这个方法来命名函数/方法,SQL存储过程等。通过保持这种语法,它将使你的智能感知/代码窗格更加整洁。你需要EmployeeGetByID() EmployeeAdd() EmployeeDeleteByID()当您使用更符合语法的语法(如GetEmployee()、AddEmployee())时,您会发现如果在同一个类中有多个get,情况会变得非常混乱,因为不相关的东西会被分组在一起。

我把它比作用日期命名文件,你想说2009-01-07.log而不是1-7-2009.log,因为在你有了一堆之后,顺序就完全没用了。

线程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(…)。

当每个合理的名称看起来都太长或不明确时,你可以尝试使用一些有点合理的名称,例如:

  • 类GoForHelpLassie
  • 类DunnoAskTechSupport
  • RTFVM类[V为Vendor]

确保名字真的是唯一的,并且在类的顶部有一个描述性注释,因为任何在代码中看到它的人都需要查找它来找出它是做什么的(但是当他们这样做时,他们可能会发现它更容易记住)。

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

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

现在考虑应用的布局:

    <李>应用程序
    • VendorDocRequester(从web服务读取并提供数据)
    • VendorDocViewer(使用请求程序提供供应商文档)
    • 李< / ul > < / >

我冒昧地猜测,在一些课程中发生了很多事情。如果你将其重构为一种更加mvc化的方法,并允许小类处理单独的任务,你可能会得到如下结果:

    <李>应用程序
      <李> VendorDocs
        <李>模型
        • 文档(保存数据的普通对象)
        • WebServiceConsumer(处理web服务中的细节)
        • 李< / ul > < / > <李>控制器
          • DatabaseAdapter(使用ORM或其他方法处理持久化)
          • WebServiceAdapter(利用Consumer抓取文档并将其插入数据库)
          • 李< / ul > < / > <李>视图
            • HelpViewer(使用DBAdapter输出文档)
            • 李< / ul > < / > 李< / ul > < / > 李< / ul > < / >

然后,类名依赖于名称空间来提供完整的上下文。类本身可以固有地与应用程序相关,而不需要显式地这样说。因此,类名更简单,更容易定义!

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

这也是为什么每个软件开发人员都应该具备写作和沟通技能的另一个原因。

我认为丰富的词汇量也很重要。

DocumentFetcher吗?没有上下文很难说。

它可以帮助你像数学家一样,在你去的时候为你的领域借来/发明一个词典:选择简短的简单的单词,建议概念,而不是每次都拼写出来。我经常看到长拉丁短语变成首字母缩略词,这让你需要一本首字母缩略词无论如何的字典。

代码由Steve Mcconnell完成这本书有一个很好的章节是关于命名变量/类/函数/…

你用来描述问题的语言,就是你应该用来描述变量、方法、对象、类等的语言。一般来说,名词匹配对象,动词匹配方法。如果您缺少描述问题的词语,那么您也缺少对问题的全面理解(规范)。

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

如果有疑问,那就睡一觉,选一个最明显的名字,第二天早上:-)

如果有一天你醒来发现自己错了,那就马上改变。

保罗。

BTW: Document.fetch()是非常明显的。

我所做的就是检查它是否太长如果我不记得它太长

如果10个人中有8个人理解它,那么你就可以放心地认为它是可以理解、可读和清晰的。总会有那么一两个挑剔的人,他们会毫无理由地找你的茬,只因为他们太小气。

我发现局部变量最麻烦。例如,我想创建一个DocGetter类型的对象。我知道它是DocGetter。为什么我要给它另一个名字?我通常会给它起一个像dg(用于DocGetter)或temp之类的名字,或者其他同样没有描述性的名字。

不要忘记设计模式(不仅仅是GoF模式)是一种提供公共词汇表的好方法,只要适合情况,就应该使用它们的名称。这甚至可以帮助熟悉命名法的新手快速理解体系结构。您正在处理的这个类是否应该充当Proxy,甚至是Façade ?

实际上,我昨天刚刚通过37Signals的信号与噪声博客听到了这句话,我当然同意它:

计算机科学中只有两件难事:缓存失效和命名东西。 - Phil Karlton

不应该以供应商文档为对象吗?我的意思是,这是有形的,而不仅仅是一些拟人化的项目的一部分。因此,你可能有一个带有构造函数的VendorDocumentation类来获取信息。我认为,如果一个类名包含一个动词,通常是出了问题。

Leo Brodie在他的书《Thinking Forth》中写道,对于程序员来说,最困难的任务是为事物命名,他指出最重要的编程工具是同义词词典。

尝试使用http://thesaurus.reference.com/中的同义词典。

除此之外,不要使用匈牙利符号,避免缩写,并保持一致。

最好的祝福。

好的命名约定应该尽量减少任何给定变量、类、方法或函数可使用的名称数量。如果只有一个可能的名字,你永远不会有困难记住它。

对于函数和单例类,我仔细检查函数,看看它的基本函数是否将一种东西变换转换为另一种东西。我对这个术语的使用非常宽松,但你会发现你写的大量函数本质上是以一种形式的东西产生另一种形式的东西。

在你的情况下,它听起来像你的类转换一个Url到一个文档。这样想有点奇怪,但完全正确,当你开始寻找这个模式时,你会到处看到它。

当我发现这种模式时,我总是将函数命名为xFromy

因为你的函数转换把Url放到了一个文档中,所以我会给它命名

DocumentFromUrl

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

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

如果你更喜欢这个顺序,你也可以使用UrlToDocument。无论你说xFromy还是yTox可能都是个人喜好的问题,但我更喜欢From顺序,因为这样函数名的开头就已经告诉了你它返回的类型。

选择一个惯例并坚持下去。如果你谨慎地在xFromy函数中使用与类名相同的名称,那么记住你使用的名称会容易得多。当然,这种模式并不适用于所有情况,但它确实适用于您编写的可以被认为是“功能性”的代码。

该类只有一个合理的名称:

HelpRequest

不要让实现细节分散了你对意义的注意力。

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

要点是:

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

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

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

结构是可选的,因为它对该情况是唯一的。列表屏幕可能会请求List或Array。在web2project的项目列表中使用的核心函数之一就是getProjectList。它不修改底层数据,只修改数据的表示形式。

形容词是完全不同的东西。它们被用作名词的修饰语。像getOpenProjects这样简单的东西可能很容易用一个getProjects和一个switch参数来实现,但这往往会生成一些方法,这些方法需要对对象的底层数据和/或结构有相当多的理解……不一定是你想要鼓励的事情。通过使用更显式和特定的函数,可以对使用它的代码完全包装和隐藏实现。这难道不是OO的重点之一吗?

我发现一旦事情完成了,选择一个名字就更容易了。重构- >重命名增值。

< p > 简而言之: < br > 我同意好名字很重要,但我不认为你必须不惜一切代价在实施之前找到它们

当然,最好一开始就有个好名字。但如果你不能在2分钟内想出一个,以后重命名将花费更少的时间,从生产力的角度来看是正确的选择。

< p > 长: < br > 一般来说,在实现之前对名称考虑太久通常是不值得的。如果你实现你的类,将其命名为“Foo”或“Dsnfdkgx”,在实现时你会看到你应该为它命名什么

特别是在Java+Eclipse中,重命名一点也不麻烦,因为它会小心地处理所有类中的所有引用,并警告您名称冲突等。只要这个类还没有在版本控制存储库中,我不认为重命名5次有什么错。

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

如果你是一个。net开发人员,我强烈建议你阅读BradA, Cwalina的书——框架设计指南。这里都解释清楚了。

我学到的一个教训是,如果你找不到一个类的名字,那么这个类几乎总是有问题:

  • 你不需要它
  • 它做的太多了

在“一个词”中总结方法/类,回答它意味着什么?

.

.

.

不是真的。考虑到在编码中必须理解的所有困难,说命名类和方法是编程中最困难的事情之一是荒谬的。不要误解我的意思,有时很难想出一个好名字,但让我们现实一点。我可以说这是编程中最简单的部分之一。

对我来说,我不在乎一个方法或类名有多长,只要它是描述性的,并且在正确的库中。应该记住API的每个部分驻留在哪里的日子已经一去不复返了。

智能感存在于所有主要语言中。因此,当使用第三方API时,我喜欢使用它对文档的智能感知,而不是使用“实际的”文档。

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

StevesPostOnMethodNamesBeingLongOrShort

很长,但那又怎样。现在谁不用24英寸的屏幕呢!

我完全理解你。我能感受到你的痛苦。我想到的每个名字对我来说都是垃圾。这一切看起来都很普通,我想最终学会如何在我的名字中注入一点天赋和创造力,让它们真正反映它们所描述的东西。

我的一个建议是查阅同义词词典。Word和Mac OS x都有一个不错的功能,它真的可以帮助我走出阴霾,给我一个好的起点,以及一些灵感。

我觉得这是副作用。

真正难的不是命名。难的是命名的过程会让你面对一个可怕的事实,那就是你根本不知道自己在做什么。