关于代码可读性的一些见解
可读性的重要性
编程有很多时间都在阅读代码,不仅要阅读自己的代码,还要阅读别人的代码。因此,可读性良好的代码能够大大提高编程效率。并且,可读性良好的代码往往会让架构更好,因为程序员更愿意去修改这部分代码,也更容易修改。只有在核心领域为了效率才可以放弃可读性,否则可读性是第一位。
可读性的体现
代码可读性体现在编码设计的各个方面,包括命名、注释以及逻辑等,接下来一一进行介绍:
命名
命名一方面得表达代码含义,比如find、start、search等一些表达力比较强的单词,别人一看就知道是什么含义,当然组合词也是很常见的,比如findItem、startThread等;另一方面是不能包含歧义,起的名字不能让人产生歧义,可以适当加一些前缀(is、has)和一些后缀(able)来增强语义表达。比如
- 用 min、max 表示数量范围;
- 用 first、last 表示访问空间的包含范围;
- begin、end 表示访问空间的排除范围,即 end 不包含尾部
良好的代码风格
添加适当的缩进与换行来增强代码可读性;提高代码以及注释排列的整齐性;代码语句不能随意改变顺序,虽然可能不会影响结果,但是可读性更差,对于自己或者他人在日后阅读这块代码的时候增加了难度。
注释
阅读代码首先会注意到注释,如果注释没太大作用,那么就会浪费代码阅读的时间。那些能直接看出含义的代码不需要写注释,特别是并不需要为每个方法都加上注释,比如那些简单的 getter 和setter方法,为这些方法写注释反而让代码可读性更差。
当然,不能因为有注释就随便起个名字,而是争取起个好名字而不写注释。可以用注释来记录采用当前解决办法的思考过程,从而让读者更容易理解代码。
注释用来提醒一些特殊情况:
- TODO——待做
- FIXME——待修复
- HACK——粗糙的解决方案
- XXX——危险!这里有重要的问题
在java中可利用一些ide配置一些注释模板,写起注释更加得方便,不同的ide配置方式也不同,这里就不进行介绍了
控制流的可读性
控制流的可读性说明白点就是对一些逻辑控制的可读性,业务开发过程中,逻辑控制是肯定避免不了。对于自己开发的代码,一段时间后再去看,如果逻辑被你写得“很复杂”,那估计也是很头痛的事,要是别人去看的话,估计想哭的心情都有了,所以逻辑控制的清晰度也是很重要的。
在java方面:
- 尽量少用三目运算符(tag?a:b),因为它看起来更不容易让人理解,可以用if/else来替换;
- 尽量用while来代替do/while,因为do/while的条件在后面,不够简单明了;
- 在循环嵌套语句中,尽量使用return、break以及continue来减少嵌套层数;
- 拆分长表达式也是很重要的,如果一些控制条件的表达式很长并且括号很多,相信一定是很头疼的事。所以拆分长表达是必不可少的,拆分可以分为两部分,一个是单纯用变量替换子表达式,另一个是可以结合逻辑运算符来使表达式逻辑更加清晰,两者结合起来使用效果更加。
- 减少变量的作用域,一个变量的作用域在满足需求的条件下是越小越好,当对其做修改时,影响的地方最好时一眼就能看出来,这样修改扩展就方便了。当一个变量作用域很大的时候,比如公有的全局静态变量(public static String temp),当你或者他人对其进行修改,造成的影响可想而知,因为所有的地方都能调用与使用。
单一职责
在java层面,这个原则尤为主要,不管是类还是方法还是属性,他们应该都是单一职责的,他们只负责某一项任务或者事情,只做一件事很容易让人知道它要做的事情。
任何大项目或者大工程都是由一件件小流程或者小事物组成,之所以有些项目star多,更受人学习推崇,是因为他们在事物拆分以及任务划分方面做的更好,整个代码结构更加的清晰,可读性更高,大家更愿意去学习。
设计简单为主
一开始不要过度设计,编码过程会有很多变化,过度设计的内容到最后往往是无用的,多用标准库实现。当然还是得尽量遵从对扩展是开放,对修改是禁止的原则。