Home »  coding » 代码命名的思考和理解

代码命名的思考和理解

前言

一个软件最后都会落实到代码。而代码,其背后的架构设计或设计思想或模式固然重要,但我觉得更重要的东西则是良好的命名。混乱或错误的命名不仅让我们对代码难以理解,更糟糕的是,会误导我们的思维,导致对代码的理解完全错误。相反,良好的命名,则可以让我们的代码非常容易读懂,也能向读者正确表达事物以及逻辑的本质,从而使得代码的可维护性就大大增强,读命名好的文章是非常流畅的,会有一种享受的感觉。

另外一点也许大家还没感受到,那就是良好的命名,以及良好的命名习惯,由于我们总是对每个概念的名称要求非常苛刻,我们会思考这个名称所表达的概念是否正确,该名称是否正确表达了事物的本质或正确反映了某个行为的逻辑。所以,这种对命名的良好思考习惯,可以反过来帮助我们纠正之前的一些错误设计和代码实现;比如,你之前有一个地方可能命名不太准确,然后你发现后面有另一个地方需要用这个名字,且更合理。所以你会发现这个名字对前面的地方就不适合了,从而你会去思考前面的地方可能需要用其他的名字,或者你会发现前面的地方的设计根本就是有问题的。这种就是名字可以促使你思考你的设计是否正确的例子。

命名混乱或错误的主要原因:

去改进

通过一些不太好的代码命名来分析一些简单的命名问题

Alt text

以上代码中,有很多问题,我们来一一分析:

方法的参数,第一个字母,一会儿大写的P,一会儿小写的p,不一致; 第二个参数后面出现多余的空格,不应该; _paramsTable这个参数为什么要出现下划线,而其他参数没有下划线,不一致; publishRequest属于camel命名法,而iSignCounter, sStageIsOK这种属于另一种命名法,这种命名c++中用的多,不一致; foreach循环中,参数名叫instParam,但是后面的集合叫arrParams4SignActions,更对称一点的,应该叫arrInstParam; 方法的最后两行,出现多余的空格,导致代码格式排版混乱; 从上面的代码我们可以知道,仅仅是通过这些细节,就能发现很多问题。我们写代码时,只要多细心点,多注意点排版是否美观一致、命名是否统一,那代码写出来就会漂亮很多了。下面我们再看看其他的代码:

Alt text

上面的代码中,两个参数的命名也不一致,projectid中,i是小写,但是publishId参数,i却是大写,应该都统一为大写; ViewData中的key,一会儿是全部大写的UPDATE,一会儿是另一种命名,不一致; 上面的两个红框标出来的if,虽然都是只有一行代码,但是一个有括号,一个没有括号,不一致;且第二个if里出现了多余的空行,格式混乱;

Alt text

上面的代码中,函数中,一会儿用IList,是一个接口,一会儿用Dictionary,非接口,不一致;应该都用接口,或者都不用接口; listOriginal和receiverList命名不一致,要么全部list开头,要么全部List结尾; foreach循环中,变量的类型叫TDMSOriginalRequirement,但是变量名却叫originalItem,而集合名称又叫listOriginal,应该三者统一;比如foreach (Assembly assembly in assemblies) +“…”这个地方没有用空格,加号两边应该要空格,这属于格式混乱,不严谨; createUser这个变量取的很不理想,create是动词,createUser合起来就是创建用户的意思,而他这里要表达的意思是创建人的意思,所以应该叫createdUser或者creator; 为何originalItemFormat和originalItem的意思可以等价,不合理,如果等价,一开始就要命名为originalItemFormat;而且format是一个东西,动词放在最后,算个啥?

Alt text

上面这个类的几个私有字段中,有些带命名空间,有些不带,要么都不带,要么都带;一般命名空间都是在上面声明,后续不需要出现;
ILog logger;这一句有两个问题:1)logger为何没有下划线,不统一;2)为何类名叫ILog,而变量名叫logger,要统一,要么类名叫ILogger,要么变量名叫_log;

![Alt text]( http://jbcdn2.b0.upaiyun.com/2014/09/4bccb8daa3b21e3454f6d86897ac2e04.png)

上面这两个私有方法,一个是大写开头,一个是小写开头,不一致,混乱;应该要一致;

## 总结

通过上面的一些例子,我们知道,在我们不经意间,多写了一个空格或者一个空行,或者一个字母的大小写不一致了,都会导致命名的不一致;如果自己没有养成这种平时注重代码命名各种一致性的习惯,那写出来的代码很可能就是像上面那样。我觉得是非常糟糕的。上面我举的例子都只是简单的命名方面的,更深层次的命名问题,比如如何做到名称和其背后的实现内容一致,这个是需要我们平时不断修炼的。不是短时间内就可以做到那个程度。

我觉得,要做好命名,归根结底:

> 先要意识到命名的重要性;2)要端正态度,要认真的写代码;3)要努力推敲每个名称和其实际做的事情是否一致,也就是命名的准确性;4)要时刻注意命名的各种一致性;

> 养成良好的命名习惯不是为了别人,不是为了公司,而是为了提高自己的编程修养,提高自己认识事物的能力。