代码重构:基本类型偏执(Primitive Obsession)

举报
孙小北 发表于 2022/04/29 23:09:14 2022/04/29
【摘要】 代码重构:基本类型偏执(Primitive Obsession)《重构,改善既有代码的设计(第2版)》 什么是基本类型偏执(Primitive Obsession)定义: 对于具有意义的业务概念如钱、坐标、范围等,不愿意进行建模,而是使用基本数据类型进行表示影响: 暴露较多细节,代码内聚性差,可读性差改进目标: 消除基本类型,提升代码可修改性、内聚性、可读性方法:1、对象取代基本类型2、子类...

代码重构:基本类型偏执(Primitive Obsession)

  • 《重构,改善既有代码的设计(第2版)》

什么是基本类型偏执(Primitive Obsession)

  • 定义: 对于具有意义的业务概念如钱、坐标、范围等,不愿意进行建模,而是使用基本数据类型进行表示
  • 影响: 暴露较多细节,代码内聚性差,可读性差
  • 改进目标: 消除基本类型,提升代码可修改性、内聚性、可读性
  • 方法:
    • 1、对象取代基本类型
    • 2、子类取代类型
    • 3、多态取代条件表达式
    • 4、提炼类
    • 5、引入参数对象

案例代码

  • 基本类型偏执对可维护性、可读性的影响

image-20220429182543749.png

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方法,方法会越来越复杂,可维护性差

重构目标

  • 提炼坐标、航线对象代替基本类型,并封装相关逻辑
  • 消除航线类型的字符串条件表达式

重构参考

image-20220429182616426.png

总结

image-20220429182644083.png

把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界。
Bring digital to every person, home and organization for a fully connected, intelligent world.

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。