重构视角,如何写“好代码“——组织数据篇

77 阅读2分钟

这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

以对象取代数据值

在我们开发初期时候,业务会相对简单,处理数据时,简单的数据项就能满足我们的需求。随着不断的版本迭代,数据项将会越来越复杂。

比如项目开始时,有个订单类Order,订单中用一个字符串类型表示用户名字。

public class Order{
    // 用户名字
    private String userName;
}

随着我们业务不断扩展,订单中用户相关的属性越来越多,如用户id,用户的会员等级,这时候我们不得不改动Order类,增加更多的字段。

public class Order{
    // 用户名字
    private String userName;
    // 用户id
    private Long userId;
    // 用户等级
    private Integer userLevel;
}

为了减少这样的改动,我们可以以对象取代数据值方式,避免这样的问题。一开始就使用用户对象,而不是用户名字这样的数据值。这样以后需要增加更多的用户信息,我们只需要改动User类即可。

public class Order{
    // 用户对象
    private User user;
}

public class User{
    private String userName;
}

值对象和引用对象的使用时机

值对象可以理解为不可改变的内容,也就是我们常用的基本数据类型、字符串类型。引用对象,就是复杂数据类型,持有对象的引用。

当我们的一个对象需要被多个对象使用时,我们就应该使用引用对象。这样,该对象的改动可以在所有相关的对象中生效。单例模式生成的对象就是典型的引用对象。

过多的引用对象,会使系统对象存在错综复杂的关系,增加系统复杂度。这时,就需要把引用对象改为值对象。

以字面常量取代魔法数

为了使代码更有可读性,我们应避免使用魔法数(代码规范)。

// 是否免邮
public boolean isFreeFreight(double totalFee){
    return totalFee > 99;
}

🔽

public static double FREE_FREIGHT_LIMIT = 99;

public boolean isFreeFreight(double totalFee){
    return totalFee > FREE_FREIGHT_LIMIT;
}

封装集合

当我们类中有集合属性时,我们应该对集合进行封装。不能直接暴露对象里的集合属性。而是提供新增集合元素、删减集合元素的方法;需要返回集合时,应该返回集合的副本,否则返回的集合被修改了我们都不知道。

参考

[0] 《重构,改善既有代码的设计》