如何写出如散文般的代码――《代码整洁之道》读书笔记(Ch1-Ch3)

不知道有多少人像我一样,程序出现问题时添加函数添加变量解决,变量名用a,b,c等“简单”的字母来表示。不知道有多少人像我一样,看完自己的代码,心里暗骂“什么玩意儿!”。没有规范的约束,写出的程序最多只能应付作业,根本达不到实用的目的。为了自己写出的程序能像诗歌一样优美,我开始学习前辈的经验。

第一章、整洁代码

代码的必要性。很多人幻想着能出现一个超级AI,能够把你的自然语言表述的指令直接翻译成程序然后执行,即使你的表述很随意。很抱歉,机器只会严格按照指令执行,你说的人所理解的话他们听不懂。除非你造出来一个人,不过这技术早就有了。必须要有严格的命令规范,逐条下达,机器才能去执行。而这种严格规范的命令,就是代码。

为什么会产生糟糕的代码?“明天就是ddl了,可是我的程序只完成了一半啊”,时间的约束致使你不得不为了达成目标放弃可读性。“啊,又要写代码”,也或许你本身就很懒,没有积极性,只会应付差事。关于前者,为了赶时间而仓促的编写代码大部分情况下的结果是,你并不能完成要求通过测试,面对糟糕的代码越改越乱,最后崩溃。关于后者,劝一句,改行吧!

混乱的代价是什么?相信做过团队项目的人都有这样的经验:某天,进度检查,信心满满,因为昨天调试很成功,可是,检查的时候突然崩溃!你稍微有点慌了,不过嘴上还是说了一句“小问题,我看一下代码”。你开始看代码,许久,“奥,可能是这个变量出问题了,某某某,这个变量啥意思啊?”,“emm,……我。。记不太清了,要不我们改改吧”。面对着混乱的代码,你们组的人们开始建言献策,这里改一下,那里改一下。旁边的老师很无奈,于是走了。就这样,你们改了一整天,终于又可以了。可是,你们没有意识到的是,整齐的箱子里面藏着胡乱堆积的物品,早晚有一天一堆问题会洒出来!

如何避免混乱的代码?1.一开始编程时就要有严格的规范和良好的习惯。2.不要为了赶时间而放弃整洁性,制造混乱无助于赶上期限。3.在代码混乱度极高时,从头开始。

整洁代码的几个特征:1.整洁的代码只做好一件事。2.整洁的代码如同优美的散文,充满了干净利落的抽象和直截了当的控制语句。3.整洁的代码看起来像是特别在意它的人写的。

第二章、有意义的命名

取好名字的几条简单规则:

1.名副其实。你要让读代码的人看到你的变量名函数名就知道它是做什么的。例如:

int d;//消逝的时间,以日记

不要认为在这里注释就OK了,不要让读者在其他调用此变量的地方回过头看这里的注释,这样只会浪费宝贵的时间!最好像下面这样做:

int elapsedTimeInDays;

2.避免使用可能带来误导的命名。使用含有关键字的变量,如accountList,会让程序员怀疑这是不是一个List类型的变量,尽量不要在变量名中含有关键字。使用l和o会让人疑惑,这到底是数字还是字母。避免误导是“干净利落”的重要前提。

3.做有意义的区分。使用a1,a2,a3……作为一组变量只会让人摸不着头脑。使用同义词来表示不同的变量也会令人头疼。

4.使用通俗的词汇。不要出现在助教面前讲代码时“这个变量怎样怎样,那个变量如何如何”的的丑态。要能够清楚的读出来你写的程序,包括每一个变量,每一个函数。记住,编程不需要你展现高深的词汇量和取巧的缩写命名(genymdhms),清晰是首要原则。

5.使用可搜索的名称。编程软件都有搜索字符串和替换的功能,为了方便修改程序,你搜索"apple",全部替换成"pear"。令你欲哭无泪的是,所有的"redapple"都变成了"redpear"。我想,吃过“redpear”的人应该能懂这一点的重要性。

6.词性恰当选择。类名和对象名最好是名词或名词短语(如:Customer,Account等),方法名最好是动词或动词短语(如:postPage,deletePage等)。

在我看来,以上6条比较重要,其余的简介见《代码整洁之道》第二章。

第三章、函数

写好函数的几点要求:

1.短小。函数不应该大到足以容纳嵌套结构。依据作者的经验,函数应该在20行以内。从小学开始,语文老师就告诉我们,写作文要坚决避免开头中间结尾的三段式。肥胖的肚子着实令读者难受。相比之下,优秀散文作品都是三五行为一段的,这种方式令读者省力,更容易去感受文章的美。

2.只做一件事。企图一个main函数解决所有问题是很多新手的通病。不妨将各个功能分成不同模块,用不同的函数实现。我经常这样比喻,函数就是一个一个的积木块,构造好了所需要的各种积木块之后搭建城堡就变成了一件有趣且简单的事情。

3.遵循向下规则。举个例子:1.我要去吃饭。2.去芳华吃的话要走经过图书馆的路。3.到了芳华,吃米饭还是吃面食。程序要有层次,一步一步引导读者明白你要做什么事情。在这里可千万不要用小说写作中那些倒叙插叙之类的手法,那样只会让人云山雾绕,毕竟程序追求的是简洁易懂,而不是富有哲理。

4.switch语句。(这种问题的解决方法没看太懂。)

5.使用描述性的名称。清楚的利用函数的名称展现这个函数要做的事,例如,OrderStudentId(对学生Id排序)要比Order(排序)要更清楚。就像每一段的主旨句一样,交代清楚这一段的内容是十分友好的。

6.函数参数数量要少。最理想的参数数量是0,其次是1,再次是2,应尽量避免3。这里有一些应当注意的地方:

1>一元函数中参数有两中情况,1.提供信息 2.被操作。2>用两个函数替代含有标识参数的函数(如,calcute(Boolean isFloat))会更加清楚。3>如果函数需要两个、三个或三个以上的参数,可以将这些参数封装成类。4>尽量不使用输出参数。

7.无副作用。应该避免程序对一些变量(如全局变量)做未能预期的改动。别人调用某个函数完成了某个功能,但对函数中某个全局变量的改动却一无所知,在程序不够健壮的情况下极易出问题。

8.指令与询问应当分开。函数应该修改某对象的状态,或是返回某对象的有关信息。两样事情都干只会带来混乱。

9.使用try/catch替换if/else返回错误信息。使用try/catch返回错误信息能够避免使用if/else带来的多重嵌套问题。但是try/catch代码块并不美观,最好将这一部分从主体中抽离出来另外形成函数,而且这个函数只应做错误处理这一件事。

10.避免重复。曾有个编程很好的同学跟我说,“凡是出现超过两次的代码,都应该写成函数”。这样做一来简化了修改的复杂度,二来减小了出现错误的可能性。

11.如何做到以上10条。首先,不要企图一次性按照标准写出完美的代码,这样必然十分痛苦。最好的做法是像写文章一样,最开始打初稿,随便写,只要能完成自己的想法。然后思考自己的立意(也就是解决问题的方案)是否需要改变,不断修改至最佳。最后再按照以上标准,开始逐段逐句优化,擦去粗糙的棱角,适当改变层次结构,完成一篇优美的作品。

原文地址:https://www.cnblogs.com/ustckx16/p/8600961.html