引子
奈何姓万
从前有个财主,家里很有钱,但是祖祖辈辈都不识字。财主想改变这种状况,便请了个教书先生来教他的儿子阿富读书写字。
先生开始教阿富,在纸上画了一笔,说这是“一”字。又画了两笔,说这是“二”字。再画了三笔,说这是“三”字。阿富心想原来写字那么简单,那“四”就是四条横线,“五”就是五条横线,依次类推。便大叫“会了!会了!”,然后跑到父亲那里说他已经学会写字了,让父亲把先生辞退了。财主也十分高兴,心想这下家里终于有了书香气!
后来有一天财主要请一个姓“万”的朋友吃饭,便叫阿富写一张请柬。但是阿富去了大半天都没有回来,财主便去催促。结果财主到书房一看傻了眼,地上铺满了纸,纸上画满了一条条的横线。而阿富还在卖力地一笔一画地写着。阿富看到父亲,抱怨道:“天下姓氏这么多,那人怎么偏偏要姓‘万’啊。要是姓‘十(石)’或者‘百(白)’,那我早就写完了。我这才写了五百,您再等等吧!”
我们就从《奈何姓万》这个故事说起吧。在我很小的时候就听过这个故事,当时觉得很可笑,世上怎么会有这么笨的人呢!然而在我开始学习编程以后,这个故事却时常在脑中浮现。直到现在写代码时仍然战战兢兢,我总在想自己会不会像阿富一样?会不会只学了一点皮毛就开始卖弄?会不会写得很烦琐?有没有更好的方法?
然而在我的职业生涯中,的确碰到过一名计算机专业的应届硕士毕业生写出了下面这样的代码。
我们那时的项目用C/C++语言开发,他在写一个单元测试用例时,要进行字符串比较,在进行字符串初始化时写了上面这样的代码。
这么短短的几行代码其实有好几个问题。第一个就是:为什么要用循环来赋值?在自行思考了一段时间后,他做出了如下改进。
这样借助于API性能会有所改善,而且代码量也小了。但是我的第二个问题又来了:为什么buffer大小是64?他似乎有所领悟,于是很快改了一个新的版本。
好吧!就算现在扩大为256,但如果今后发现空间还是不够,那还得改两个地方(buffer定义的地方、memset的第3个参数)。于是我顺手帮他又进行了修改。
这样今后如果再要修改buffer的空间大小时,只需要改buffer定义的地方就行了。
写代码时尽量为今后的修改做好准备:一次需求变更只集中修改一个地方。这样能避免很多因为代码修改而引入的问题。
当然你也许会问:这是最优的写法吗?答案是否定的,甚至没有一个标准答案,但针对这个问题的讨论我想先暂告一段落。你也许还会问:就几行代码至于这么折腾吗?是不是有点吹毛求疵了?我不这么认为。一个软件产品动辄几十万、上百万行代码,其实每一处都需要如此斟酌。产品的整体质量和每一行代码都息息相关。
下面的章节从代码的可读性、可靠性、效率、可维护性、可扩展性等几个方面进行了类似上述的斟酌,给出了一些编写代码的建议和改进方法,希望能对读者提高工作效率有所帮助。《Effective C++中文版》[1]是对我职业生涯影响最大的书之一,因此我也效仿它的编写方式,每种方法都独立成章节。读者可以按自己感兴趣的任何一种顺序来进行阅读。
[1] [美]Scott Meyers著,侯捷译。