代码重构:基本类型偏执(Primitive Obsession)
【摘要】 代码重构:基本类型偏执(Primitive Obsession)《重构,改善既有代码的设计(第2版)》 什么是基本类型偏执(Primitive Obsession)定义: 对于具有意义的业务概念如钱、坐标、范围等,不愿意进行建模,而是使用基本数据类型进行表示影响: 暴露较多细节,代码内聚性差,可读性差改进目标: 消除基本类型,提升代码可修改性、内聚性、可读性方法:1、对象取代基本类型2、子类...
代码重构:基本类型偏执(Primitive Obsession)
- 《重构,改善既有代码的设计(第2版)》
什么是基本类型偏执(Primitive Obsession)
- 定义: 对于具有意义的业务概念如钱、坐标、范围等,不愿意进行建模,而是使用基本数据类型进行表示
- 影响: 暴露较多细节,代码内聚性差,可读性差
- 改进目标: 消除基本类型,提升代码可修改性、内聚性、可读性
- 方法:
- 1、对象取代基本类型
- 2、子类取代类型
- 3、多态取代条件表达式
- 4、提炼类
- 5、引入参数对象
案例代码
- 基本类型偏执对可维护性、可读性的影响
public class Plane {
private final Logger logger;
public Plane(Logger logger) {
this.logger = logger;
}
public void fly(List<int[]> airLine, String airLineType) {
for (int[] coordinate : airLine) {
if (coordinate.length != 2) {
throw new IllegalArgumentException("Air line is invalid.");
}
if ("domestic".equals(airLineType)) { // 国内航班
if (coordinate[0] < 0 || coordinate[0] >= 100) {
throw new IllegalArgumentException("Air line is invalid.");
}
if (coordinate[1] < 0 || coordinate[1] >= 100) {
throw new IllegalArgumentException("Air line is invalid.");
}
}
if ("international".equals(airLineType)) { // 国际航班
if (coordinate[0] < 100) {
throw new IllegalArgumentException("Air line is invalid.");
}
if (coordinate[1] < 100) {
throw new IllegalArgumentException("Air line is invalid.");
}
}
}
airLine.forEach(this::fly);
}
private void fly(int[] coordinate) {
logger.info(MessageFormat.format("Fly to ({0},{1})", coordinate[0], coordinate[1]));
}
}
代码背景
- 描述了飞机按照航线类型飞行的业务;
- 航线包含坐标集合、类型;
- 航线坐标包含2个int数值;
- 飞行前需要校验航线,不同航线类型校验内容不同
症状/问题
- 内聚性、可读性差,对外暴露了内部细节,如坐标的数据结构、航线校验逻辑,代码层次不清晰
- 通过航线类型字符串区分不同航班执行不同校验逻辑,后续增加航线类型时需要修改fly方法,方法会越来越复杂,可维护性差
重构目标
- 提炼坐标、航线对象代替基本类型,并封装相关逻辑
- 消除航线类型的字符串条件表达式
重构参考
总结
把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界。
Bring digital to every person, home and organization for a fully connected, intelligent world.
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)