如何写出如散文般的代码――《代码整洁之道》读书笔记(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关键字,循环式预存长度等 ...
随机推荐
- UVA1602
实现的细节很多,学到了如何翻转.旋转.平移,get很多技巧,值得一做. AC代码: #include<cstdio> #include<cstring> #include< ...
- nyoj720 项目安排 二分+dp
思路:dp(i)表示前i个项目的最大收益,转移方程很好写dp(i) = max{ dp(k) + val(i) },val(i)表示第i个项目的价值,dp(k)表示前k个的最佳收益,k满足ed(k) ...
- HDU - 3567 Eight II (bfs预处理 + 康托) [kuangbin带你飞]专题二
类似HDU1430,不过本题需要枚举X的九个位置,分别保存状态,因为要保证最少步数.要保证字典序最小的话,在扩展节点时,方向顺序为:down, left, right, up. 我用c++提交1500 ...
- 转:20分钟教你使用hexo搭建github博客
注册Github账号 这里我们就不多讲了,小伙伴们可以点击这里,进入官网进行注册. 创建仓库 图片来自Github 登录账号后,在Github页面的右上方选择New repository进行仓库的创建 ...
- iOS.Animations.by.Tutorials.v2.0汉化(四)
第三章 转换 在前面的两章,你学习了如何创建基于视图位置和透明度alpha的动画属性的动画.但是,如果您希望在视图上添加动画或删除动画,您将如何处理呢? 您可以使用前几章的方法来设置进出界面的动画效果 ...
- 关于echarts
昨天随手玩了下echarts,看见同事纠结于echarts的兼容问题. 最简单的echarts(官网的): <div id="main" style="width: ...
- RGMII,MII,GMI接口
简介 RGMII(Reduced Gigabit Media Independent Interface)是Reduced GMII(吉比特介质独立接口).GMII和RGMII均采用8位数据接口,工作 ...
- Android中Java和JavaScript交互
Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本.本文将介绍如何实现Java代码和Javascript代码的相互调用. 如 ...
- mysql字符串连接
用SQL Server 连接字符串是用“+” 现在数据库用mysql, 写个累加两个字段值SQL语句居然不支持"+",郁闷了半天在网上查下,才知道mysql里的+是数字相加的操作, ...
- VxWorks下USB驱动总结2
3:USBD驱动详解 这一部分将要描述USBD(USB Host Driver)的典型应用.例如初始化,client注册,动态连接注册,设备配置,数据传输,同时还探讨了USBD内部设计的关键特性.这部 ...