因此,我正在处理这个类,它应该通过web服务从供应商请求帮助文档。我试着把它命名为documententretriver, VendorDocRequester, DocGetter,但它们听起来不太对。最后,我在dictionary.com网站上浏览了半个小时,试图找到一个合适的词。
带着坏名字开始编程就像早上头发很糟一样,接下来的一天就会每况愈下。感觉我吗?
因此,我正在处理这个类,它应该通过web服务从供应商请求帮助文档。我试着把它命名为documententretriver, VendorDocRequester, DocGetter,但它们听起来不太对。最后,我在dictionary.com网站上浏览了半个小时,试图找到一个合适的词。
带着坏名字开始编程就像早上头发很糟一样,接下来的一天就会每况愈下。感觉我吗?
当前回答
上个月我刚刚写了一篇关于命名惯例的文章:http://caseysoftware.com/blog/useful-naming-conventions
要点是:
verbAdjectiveNounStructure -结构和形容词作为可选部分
对于动词,我坚持使用动作动词:保存、删除、通知、更新或生成。偶尔,我也会使用“进程”一词,但只是专门指队列或工作积压。
对于名词,我使用与之交互的类或对象。在web2project中,这通常是任务或项目。如果是Javascript与页面交互,则可能是body或table。关键在于代码清楚地描述了与之交互的对象。
该结构是可选的,因为它对该情况是惟一的。列表屏幕可能会请求List或Array。在web2project的项目列表中使用的核心函数之一就是getProjectList。它不修改底层数据,只修改数据的表示形式。
The adjectives are something else entirely. They are used as modifiers to the noun. Something as simple as getOpenProjects might be easily implemented with a getProjects and a switch parameter, but this tends to generate methods which require quite a bit of understanding of the underlying data and/or structure of the object... not necessarily something you want to encourage. By having more explicit and specific functions, you can completely wrap and hide the implementation from the code using it. Isn't that one of the points of OO?
其他回答
我不得不承认命名是一门艺术。如果你的类遵循特定的“设计模式”(工厂等),事情就会变得简单一些。
为什么不叫HelpDocumentServiceClient有点拗口,或者叫HelpDocumentClient…它是供应商并不重要,重要的是它是处理帮助文档的web服务的客户端。
是的,命名很难。
好的命名约定应该尽量减少任何给定变量、类、方法或函数可使用的名称数量。如果只有一个可能的名字,你永远不会有困难记住它。
对于函数和单例类,我仔细检查函数,看看它的基本功能是否将一种东西转换为另一种东西。我对这个术语的使用非常宽松,但你会发现你写的大量函数本质上是以一种形式的东西产生另一种形式的东西。
在您的例子中,这听起来像是您的类将Url转换为Document。这样想有点奇怪,但完全正确,当你开始寻找这个模式时,你会到处看到它。
当我找到这个模式时,我总是将函数命名为xFromy。
因为您的函数将Url转换为Document,所以我将它命名为Document
DocumentFromUrl
这种模式非常普遍。例如:
atoi -> IntFromString
GetWindowWidth -> WidthInPixelsFromHwnd // or DxFromWnd if you like Hungarian
CreateProcess -> ProcessFromCommandLine
你也可以使用UrlToDocument如果你更喜欢这个顺序。不管你说的是xFromy还是yTox,可能都是个人喜好的问题,但我更喜欢From顺序,因为这样函数名的开头就已经告诉了你它返回的类型。
选择一个惯例并坚持下去。如果注意在xFromy函数中使用与类名相同的名称,就会更容易记住所使用的名称。当然,这种模式并不适用于所有情况,但它确实适用于您编写的可以被认为是“功能性”的代码。
不仅仅是命名一个类,创建一个适当的包结构可能是一个困难但有益的挑战。您需要考虑分离模块的关注点,以及它们与应用程序愿景的关系。
现在考虑应用的布局:
应用程序 VendorDocRequester(从web服务读取并提供数据) VendorDocViewer(使用请求程序提供供应商文档)
我冒昧地猜测,在一些课程中发生了很多事情。如果你将其重构为一种更加mvc化的方法,并允许小类处理单独的任务,你可能会得到如下结果:
应用程序 VendorDocs 模型 文档(保存数据的普通对象) WebServiceConsumer(处理web服务中的细节) 控制器 DatabaseAdapter(使用ORM或其他方法处理持久化) WebServiceAdapter(利用Consumer抓取文档并将其插入数据库) 视图 HelpViewer(使用DBAdapter输出文档)
然后,类名依赖于名称空间来提供完整的上下文。类本身可以固有地与应用程序相关,而不需要显式地这样说。因此,类名更简单,更容易定义!
另一个非常重要的建议:请帮自己一个忙,拿起一本《Head First Design Patterns》。这是一本非常棒的,易于阅读的书,将帮助您组织应用程序并编写更好的代码。欣赏设计模式将帮助您理解您遇到的许多问题已经得到解决,并且您将能够将解决方案合并到您的代码中。
我发现局部变量最麻烦。例如,我想创建一个DocGetter类型的对象。我知道它是DocGetter。为什么我要给它另一个名字?我通常会给它起一个像dg(用于DocGetter)或temp之类的名字,或者其他同样没有描述性的名字。