什么是好代码-代码整洁之道阅读笔记
2016-11-23 01:06
309 查看
根据我所阅读的书《代码整洁之道》里的一句话:
“衡量代码质量的唯一有效标准: WTF/min”
从哲学的角度讲,不得不说这真的很客观!!!
毕业不久的我也没有太多关于好代码的定义。应该说没有明确的定义。但是当我看到一段好的代码与坏的代码,作为初学者的我也能够辨别哪个好,哪个不好。
所以客观角度讲。是有好代码跟坏代码的差别的。下面我就简单记录下这本书中讲的一些要点,一方面给自己加深印象。另一方面打发无聊时间,快速度过没有女票的日子。
避免使用魔术数字
避免误导
避免使用无意义的字母(如a、b、i…)
使用团队内一致认可的,通用的命名(如:generateXxx生成xxx、searchXxx搜索xxx、doSomethingWithXxx使用xxx做什么操作…)
避免使用编码(避免使用变量前缀、后缀)
类名应该用名词或者名词短语、避免使用动词
方法名应当使用动词或动词短语命名
每个抽象概念选一个词,并一以贯之(团队里面的代码中不应该出现表示同一个抽象概念的不同命名,例如同样表示获取这个抽象概念就不应该在代码里面出现同样表达”获取”这个抽象概念的多个命名fetch、retrieve、get、obtain等等)
多使用解决方案领域命名(例子待完善)
分离解决方案领域跟问题领域的名称命名(遇到与所涉及问题领域更贴近的代码时,应当用问题领域的名称来命名)
只做一件事情
难点就在如何定义这件事情?难点演化后其实就是一件事情跟、步骤如何划分的问题。
例如,现在有个问题是如何将一只大象放入冰箱?可以抽象出一个函数叫putElephantToRefrigerator()。
具体这个函数内部实现可以将这件事情分为三个步骤:
打开冰箱openRefrigerator()。
推大象进入冰箱pushElephantIntoRefrigerator()。
关闭冰箱close()。
对于将大象放入冰箱这件事情而言,putElephantToRefrigerator()就只做了一件事情。只不过分三个步骤完成而已。但是对于openRefrigerator()这个步骤而言,它其实又是一件事情。只不过相对于putElephantToRefrigerator()这件事情它就是这件事情的一个步骤而已。因此事情与步骤只是在抽象层级上不同。函数也是如此
尽量保持每个函数都在最低的抽象层级上(多个层级函数的出现会导致代码让人迷惑)
函数内的语句都要在同一抽象层级上。
遇到switch语句时,应该考虑用多态(抽象工厂+策略可实现多态)替换switch的相关语句
“衡量代码质量的唯一有效标准: WTF/min”
从哲学的角度讲,不得不说这真的很客观!!!
毕业不久的我也没有太多关于好代码的定义。应该说没有明确的定义。但是当我看到一段好的代码与坏的代码,作为初学者的我也能够辨别哪个好,哪个不好。
所以客观角度讲。是有好代码跟坏代码的差别的。下面我就简单记录下这本书中讲的一些要点,一方面给自己加深印象。另一方面打发无聊时间,快速度过没有女票的日子。
如何命名
这个真的很重要, 大的不敢说。作为像我们这种二本三本出来的程序员真的很不注重这一点。身边的朋友大部分都是因为自己的英文不好,而导致命名不出符合语意的命名。这样随着时间的推移,会让代码越来越难理解。当然直接影响就是团队的工作效率急速下降。书中第二章提到关于命名的提到的点大概有:避免使用魔术数字
避免误导
避免使用无意义的字母(如a、b、i…)
使用团队内一致认可的,通用的命名(如:generateXxx生成xxx、searchXxx搜索xxx、doSomethingWithXxx使用xxx做什么操作…)
避免使用编码(避免使用变量前缀、后缀)
类名应该用名词或者名词短语、避免使用动词
方法名应当使用动词或动词短语命名
每个抽象概念选一个词,并一以贯之(团队里面的代码中不应该出现表示同一个抽象概念的不同命名,例如同样表示获取这个抽象概念就不应该在代码里面出现同样表达”获取”这个抽象概念的多个命名fetch、retrieve、get、obtain等等)
多使用解决方案领域命名(例子待完善)
分离解决方案领域跟问题领域的名称命名(遇到与所涉及问题领域更贴近的代码时,应当用问题领域的名称来命名)
函数如何封装
封装基本原则-短小(检验函数是否短小的方法: 查看函数是否可以切分为不同的步骤)只做一件事情
难点就在如何定义这件事情?难点演化后其实就是一件事情跟、步骤如何划分的问题。
例如,现在有个问题是如何将一只大象放入冰箱?可以抽象出一个函数叫putElephantToRefrigerator()。
具体这个函数内部实现可以将这件事情分为三个步骤:
打开冰箱openRefrigerator()。
推大象进入冰箱pushElephantIntoRefrigerator()。
关闭冰箱close()。
对于将大象放入冰箱这件事情而言,putElephantToRefrigerator()就只做了一件事情。只不过分三个步骤完成而已。但是对于openRefrigerator()这个步骤而言,它其实又是一件事情。只不过相对于putElephantToRefrigerator()这件事情它就是这件事情的一个步骤而已。因此事情与步骤只是在抽象层级上不同。函数也是如此
尽量保持每个函数都在最低的抽象层级上(多个层级函数的出现会导致代码让人迷惑)
函数内的语句都要在同一抽象层级上。
遇到switch语句时,应该考虑用多态(抽象工厂+策略可实现多态)替换switch的相关语句
相关文章推荐
- 代码整洁阅读笔记
- 代码整洁之道阅读笔记
- 代码整洁之道--阅读笔记
- [阅读笔记]代码整洁之道
- 代码整洁之道阅读笔记 一
- LUA垃圾回收部分代码阅读笔记
- IPVS代码阅读笔记(三):调度算法
- linux蓝牙驱动代码阅读笔记
- OpenOBEX代码阅读笔记
- RDBMS代码阅读笔记(一)
- Discuz!NT代码阅读笔记(4)--一切皆可配置:页面的显示
- arcgis server 9.2代码阅读笔记二:在页面上动态加载图层
- gmf logic example 代码阅读笔记
- Discuz!NT代码阅读笔记(5)--从全局看看:各个模块功能摘要
- Discuz!NT代码阅读笔记(1)--从HttpModule开始
- Discuz!NT代码阅读笔记(2)--网站安装自动化--论坛程序安装及初始化过程
- arcgis server 9.2代码阅读笔记一:在图层中增加一个点
- 关于main参数和inp.c代码阅读的一点笔记
- ThunderBird, NewsBlog部分代码阅读笔记
- arcgis server 9.2代码阅读笔记一:在图层中增加一个点