"IT有得聊”是机械工业出版社旗下IT专业资讯和服务平台,致力于帮助读者在广义的IT领域里,掌握更专业、实用的知识与技能,快速提升职场竞争力。
成长指南
提升代码的可读性
如何提高代码的可读性是一个永恒的话题。
通常认为程序员需要具备较强的“数学”功底,毕竟要掌握各类算法和模式都需要很强的逻辑思维能力。然而在经历了一段工作时间后,我发现程序员的“语文”能力也同样重要。《重构》一书就提出:唯有优秀的程序员才能够写出人类能理解的代码。软件的规模越来越大,一个系统通常需要几代程序员来开发维护。然而这些程序员们往往都素未谋面,只能“神交”于代码的字里行间。
提到可读性,其实涉及两个方面:一是作者的表达能力,二是读者的理解能力。比如我个人总认为自己在阅读文字时存在阅读障碍,然而阅读代码却较有心得。因为我很乐于去揣摩代码作者的意图,特别是在遇到一些很晦涩的代码时。
在实际工作中也经常听到一些程序员抱怨:这样的代码简直无法维护,还不如推倒重写。如果你也碰到这种情况,我想请你先思考,是自己的理解能力问题,还是原作者的表达能力问题?然后再决定下一步动作。同时我也总结了一条心得和读者分享:真正的高手不但要能写得出好代码,还要能驾驭得了“烂”代码。
我曾自我剖析造成阅读障碍的原因,主要是阅读量不够。我的确不爱读书,但我却读(调试)过很多开源软件代码。我接触的第一个开源软件叫SoX,它是一款Linux下的音频处理软件,支持多种音频格式。我花了很长时间去调试,不仅搞懂了它的框架和算法,还把其中一部分代码用到了自己开发的软件里。后来读了《设计模式》一书才意识到,SoX实际上是用C语言实现了一个策略(strategy)模式来支持各种音频格式。
从语文的角度看,代码的文体应该属于说明文或记叙文,要着眼于把事情说清楚,而并非诗歌、散文或小说,文中存在着很多暗喻和伏笔,需要读者揣摩。本章主要讨论表达能力方面的问题,即:代码如何能清晰地表达作者的意图,让人易于理解。
唐代大诗人白居易,史书评价其诗:“每成篇,必令其家老妪读之,问解则录。”意思是他每次写完诗,就会让家里的老婆婆读,老婆婆能读懂的话,才会编辑入册。
成长指南
提升代码可读性重要法则:设置缩进
我在Z公司时,公司有一条编程规范是缩进必须为4个空格。但我从来没有遵守过,一直我行我素地按照我的风格:缩进1个Tab并且在Source Insight里把Tab设置为8个空格。幸运的是从来没有人找过我的“麻烦”。
后来到了H公司也有一条相同的编程规范。当我继续按照自己的风格写代码时,Pc-lint(一种C/C++代码静态分析工具)报错了。于是不得不遵守这条规范。但在离开H公司后我还是继续按照我的风格写代码。
缩进为1个Tab并且把Tab设置为8个空格,这其实也是Linux内核的编程规范,我很认可并一直使用。这么设置至少有以下几个好处:
1)当代码嵌套层次过多时,代码就会比较靠右,这样更容易发现问题,并及时优化。
2)可以在代码编辑器中把字体设置得稍小一点,代码看起来也会很有层次。这样在单屏里面能够装下更多代码,方便阅读。
3)如果确实有人对8个空格不适应,还有折中的余地,他可以在自己的IDE中把Tab设置为4个空格。这样对大家都没有影响。
一种反对的观点认为switch…case…语句会过于靠右,因为通常的做法是case关键字较switch关键字多一层缩进。使用Tab对应8个空格作为缩进时,代码会像下面这样。
case关键字和switch之间已经有了一个Tab,而case内部的处理代码又多了一个Tab,从开始写case下的主要代码时,左边就已经有了24个空格(3个Tab),使得代码更加靠右。然而通过调整switch…case…语句的排布方式可以解决这个问题,让case和switch语句对齐,像下面这样排布代码,层次清晰也没有造成多余的缩进。
还有一种反对的观点认为使用Tab作为缩进会令代码在不同的编辑器中排布效果不一样。比如同一份代码在Visual Studio中能对齐,但在UltraEdit中却不能对齐。
实际上就缩进而言,只要Tab和空格不混用,是不会出现上述情况的。出现上述情况是因为使用Tab键控制代码左右的间隔来达到对齐效果。比如下面这部分代码,如果在某个编辑器中是在等号“=”左边使用了若干Tab键使得“=”保持在同一竖线。那么用其他编辑器打开同一个文件时可能会出现“=”不在同一竖线的情况。比如下面的代码块在Visual Studio中对齐。
但用UltraEdit打开时可能会是如下这样,最后一个“=”没有与上面的对齐。
原因是使用Tab控制代码的左右间距时,编辑器会使用某种适配算法根据Tab键所设置的对应空格数来显示Tab的长度。不同的编辑器算法不同,因此可能存在不一样的对齐效果。而使用空格就不会出现这类情况。因此推荐使用的代码排布方式为:在缩进时使用Tab,在其他代码块对齐时使用空格。这样就能达到代码在各种编辑器中保持同样效果的目的。如下所示。
注:由于页面排版限制,本书的其余代码除特殊说明外,都使用1个Tab且Tab为4个空格的排布方式。
本文内容节选自《码农修行,编写优雅代码的32条法则》
-End-