其他人发现命名类和方法是编程中最困难的部分之一?

所以我正在开发这个应该通过Web服务从供应商处获得帮助文档的类。 我试图命名它DocumentRetrieverVendorDocRequesterDocGetter ,但他们只是不正确的。 我终于在dictionary.com上浏览了半个小时,试图拿出一个合适的单词。

开始编写坏名字就像在早上有一个非常糟糕的发型日,其余的一天从那里下山。 感觉我?

你现在正在做什么是好的,我强烈build议你坚持你现在的语法,是:

上下文+动词+如何

我使用这个方法来命名函数/方法,SQL存储过程等。通过保持这个语法,它将保持你的Intellisense / Code Panes更加整洁。 所以你想要EmployeeGetByID()EmployeeAdd(),EmployeeDeleteByID()。 当你使用更加语法正确的语法,如GetEmployee(),AddEmployee()时,你会发现如果在同一个类中有多个Gets,那么这将变得非常混乱,因为不相关的东西将被组合在一起。

我类似这样命名文件与date,你想说2009-01-07.log不1-7-2009.log,因为你有一堆后,顺序变得完全没用。

一个好的命名约定应该尽量减less可以用于任何给定variables,类,方法或函数的可能名称的数量。 如果只有一个可能的名字,你永远不会有记忆的麻烦。

对于函数和单例类,我仔细研究函数,看它的基本function是一种事物转换成另一种事物。 我非常松散地使用这个术语,但是你会发现你写的大量函数实质上是以某种forms取得某种东西,并以另一种forms产生某种东西。

在你的情况,这听起来像你的class级转换成一个文档的url。 这样想起来有些奇怪,但是完全正确,当你开始寻找这种模式时,你会在任何地方看到它。

当我find这个模式时,我总是命名函数x From y

由于你的函数转换成一个文档的url,我会给它命名

 DocumentFromUrl 

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

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

如果您对该顺序更加熟悉,也可以使用UrlToDocument 。 无论你说x From y还是y To x可能都是品味的问题,但是我更喜欢From顺序,因为这样函数名的开头已经告诉你它返回的是什么types。

挑一个约定,坚持下去。 如果您在x函数中使用与您的类名称相同的名称,那么记住您使用的名称会更容易。 当然,这种模式并不适用于所有的东西,但是在你编写可以被认为是“function性”的代码的时候,它确实有用。

我吸取教训的一个教训是,如果你找不到一个class级的名字,那么这个class级几乎总是有什么问题:

  • 你不需要它
  • 它确实太多了

有时候,对于一个阶级或方法来说,没有一个好名字,它发生在我们所有人身上。 然而,很多时候,不能提出一个名字可能暗示你的devise有问题。 你的方法有太多的责任吗? 你的class级是否包含一个连贯的想法?

主题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(…)。

我花了很多时间,也担心编程时可以给出名字的任何名字。 我会说,它虽然收益非常好。 有时当我卡住了,我离开了一段时间,在喝咖啡rest时,我问了一下,如果有人有一个很好的build议。

对于你的class级,我build议VendorHelpDocRequester

由史蒂夫·麦克康奈尔的代码完成的书有一个很好的章节命名variables/类/函数/ …

其实我昨天刚刚听到这个报价,通过37Signals的Signal vs. Noise博客,我当然同意它:

“计算机科学只有两件难事:caching失效和命名事情。” – 菲尔·卡尔顿

我认为这是一个副作用。

这不是真正的命名,很难。 困难之处在于命名的过程使你面对可怕的事实,你不知道自己到底在做什么。

这很困难。 这迫使你思考这个问题,以及class上实际应该做什么。 好名字可以帮助导致良好的devise。

同意。 我喜欢尽可能保持我的types名称和variables尽可能描述性,而不是太长,但有时只是一个概念,你找不到一个好的词。

在这种情况下,总是能帮助我向同事请教 – 即使他们最终没有帮助,通常我至less可以帮助我大声说出来,让我的车轮转向。

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

它的要点:

动词形容词名词结构 – 以结构和形容词为可选部分

对于动词 ,我坚持动作动词:保存,删除,通知,更新或生成。 有一段时间,我使用“过程”,但只专门指队列或工作积压。

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

结构是可选的,因为它是唯一的情况。 列表屏幕可能会请求列表或数组。 web2project项目列表中使用的一个核心function就是getProjectList。 它不会修改底层数据,只是数据的表示。

形容词完全是另一回事。 它们被用作名词的修饰语。 像getOpenProjects这样简单的事情可以用getProjects和switch参数轻松实现,但是这往往会产生需要对对象的底层数据和/或结构有相当多的理解的方法……不一定是你想要的东西鼓励。 通过具有更多明确和特定的function,您可以使用它完整地包装和隐藏代码中的实现。 这不是OO的一个要点吗?

不仅仅是指定一个class级,创build一个合适的包裹结构可能是一个困难但有益的挑战。 您需要考虑分离模块的关注点,以及它们与应用程序远景的关系。

现在考虑你的应用程序的布局:

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

我敢冒险猜测,在几个class里面还有很多事情要做。 如果你想把它重构成一个更加MVC的方法,并允许小class来处理个别的任务,你可能会得到如下结果:

  • 应用
    • VendorDocs
      • 模型
        • 文件(保存数据的普通对象)
        • WebServiceConsumer(处理Web服务中的实体)
      • 调节器
        • DatabaseAdapter(使用ORM或其他方法处理持久性)
        • WebServiceAdapter(利用消费者获取文档并将其粘贴在数据库中)
      • 视图
        • HelpViewer(使用DBAdapter来扫描文档)

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

另一个非常重要的build议:请自己帮忙,拿起一个Head First Design Patterns的副本。 这是一本精彩,易读的书,可以帮助您组织应用程序并编写更好的代码。 欣赏devise模式将帮助您理解您遇到的许多问题已经解决,并且您将能够将解决scheme合并到您的代码中。

利奥·布罗迪(Leo Brodie)在他的着作“思考”中写道,程序员最困难的任务是把事情说得很好,他说最重要的编程工具是词库。

尝试使用http://thesaurus.reference.com/上的词库。;

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

最好的祝愿。

这个class只有一个明智的名字:

 HelpRequest 

不要让实施细节使您偏离意义。

简而言之:
我同意好的名字是重要的,但我认为你不得不在不惜一切代价执行之前find它们。

当然,最好从一开始就有一个好名字。 但是如果你不能在2分钟内拿出一个,稍后重命名将花费更less的时间,并且从生产率的angular度来看是正确的select。

长:
一般来说,在实施之前往往不值得花太长时间思考一个名字。 如果你实现了你的类,把它命名为“Foo”或者“Dsnfdkgx”,在实现的时候你会看到你应该命名的。

特别是在Java + Eclipse中,重命名事物并不是什么难事,因为它仔细处理了所有类中的所有引用,警告了名称冲突等等。只要该类还没有在版本控制库中,认为重命名5次有什么问题。

基本上,这是一个你如何考虑重构的问题。 就我个人而言,我喜欢它,尽pipe有时候会让我的队友们感到恼火,因为他们相信永远不会碰到一个正在运行的系统 。 从一切你可以重构,改名是你可以做的最无害的事情之一。

投资一个好的重构工具!

为什么不把HelpDocumentServiceClient的一种嘴巴,或HelpDocumentClient …它不关心它是一个供应商,重点是它是一个处理帮助文档的Web服务的客户端。

是的命名是困难的。

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

没有必要变得花俏。 从现在开始,一年之后会很容易理解,无论是你还是其他人。

对于我来说,我不在乎一个方法或类名的长度,只要它的描述性和正确的库。 应该记住API的每个部分所在的时代已经过去了。

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

考虑到这一点,我很好,创build一个方法的名称,如

StevesPostOnMethodNamesBeingLongOrShort

长 – 但如此。 这些日子谁不使用24英寸的屏幕!

我必须同意命名是一门艺术。 如果你的class级遵循某种“devise模式”(工厂等),这会变得容易一些。

不,debugging对我来说是最困难的事情! 🙂

DocumentFetcher? 没有上下文很难说。

它可以帮助像math家一样行事,并随时随地为你的域名借用/发明一个词典:解决简单的简单词汇,这些词汇不需要每次都拼写出来。 我经常看到长长的拉丁语短语变成缩略词,因此无论如何您都需要一个缩略词典。

用来描述问题的语言是你应该用于variables,方法,对象,类等的语言。松散地,名词匹配对象和动词匹配方法。 如果您错过了描述问题的单词,那么您也错过了对问题的充分理解(规范)。

如果只是在一组名称之间进行select,那么它应该由您用于构build系统的约定来驱动。 如果你已经到了一个新的地方,那么以前的惯例已经发现了,那么总是值得花一些努力来试图扩展它们(正确地,一致地)来覆盖这个新的案例。

如果有疑问,睡在上面,并select第一个最明显的名字,第二天早上:-)

如果你有一天醒来意识到自己错了,那就马上改变它。

保罗。

顺便说一句:Document.fetch()是非常明显的。

我发现我在局部variables中遇到了最多的麻烦。 例如,我想创build一个DocGettertypes的对象。 所以我知道这是一个DocGetter。 为什么我需要给它另一个名字? 我通常最终给它一个像dg(DocGetter)或temp或类似的非描述性的名字。

不要忘了devise模式(不仅仅是GoF的)是提供一个通用词汇的好方法,只要符合情况,就应该使用它们的名字。 这甚至可以帮助熟悉命名的新手快速了解架构。 你正在研究的这个课程应该像一个代理,甚至是一个正面?

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

我绝对能感觉到你 我感到你的痛苦 我想到的每个名字对我来说似乎都是垃圾。 这一切似乎都是通用的,我想最终学习如何在我的名字中注入一些天赋和创造力,使他们真正反映他们所描述的。

我有一个build议是咨询一个词库。 Word是一个很好的例子,Mac OS X也是如此。这真的可以帮助我摆脱困境,给我一个很好的起点和灵感。

如果这个名字能够向非专业程序员解释,那么可能就不需要改变它了。

我不觉得困难。 如果你不能命名它,那么也许你不需要它。 devise越好,就越容易命名你devise的东西。

现在的临时variables,这是一个不同的故事。 🙂