函数《代码整洁之道》
注释
1. 注释的作用
- 为了弥补代码表达某种意图时不够清晰的一种手段
2. 注释的缺点
- 需要写注释,就说明代码很糟糕,代码不能够清晰表达它的意思
- 注释会随着时间变得腐烂,离其描述的代码越来越远,甚至变得全部是错误的,因为程序员往往不能坚持维护注释
3. 好注释
- 不需要写注释就是最好的注释,由代码自己来阐述自己的意义
1 | File tempDirectory = FileUtils.getTempDirectory(); |
- 法律信息类型的注释,例如版权及著作权声明
1 | /* |
- 提供有用信息的注释,凡是能够根据注释去理解代码所代表的含义的信息,都可以称为有用信息,这个范围比较广
1 | public static boolean contentEquals(final File file1, final File file2) throws IOException { |
- 对意图解释的注释,用于解释当前代码这么做的原因,往往是因为代码中进行了特殊处理,例如性能优化,特例处理等
1 | if (!directory.mkdirs()) { |
- 阐释型注释,这类注释一般是由于代码结构和含义比较难以理解,因而专门进行介绍,例如算法,多参数函数等
1 | /* |
- 警示型注释,用于警告其他程序员不要随便修改此处的代码,或者这里的代码会产生什么后果
1 | // SimpleDateFormat is not thread safe, |
TODO 列表注释,一般是由于某些原因暂时还没有做的留空,或者为了以后方便扩展留下的空门
Javadoc 文档注释,用于介绍代码整体结构,提供公共 API 方便别人调用的注释
1 | /** |
4. 坏注释
- 不明确的注释,这类注释介绍不清楚,说不清楚代码的含义
1 | // Calculate |
- 多余的注释,代码本身就很明确,不需要进行多余的注释说明
1 | // check null |
- 误导性的注释,有些注释表达不精确,什么具有误导性,注释的内容和代码存在差异
- 循规式注释,一成不变地遵循每个函数或每个变量都要有注释的规矩,会使得代码中充满注释,结构变得散乱
- 日志式注释,把注释当成日志在写,每次修改都在注释中添加修改日志。这是旧代码的写法,因为现在已经有代码版本控制系统,不再需要这种写法
1 | /** |
- 废话注释,像讲故事一样,天马行空,不够简洁,大部分内容都和代码毫无关系
- 位置标记注释,就是用于特别标记某个代码位置的注释,没有特别价值尽量少用
1 | // **************** Start ************** // |
- 结束括号的标记注释,一般是为了识别每个括号的意义,实际上这类注释没有必要,除非是深层嵌套结构
1 | if (length > 0) { |
- 归属或署名,由于当前已经有代码版本控制系统,已经不需要这种注释了
1 | // Add by xxx at 2020/04/01 |
- 注释的代码,其他程序员可能不敢随便删除注释的代码,因为它们可能还有用处。但是现在已经有了代码版本控制系统,代码可以找回,不需要留着被注释掉的代码
5. 注释优化
- 尽量用函数或变量来替换注释
1 | // Check is validate |
可以使用变量进行替换:
1 | boolean isValid = length > 0 && str != null && str.indexOf("s") >= 0; |
- 提炼废话较多的注释,将不相关的注释内容去掉
- 短函数不需要太多描述,选择一个好的函数名会比注释来的好