编程中的命名设计那点事
在我开始设计系统的时候,我会花去很多时间去设计命名,因为好的命名和好的设计是分不开的。
In the beginning was the Word, and the Word was with God, and the Word was God
太初有道。道与神同在,道就是神。 (约翰福音第一章,第一节)
在设计过程中给类,方法和函数好的命名会带来好的设计,虽然这不是一定成立,但是如果坏的命名那一定不会给你带来好的设计。在设计过程,如果你发现你很难命名某一个模块,某个方法时,可能你真正遇到的问题不是难命名的问题,而是这个设计是否真的合理,你或许应该花更多的时间来重新设计一下你的模块。
好的命名不仅会带来好的设计,好的命名还提高了程序的可读性,降低代码维护的成本。另一方面,如果糟糕的命名会给代码带来一堵无形的墙,让你必须深入代码去研究代码具有的行为,增加你理解代码的时间。
为此我总结了几条关于命名的指导原则,希望这几条原则能为你的命名设计带来帮助,我使用的是C++的语法,当然这些原则也很容易扩展到其他语言中去。
类型命名(类,接口,和结构)
名字应该尽量采用名词
Bad: Happy
Good: Happiness
不要使用类似名字空间的前缀
Bad: SystemOnlineMessage
Good: System::Online:Message
形容词不要用太多,能描述清楚就行
Bad: IAbstractFactoryPatternBase
Good: IFactory
在类型中不要使用Manager 或则 Helper 或则其他没意义的单词
如果你一定要在一个类型上加上Manager或Helper,那么这个类型要么就是命名的非常糟糕,要么就是设计的非常糟糕,如果是后则,那么这个类型就应该管理manage和帮助help一下自己了。
Bad: ConnectionManager
XmlHelper
Good: Connection
XmlDocument, XmlNode, etc.
如果某个类不能通过简单的命名来描述它具有的功能,可以考虑用类比的方式来命名
Bad: IncomingMessageQueue
CharacterArray
SpatialOrganizer
Good: Mailbox
String
Map
如果你使用类比,你就应该一致的使用它们
Bad: Mailbox,DestinationID
Good: Mailbox,Address
函数(方法和过程)
简洁
Bad: list.GetNumberOfItems()
Good: list.Count()
不要太简洁
Bad: list.Verify()
Good: list.ContainsNull()
避免缩写
Bad: list.Srt()
Good: list.Sort()
对于完成某件事情的函数使用动词
Bad: obj.RefCount();
Good: list.Clear();
list.Sort();
obj.AddReference();
对于返回布尔型的函数,使用类似提问的方式
Bad: list.Empty();
Good: list.IsEmpty();
list.Contains(item);
对于只是返回属性,而不改变状态的函数则使用名词
Bad: list.GetCount();
Good: list.Count();
不要在函数名字中重复参数的名称
Bad: list.AddItem(item);
handler.ReceiveMessage(msg);
Good: list.Add(item);
handler.Receive(msg);
不要方法的名字中重复此方法的类的名称
Bad: list.AddToList(item);
Good: list.Add(item);
不要在函数的名字中加入返回类型,除非函数名必须以返回类型进行区别
Bad: list.GetCountInt();
Good: list.GetCount();
message.GetIntValue();
message.GetFloatValue();
不要名字中使用And 或则 Or
如果你使用一个连接词来连接函数名,那么这个函数肯定是做了太多的事情,更好的做法是将其分成更小的函数来处理(类似面向对象设计准则中的责任单一原则)。
如果你想确保是这是一个原子的操作,那么你应该用一个名字来描述这个操作或一个类来封装他
Bad: mail.VerifyAddressAndSendStatus();
Good: mail.VerifyAddress();
mail.SendStatus();
这是一篇非常优秀的文章,我用我的语言在组织了一下,如果喜欢英文的读者可以点击这里阅读原文
(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)
《编程中的命名设计那点事》的相关评论
SDO for Java的规范中,就有XMLHelper,难道SDO的Java规范也是一个糟糕的设计? :)
额…说实话PHP的命名规范才是个问题,
有的时候我很想GetXxxxx但是不知不觉就get_xxxxx了….
个人觉得“在类型中不要使用Manager 或则 Helper 或则其他没意义的单词”这个有些问题,不能太绝对。很多的设计模式书里都有如此的设计,包括Helper、Handler、Mediator等辅助词汇。这些东西不是从现实中抽象出来的,本身就是一个辅助方法或信息的集合。ConnectionHelper和Connection明显不可能是一样的东西
个人觉得容易理解就好了~只要能够制定好一套规范并一直遵守下去就好了
好文章哦。读后受益匪浅,不过这个还是看自己的编程习惯或者是团队的开发文档要求了!
好文章,正在为编程中变量和函数命名发愁呢
代码规范让团队严格执行,然后做到代码容易理解就行……
Android中各种各样的Manager,按照你的说法都有问题?
命名,就是好好说话,
1.遵循语法,名词动词运用恰当;
2.表达不啰嗦,没有冗余信息;
3.表达精确,不放大或者缩小要表达的含义;
4.只要没有歧义,可以适当简洁