读书笔记《代码整洁之道》味道与启发 上

本章算是一个糟糕代码清单。列出了所有作者觉得不够整洁的点。本章可以作为代码review的标准来看。

主要从以下七个方面来阐述 1.注释 2.环境 3.函数 4.一般性问题 5.java 6.名称 7.测试 。作为前端开发者跳过第五个还有六个方面。

注释

不恰当的信息:

作者,最后的修改时间等 版本管理工具能记录的。(这点我不是很同意,因为仓库会被迁移,所以版本管理工具也不一定可靠,而且不能保证commit的时候 提交的信息都是有意义的,我觉得加个注释也无妨)

废弃的注释:

过时的,不正确的注释就是废弃的注释。也就是说如果注释内容已经和代码不符了 就要立刻删除 或者 更新掉

冗余的注释:

如果注释描述的东西 看代码就能一目了然 那么这段注释就是冗余的,比如说 i++ 就没必要再写一句注释 //i加1了。或者 let a = 0 也没必要写个注释说 初始化a为0

糟糕的注释:

语法错误 或者有错别字的注释 说很多废话的注释 都是糟糕的注释。如果要写注释就好好写。

注释掉的代码:

有一部分代码被注释起来是为了防止后续会再用到,但实际上 很少有注释代码重新派上用场的时候时候,他们的存在反而会分散开发者的注意力。

2.环境

需要多步才能实现的构建:

构建系统 应该是单步的小操作,应该能用单个命令签出系统,并用单个指令去构建它。

需要多步才能做到的测试:

对于项目的全系统测试  也应该通过单个指令就能触发。

函数

参数过多:

函数的参数应该越少越好,没有最好,一个次之,如果超过三个 就需要重新考虑,避免这种情况,

输出参数:

输出参数指的是 函数想对某个参数作出修改后再把这个改后的参数作为输出。这样是违反直觉的。如果我们有这样的需求,我们可以直接改变它所在的对象的状态,比如说定义函数 appendFooter (report)
本意是对report 对象加个footer  那么我们最好这么写,report.appendFooter();

标识参数:

标识参数指的是参数里有个布尔值,有布尔值参数说明了函数做了不止一件事,值为true时做一件事,值为false的时候干另一件事。我们应该把这种函数拆解成了两个小函数

死函数:

死函数指的是永远不被调用的方法,他们应该被删除。版本管理工具会记住这些代码。

一般性问题

一个源文件中存在多种语言: 理想中源文件只包含一种语言,现实中,我们可能会多于一种语言,但是应该尽力减少源文件中额外语言的数量和范围。(我感觉这个对于前端开发来讲 有点不太现实,特别是vue来说,他的html,css 和js本来就是杂糅的,从这个角度看 可能react也更符合作者的意思)

明显的行为未被实现:

函数名字取好后 ,别人看到这个函数名 可能会对这个函数的功能有一定的推论,比如说一个add()的函数,别人看到了就会觉得这个是用来计算加法的,但是 如果作者没有实现这个功能而使用来去做字符串拼接。那这个就代表 明显的行为 未被实现。

不正确的边界行为:

开发者可能对自己的代码比较有自信,觉得自己的代码没啥问题,但是每种边界条件,极端情形,每种异常 应该都要考虑到。应该追索每种边界条件,并编写测试。

忽视安全:

这条主要是用来警告 开发者 不要去忽略编辑器控制台等提示的警告和错误提醒。对于前端开发者来说 就是不要在本地关掉eslint的警告。

重复:

遇到重复的代码 说明抽象没有做到位。这些重复的代码 可以当作子程序,或者另一个类。
有一些较隐蔽的重复是 在不同的模块中重复出现的检测同一组条件的switch/case 或者if/else 链。
更隐蔽的形态是 算法类似,但是代码不太一样的重复。这种可以通过模版方法模式,或者策略模式来修正。 有很多设计模式 都是为了消除重复而产生的,我们要重视对重复的消除。

在错误的抽象层级上的代码:

创造一般性概念的高层级抽象模型 和 细节概念的低层级抽象模型很重要。java里创建抽象类来容纳高层级的概念模型,创建派生类来容纳低层级的概念模型。具体来说就是和细节有关的常量,变量或者工具函数在派生类中。基类(抽象类)对这些东西一无所知。

(同样对于前端来说,公共组件里面应该要提供一些抽象概念,但是不要添加一些细节性的东西。 vue提供了vue.extend()方法 也可以实现组件的继承。但是 我们更为常用的方法 是先创建一个公共组件,然后把它当作子组件,在外面调用它。虽然这样 子和父的叫法 有点和java是相反的,令人迷惑,但是意思大概都是这个意思。)

这段逻辑是说 不要在基类上写细节的东西。同理也不要在公共组件里写一些细节性的东西。这样才能更好的解耦。

基类依赖于派生类 :

基类是高层级的类,不应该依赖于较低层级类(这里说的依赖,就是调用到的意思,基类应该对派生类一无所知) 所以如果在基类提到派生类名称那就证明写得不够整洁(对于前端来说,如果在公共组件里看到模块组件的名字 就出问题了)

信息过多:

良好的模块有非常小的接口,良好的模块会减少暴露的接口数量 (也就是说 好的公共组件,内部能处理的逻辑都做完了,不需要你在外面传太多的东西。)我们也要学会隐藏工具函数,隐藏变量。

死代码:

死代码就是以前写过的,然后用不到的代码。比如说以前写的一个函数,换了需求用不上了 那就删掉。或者就是有的 if 语句永远是进不去的。这类也属于死代码。遇到死代码就把它埋葬,永远删除,和函数里的死函数意思一样。

垂直分离:

这里主要讲的是代码的垂直距离过长,导致上下切换着看特别不方便,比如说定义了一个变量,几百行后才会用到,这样的代码不太利于阅读。好的距离应该是 变量和函数 都在靠近被使用的地方定义。本地变量在首次使用位置上面。私有函数刚好在首次被使用的下面被定义。

前后不一致:

这里指的是指向同一个对象或者表示同一个变量的 名称要一致。前后不一致 会让人误解,以为代码不是同一个意思(比如说 如果定义产品实例 就用prodInst 不要一会儿用 prod,一会儿用prodInsts让人误解)

混淆视听:

对于没有用到的默认构造器,从没有用到的变量,没有信息量的注释,就喝死代码一样,删除掉好了。这样有利于保持文件的整洁。

人为耦合:

不互相依赖的东西不应该耦合,没有直接目的的模块不要依赖,这样会增加阅读障碍,应该花点时间研究一下在什么地方上声明函数。不要为了方便随手放置(这个不太理解)

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享