如何写出如散文般的代码――《代码整洁之道》读书笔记(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条。首先,不要企图一次性按照标准写出完美的代码,这样必然十分痛苦。最好的做法是像写文章一样,最开始打初稿,随便写,只要能完成自己的想法。然后思考自己的立意(也就是解决问题的方案)是否需要改变,不断修改至最佳。最后再按照以上标准,开始逐段逐句优化,擦去粗糙的棱角,适当改变层次结构,完成一篇优美的作品。
如何写出如散文般的代码――《代码整洁之道》读书笔记(Ch1-Ch3)的更多相关文章
- 代码整洁之道读书笔记(Ch4-Ch7)
这几章从注释.程序格式.对象与数据结构的规范以及错误处理四个方面介绍了如何使代码变得简洁易懂.不同于上次摘抄的方法,这一次我会结合第一次个人作业的代码进行分析. 第四章 注释 这一章告诉我们,好的注 ...
- 我读<代码整洁之道>--读书笔记整理
第一章 整洁代码 "我可以列出我留意到的整洁代码的所有特点,但其中有一条是根本性的,整洁的代码总是看起来像是某位特别在意他的人写的.几乎没有改进的余地,代码作者设么都想到了,如果你企图改进它 ...
- 写出形似QML的C++代码
最开始想出的标题是<Declarative C++ GUI库>,但太标题党了.只写了两行代码,连Demo都算不上,怎么能叫库呢……后来想换掉“库”这个字,但始终找不到合适词来替换.最后还是 ...
- 写出gradle风格的groovy代码
写出gradle风格的groovy代码 我们先来看一段gradle中的代码: buildscript { repositories { jcenter() } dependencies { class ...
- [label][翻译][JavaScript-Translation]七个步骤让你写出更好的JavaScript代码
7 steps to better JavaScript 原文链接: http://www.creativebloq.com/netmag/7-steps-better-javascript-5141 ...
- 让你用sublime写出最完美的python代码--windows环境
至少很长一段时间内,我个人用的一直是pycharm,也感觉挺好用的,也没啥大毛病 但是pycharm确实有点笨重,啥功能都有,但是有很多可能这辈子我也不会用到,并且pycharm打开的速度确实不敢恭维 ...
- PyTorch最佳实践,怎样才能写出一手风格优美的代码
[摘要] PyTorch是最优秀的深度学习框架之一,它简单优雅,非常适合入门.本文将介绍PyTorch的最佳实践和代码风格都是怎样的. 虽然这是一个非官方的 PyTorch 指南,但本文总结了一年多使 ...
- PAT 1002 写出这个数 (20)(代码)
1002 写出这个数 (20)(20 分) 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值.这里保证n小于10^100 ...
- 如何写出高质量的JavaScript代码
优秀的Stoyan Stefanov在他的新书中(<Javascript Patterns>)介绍了很多编写高质量代码的技巧,比如避免使用全局变量,使用单一的var关键字,循环式预存长度等 ...
随机推荐
- ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(上篇)
前面文章介绍了ASP.NET MVC中的模型绑定和验证功能,本着ASP.NET MVC没有魔法的精神,本章内容将从代码的角度对ASP.NET MVC如何完成模型的绑定和验证进行分析,已了解其原理. 本 ...
- JS判断输入类型是否为正整数
需要用到正则表达式:"/^+?[1-9][0-9]*$/". 例子如下: <!DOCTYPE html> <html> <head> <m ...
- [Code] 中缀式转后缀式
[Code] 中缀式转后缀式 概要 对于一个可带括号的中缀四则运算表达式, 例如30 + 4 / 2 或 30 / ( 4 + 2 ), 下面代码将分别转换为对应的后缀表达形式 30 4 2 / + ...
- javascript中快速求数组的全部元素的相加之和
js中快速求数组的全部元素的相加之和: var arr = [1,2,3,4,5];var sum = eval(arr.join('+')); console.log(sum); 运行结果: 15
- php留言板
这个小项目的学习,就这样结束啦.由于过程中需要使用到js,这个目前还是感觉不会.之前的分析还是不太懂的.现在心里还是有点迷茫.什么都是照着葫芦画瓢. 我的拥有自己的东西才行.
- 谈一谈Java中的Error和Exception
Error和Exception的联系 继承结构:Error和Exception都是继承于Throwable,RuntimeException继承自Exception. Error和RuntimeExc ...
- Storm+HBase实时实践
1.HBase Increment计数器 hbase counter的原理: read+count+write,正好完成,就是讲key的value读出,若存在,则完成累加,再写入,若不存在,则按&qu ...
- [JCIP笔记] (一)多线程的起源
在很久很久以前,那时的计算机还没有操作系统这种东西,所以只能有一个程序,从头到尾地跑.于是这个程序要负责使用所有的资源,还得响应外部请求.想想这个程序得多复杂啊--为了做成一件事,可能要先把内存啊.I ...
- 第I篇PCI体系结构概述
PCI总线作为处理器系统的局部总线,主要目的是为了连接外部设备,而不是作为处理器的系统总线连接Cache和主存储器.但是PCI总线.系统总线和处理器体系结构之间依然存在着紧密的联系. PCI总线作为系 ...
- 云摘录︱Word2Vec 作者Tomas Mikolov 的三篇代表作解析
本文来源于公众号paperweekly 谈到了word2vec作者的三篇论文: 1.Efficient Estimation of Word Representation in Vector Spac ...