Change Dir

先知cd——热爱生活是一切艺术的开始

统计

留言簿(18)

积分与排名

“牛”们的博客

各个公司技术

我的链接

淘宝技术

阅读排行榜

评论排行榜

从形式上写优秀代码

 

1.    优秀代码

什么样的代码是优秀的代码?这个概念目前还没有人能确切的定义。然而广大的程序设计人员普遍都认可的一系列标准基本上从各个层面提出了对优秀代码的要求。最近在读《编程匠艺》,觉得文章都写的很出色,相比之前读《卓有成效的程序员》,该作从代码本身讲述了编程“那些事”。深受启发,写写读后总结。

http://gxgonline.bokee.com/679308.html 这里有一段“优秀代码标准”,具体限于篇幅不再赘述。只是从自己这个编程菜鸟的角度,去谈谈对编写优秀代码的理解。正如每个人心中都有一个衡量标准一样,我对优秀代码也有一个衡量的标准:结果正确的,形式优美的,性能高效的,易重用和健壮。当然结果的正确性和程序本身的性能取决于算法设计,这是另一回事,不是本文所讨论的问题,本文只讨论与代码的形式和结构有关的问题。

2. 编写优秀代码

       优秀的代码首先具有优美的样式,我想这点是所有编程人员所共识的。没有人愿意读晦涩难懂的代码,相反,如果放在你面前的代码结构清晰,样式优美,那么读程序的人想必也读的心旷神怡了。要记住一点,代码写出来并不是永远给自己看的,而且就算给自己看,也不是一直都能看的懂的。那么如何写出形式优美的代码呢?第一点应该注意的就是代码样式,什么是好的样式:一致,传统,简洁。

一致的代码主要指程序中代码缩进要一致,括号的位置要一致……其实不用细数,所有的一切关于代码的东西,都要一致。正像那些大师们说的,“挑选一种适合你的风格,然后坚持下去”,这就是一致。那么好了,有哪些好的风格呢,经典的括号位置有K&R风格和悬挂式风格,具体是什么样的,见下表:

1. 括号风格

K&R风格

void k_r_style() {
    
// Do something
}

 

悬挂式风格

 

void exdented()
{
    
// Do something
}

 

另外一个要一致的东西就是命名了,就像文章由断落、章句和字词组成一样,代码也由变量、函数、类型等等构成。合理一致的命名对于代码的样式同样重要。“恰当地命名的关键是准确理解你所命名的对象。只有这样你才能给它起一个有意义的名称。如果你不能为某个对象起一个号名字,那么你就不会真的知道这个对象是什么或者这个对象真的有必要存在吗?”

接下来说说名字,名字首先得是描述性的,单纯的字母命名是我们编程最常用的,为什么如此,我把它归结为我们初学编程时那一点点的懒惰,随便的定义int a, int b这样的变量,完成着短小的程序。但是当程序渐渐的大起来,文件渐渐的多起来,这样的变量名字显得那么的渺小和苍白而最终毫无意义。所以如果无法描述一个对象,就不要为它起名字。第二,技术上是正确的,关于这点,由于现在的编程工作大多是在IDE下进行,因此这部分的检查工作我们程序员都交给了IDE,当然如果命名满足了第一条——具有描述性——那么也基本不会违反技术规范了。第三,恰当的,恰当的命名体现在长度和格调上,也许你为一个变量起了一个具有描述性的名字并且也是技术上正确的(且符合语言习惯),但是它却长达30个字符(theNumberOfImagesInMyComputer)或者只有1个字符(a,b等等),这样的做法是不好的。对于命名格调的理解,我想这是一个文化背景的问题,有的人很喜欢用foobar这样的诡异名字,这样做其实违反了“传统”原则,这个稍后会提到。关键需要记住的“了解你的语言的命名规则。但更重要的是看,了解这种语言的习惯用法。公共命名约定是什么?应用这些语言习惯和约定。”

编码要符合标准,这样就会与别人的一致,同样也会与自己过去写的代码一致。这种纵向横向的一致往往从一个编程标准开始。当然编程标准的制定也应该是尽量符合传统,这就说到第二个问题了。

不要去新鲜的创造样式,而应该去遵循传统。这样可以确保别人读懂你的代码,同时不会让未来的自己和其他人犯晕。我理解的传统更像是一种大众化,就像上面讲到命名时说的,不要用诡异的名字,foobar不是什么好的选择。

简洁讲的更多是一种补充。假设你自己订立一个标准的话,你遵循了传统,也一直坚持使用它,但是由于你的天才你把编程标准弄的过于复杂,这样可是苦了其他的程序员了。所以,能简洁是尽量简洁,不要追求华而不实的代码样式。记得自己以前写代码,总写一些类似于“a[index++] = some();”这样的代码。现在想想,还是改成“a[index] = some(); index++;”这样更简洁。简洁不意味着代码行数少,而是让人看着舒服。

我认为,程序员写代码就像作家写文章一样,清新的结构,行云流水的成文往往能令读者身临其境。而我们作为读者读代码的过程中,也无不希望代码优美,就像是在看优美的散文一样。其实说了这么多,无论是缩进或者括号位置更甚者是命名,这都是在增强我们代码的可读性。当你读代码像读文章一样,那时你就是一个专业程序员了,当你写代码能像写文章时,那时你就是一个优秀程序员了。

当然代码的可读性离不开注释,注释本身不是代码,但是确是优秀代码所必不可少的东西。“注释的目标读者是人,而不是计算机。”注释是一种内部的文档化机制。什么时候写注释呢?这个问题其实很好回答:当你需要解释代码为什么时,去写注释。那么如何写呢?记住几条法则,确保遵循这些法则,那么你也能写出美妙的注释。第一,不要描述代码,“一个事实——一个源头,不要在注释中重复代码。”因为本身你是在解释为什么而写代码,这是一种目的解释,而不是过程描述。所以如果你有解释代码的注释习惯,那么,摒弃它吧(当然个别难以理解的算法除外)。第二,不要取代代码,“当你发现自己在编写密密麻麻的注释来解释你的代码时,赶快停下来。”注释的字数不会太多,大量的注释看着也让人头痛。第三,确保注释有用,“想一想你在注释中写些什么,不要不动脑筋就输入。写完之后要在代码的上下文中回顾一遍这些注释。它们是否包含了正确的信息?”确保注释是有价值的,是真的,是容易理解和清晰明了的,不要用一些含混不清的俚语或个人幽默。最后,避免分心。注释中不应该包含那些陈年旧事,也不应该用各种ASCII图形来美化,因为字体宽度变化的多种编辑器可能让你这种美化丑陋不堪。同时我也不是很支持在代码块的结尾用“//end if(a<1)”这样的注释来解释。清晰的缩进和括号已经可以解释一切了。

说到底,清晰代码结构,良好的编码风格和注释,都是在提高我们代码的可读性。而我们写这样代码的目标就是代码的自文档化。我们总会在写完代码的时候,花费大量的时间去写文档,这其实从架构层面来讲,增大了耦合,谁的耦合?代码和文档的。代码一经改变,文档相应也要改变。这样的复杂关联总是耗费了编程人员大量的精力,那么为什么不去在代码本身的形式上花些功夫呢?如果我们都能编写可以阅读的代码,人性化,简单易懂,那么文档还需要吗?就像我们看书籍作品,很少见哪本小说还配着一部说明文档的。

最后,再说一说代码的易用性和健壮性。除了美观可读这些外部特性外,编写代码还应该具有易用性和健壮性。《Code Craft》里提倡使用防御性编程,并给出了防御性编程的一些技巧。当然我并不是防御性编程的fans,也不是契约式编程的死忠。只是从健壮性的角度看,防御性编程是必须的。然而过多的防御降低了代码的效率,有时候甚至是美观,这样的代码也许使问题复杂了。不管怎么说,代码的易用和健壮是经验积累的体现,怎样写出这样的代码?好吧,没有捷径,大量的编写代码并阅读其他人写的优秀的代码。渐渐的,你会发现,你的代码也可以同样的优秀。

3. 小结

       本文主要从代码的形式上讲述了编写优秀代码应该注意的一些细节。当然,代码的核心——算法没有涉及。最后的一些关于代码健壮性的认识也是拙劣有余。作为一个编写代码爱好者,写出优秀的代码是我们追求的目标。培养良好的编程习惯,掌握更多的编程技巧,不断的编写和阅读……一点心得,一点总结。

4. 参考文献及推荐阅读

[1]http://gxgonline.bokee.com/679308.html

[2]编程匠艺, Pete. Goodliffe著,韩江、陈玉译

[3]如何编写优秀代码,http://hi.baidu.com/08027/blog/item/bc30cefe78e1bf305d6008ef.html

posted on 2010-04-19 10:35 changedi 阅读(569) 评论(0)  编辑  收藏 所属分类: 杂谈


只有注册用户登录后才能发表评论。


网站导航: