编写高质量的代码是一种艺术,本文持续记录各种代码优化的思路,不断提高代码的质量
代码重构
日常开发中,代码的质量对开发者的影响很大,高质量的代码更容易阅读。
1.混乱造成复杂,有序会减少复杂度;
2.规范是为了从无序走向有序,减少认知成本;
3.不要“打破窗口”,如果出现问题,及时修正,避免越来越糟糕
基本概念
- 认知是人们获得知识和应用知识的过程,学习过程中存在认知成本;
- 知识是人类对经验范围内的感觉进行总结归纳后发现的规律;
开发规范
- 命名规范
- 注释规范
- 空行规范
- 日志规范
- 异常规范
- 埋点规范
- 架构规范
命名规范
包名、类名、方法名、变量名需采用有意义的名字,名字应为功能的抽象;命名保持一致性
有意义的命名
函数名要具体,避免空泛的命名。例如,processData()是一个不好的命名,它没有表明该方法要做的具体事情是什么;函数的命名要体现做什么,而不是怎么做。比如:getLatestEmeployee()
方法比popRecord()
好,因为栈数据的操作是底层实现细节,函数命名应该提升抽象层次、体现业务的语义。
类是一组数据和操作的封装,可以分为实体类和辅助类;实体类承载核心业务数据和核心业务逻辑,命名要体现业务语义;辅助类辅佐实体类完成业务逻辑,辅助类的命名要能通过后缀体现该类的功能。例如:控制路由的控制类CustomerController
、提供Customer服务的服务类CustomerService
、获取数据存储的存储类 CustomerRepository
。对于辅助类,尽量不用Helper、Util之类的后缀,这些后缀的含义太笼统,会破坏SRP(单一职责原则)。
包(Package)代表有关系的类的集合,用于创建命名空间和分类组合。包名应该能够反映一组类在更高抽象层次上的联系。
模块民(Module)指Maven中的module。
名称保持一致性
- 每个概念一个单词
- 使用对仗词
- 后置限定词
名字应该尽量做到自明
代码要在不借助其他辅助手段的情况下,传达出自身的含义;
注释用于阐述代码背后的意图,避免复述代码功能的注释,如果功能需要复述,重写该部分代码。比如:
糟糕的注释1
2
3
4
5
6try{
// 等待2秒
Thread.sleep(2000);
} catch(InterruptedException e) {
logger.error(e);
}
好的注释1
2
3
4
5
6try{
// 等待2秒,为了等待关联系统处理结果
Thread.sleep(2000);
} catch(InterruptedException e) {
logger.error(e);
}
第二个注释解释了sleep背后的业务意图。