关于命名规则的胡思乱想
- 一、林子大了,什么鸟都有
一个程序员,不管你使用什么语言,有一件事你无法回避:命名规则。遥想在软件的侏罗纪时代,fortran程序员根本就不用考虑命名规则。为啥?编译器规定变量名不能超过6个字符,你就是会七十二变,也还能玩出啥花来?哪像现在,一个标识符MyName,Camel规则说要写成myName,Pascal规则说要写成MyName,匈牙利规则说来个类型前缀吧要写成strMyName,数据库程序员说你这是表名称还是视图名称,表名称写成T_MyName,视图名称写成V_MyName,CSS工程师说…。卖糕的,还要不要程序员活了?
- 二、标识符究竟应该咋命名?
标识符相当于文章中的词汇,一组词汇串成一篇文章。文章给谁读?是给程序员读,还是给编译器读?当然应该是给程序员读?ok,既然是给程序员读,那么标识符的命名规则当然应该是让程序员读起来更舒服。那么我们来分析一下,常用的命名规则中哪些是方便程序员阅读程序的规则。
- 2.1用大小写分隔多词标识符
Camel规则也好,Pascal规则也罢,讲的都是用大小写来分隔多词标识符,方便程序员从字面理解标识符的含义,就像我们在文章中用分隔符来断句一样。否则你能一眼猜出下面这个标识符是啥意思GUESSWHOWILLCOMEFORDINNERTONIGHT?至于是小写开头还是大写开头,就像格列佛游记中小人岛上的居民争论鸡蛋应该从大头敲还是小头敲一样,不过是个文化习惯问题。当然,考虑到命名规则中如果使用前缀的情况,我更喜欢Pascal规则。因为前缀通常用小写,Pascal规则可以在前缀和标识符正文间少敲一个下划线"_”。程序员都喜欢偷点懒嘛,呵呵。
- 2.2前缀
自从Microsoft程序员查尔斯·西蒙尼(Charles Simonyi)提出匈牙利命名法后,前缀在命名规则中就被程序员们大用特用。C++程序员习惯了szMyName之类用前缀表示变量类型,Delphi程序员则喜欢用edtMyName表示控件类型。发展到后来,前缀又用来表示变量的作用域,比如全局变量用g_MyName,成员变量则用m_MyName。前缀甚至还能用来区分原生数据类型还是用户自定义数据类型,MFC程序员在每个类前面加一个C写成CName,vcl程序员则在每个类前面加个T写成TName…总之,各家有各家的高招。那么前缀究竟是该加还是不该加呢?我想首先要看添加的前缀是否有助于程序员理解程序代码,其次再看为了记忆这些前缀的含义是否增加了程序员的负担。
- 2.2.1 前缀表示数据类型
前缀表示数据类型最大的优势就是让程序员能够从源码中检查表达式赋值是否类型匹配。比如
int iAge=10;
char* szName;
…
…
…
iAge = szName;
程序员一眼就能发现iAge = szName两边表达式不匹配。但问题是数据类型的数量是无穷多的,如果每个数据类型都定义一个前缀的话,程序员要记住多少个前缀呢?C程序员看到LPSTR,LPCSTR, LPWSTR, LPCWSTR…等各种类型的字符串指针前缀时,有没有种欲哭无泪的感觉?而且java,C++,C#等OO语言中,对象是支持多态的,从表达式两端前缀是否匹配去判断赋值合法性已经不可能了。因此说C语言等弱类型检查的语言中前缀还有意义的话,其他强类型检查的语言还是把类型匹配的活交给编译器干吧,别再折腾前缀与数据类型的关系了。
- 2.2.2 前缀表示作用域
这个我喜欢。首先,作用域无非是全局、局部、类、文件等有限的几种,需要记忆的前缀很少。其次,标识符带作用域能辅助程序员分析代码的合理性。特别是在没有IDE支持的情况下,翻来覆去在标识符的定义处和使用处跳来跳去,实在是太辛苦了。我常在全局变量前加g,比如gCount,类成员前加m,比如mValue,局部变量前加a,比如aOrderedBook(当然你也可以不加,变换下大小写,直接写成orderedBook)
- 2.2.3 前缀区分原生数据类型和自定义数据类型
这个完全没必要了。一个类有必要在前面加个C或T吗?在Pascal规则中,任何以大写开头的都是类型,以小写开头的都是变量或函数,不是很清楚了吗?
- 2.3 标识符的词性
文章是由词汇串成的,程序是由标识符串成的。文章是有句法的,什么主谓宾,主谓,祈使…,考过四级英语的都知道。如果程序读起来向读英语短文一样,对于程序员理解源程序肯定是有帮助的。为了让由标识符串成的程序贴近英文句法,必须考虑标识符的词性。那么标识符常用哪些词性呢?名词、动词、形容词。变量通常应该用名词或名词词组,比如Printer,OrderedBook都是好的标识符,函数通常应该用动词或动词词组,比如Print,OrderBook等。在写程序时,把变量和函数一结合:Printer.Print(),读着就符合英文语法。形容词用在哪呢?表示状态的变量或属性。比如Form.Visible。查询状态的函数则可以写成be+形容词的形式,比如IsVisible。总之,合理使用标识符的词性,能提高源程序的可读性。
- 2.4 长度
一个多词标识符中,每个词都要写全称吗?还是可以缩写?多长的标识符是合适的?常看到一些编码规范中要求单词全拼,严禁缩写。其实完全没必要这么教条。全拼的目的不过是为了避免缩写带来歧义,只要没歧义,缩写又何妨。
比如一个函数SaveJointPhotographicExpertsGroupFileToDatabase,
另一个函数SaveJpegFileToDb,你更喜欢哪个?
标识符多长合适?别超过4-5个词。一般的名词短语=形容词+名词/名词短语,动词短语=动词+名词/名词短语比如do sth.。复杂点的动词短语=动词+名词/名词短语+介词短语,再长就变成句子了。而且标识符太长也不便于理解。
下面是一些在知名程序包中发现的长函数名,你喜欢吗?
1。com.db4o.db4ounit.common.backup.BackupFromMemoryBinIsAccessibleThroughStorageTestCase;
2。org.aspectj.weaver.patterns.HasThisTypePatternTriedToSneakInSomeGenericOrParameterizedTypePatternMatchingStuffAnywhereVisitor;
3。com.sun.java.swing.plaf.nimbus.InternalFrameInternalFrameTitlePaneInternalFrameTitlePaneMaximizeButtonWindowNotFocusedState;