近期在项目中看了自己先前写过的代码,感触最多的就是 Code Review 对开发效率、代码整洁上的影响。这里总结下,内容涵盖了一些设计的思想,也提供了一些常用的代码片段,非常实用。
开篇导读
基础版
1.清晰的注释
比如:在一个业务类中创建订单接口,
执行流程:下订单 -> 减库存-> 支付-> 日志。通过合理的注释可以获得清晰的执行逻辑。当然,可在类、方法、属性上使用注释,但是注释只是一个说明性的东西,能表达意思即可,不易过度使用。
2.提高可读性
可读性较差的版本:可以看到业务逻辑混在一起,可读性非常差。
可读性较好的版本:在于方法的精细化抽象。清晰的命名和表达。如:(1)小节的实现。
3.命名规范
(1) 见名知意
比如,有个方法是校验逻辑,
正例:
反例:
(2) 常量命名
常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚。
(3) 峰命名
方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase风格。
正例:
(4) 实体类命名 :VO DO DTO POJO
使用场景:
- POJO:作为简单的数据结构,不包含业务逻辑。
- DO:在业务逻辑层使用,代表业务实体。
- DTO:在需要将数据从一个层传输到另一个层,或者在远程调用中使用。
- VO:在展示层使用,用于将数据展示给用户。
4.使用轮子
Java类库中有很多常用的方法,也有一些开源的工具类等供使用。下面句几个例子:
(1) Lambda表达式
主要针对函数式接口,简化代码使用。不过使用过程中注意空指针的一些问题
案例:统计北京地区(按区划分) ,年龄在25~30 岁的,月薪超过20k 的人群 中薪资最高的程序员 组合成一个Map, 地区为key , 每个value 是一个List. 用Lambda 实现
(2) 使用Lombook
主要用于一些实体类,简化代码:
当然使用过程可能存在一些问题,读者自行摸索,但是从简化的角度讲,确实显得干净整洁。
(3) 使用工具类Hutool
Hutool提供了很多好用的工具类,也针对其做了大量封装。用于日常业务开发。
官方文档:Hutool参考文档
例如: 日期时间偏移 日期或时间的偏移指针对某个日期增加或减少分、小时、天等等,达到日期变更的目的。
5.优雅的异常处理
异常用来定位问题使用,常见的异常处理 是在业务方法里捕获。
实际上,可以通过全局异常处理方式实现。大致思路如, 使用细节请自行搜索。
进阶版
到了这一章,我们从整体上考量程序的设计的健壮性、拓展性。常见的有方案:AOP思想、代码分层、公共抽离、设计模式等。
6.AOP思想
AOP思想 是程序解耦的一种重要手段,常用来记录日志,
7.代码解耦
可以使用注解+AOP 辅助实现
比如:实现一个接口调用时间的统计。
低配版:
高配版:使用注解+AOP
在需要统计方法上加一个注解即可轻松实现。
看,一处定义,随处使用。是不是很清爽?
8.模型抽离
这个主要针对工程设计,从项目全局的角度考量。一般微服务项目设计也是这样的。主要提及:
工程结构:
9.设计模式
设计模式 的使用也是为了解耦,符合代码设计的 单一职责、开闭原则 。
关于常用的几种设计模式,读者可参阅原来的一篇文章。
10.接口隔离
接口隔离原则强调的是接口设计应该满足特定的客户端需求,将大型接口拆分成更小的、特定的接口. 和高内聚的思想相辅相成。
比如:一个电子商务平台,该平台需要处理不同类型的支付方式。
假设我们有一个Payment接口,它包含了所有支付方式的通用方法:
这个接口被两个类实现:CreditCardPayment和PayPalPayment。它们都实现了Payment接口,即使PayPalPayment可能不需要refund方法。
应用接口隔离原则
我们可以将Payment接口拆分成两个更具体的接口:
然后,我们修改CreditCardPayment和PayPalPayment类,让它们实现相应的接口:
由此可见, 通过应用接口隔离原则,我们减少了类之间的不必要依赖,提高了系统的灵活性和可维护性。每个类只实现了它需要的接口,而不是一个大而全的接口,这使得代码更加清晰和易于理解。