介绍一些保持软件边界(和其他接口对接的界限)整洁的实践手段和技巧
8.1 使用第三方代码
- 第三方程序包和框架提供者追求 普适性 ,这样就能在多环境中工作,吸引广泛的用户
- 使用者则想要集中满足特定需求接口
- 接口提供方和接口使用方在期望值上的差异,就会导致系统在边界上出现问题
8.1.1 举一个 Map 的例子
java.util.Map
是 Java 提供的一个接口和功能都很丰富的对象- 但是当我们通过 Map 进行内容传递时,如果想要禁止调用者删除里面存入的数据,却很难做到
- 因为 Map 的
clear()
方法是对外公开的,任何调用者都可以直接使用 - 除非通过以下方式将 Map 获取数据的方式进行封装
public class Sensors {
private Map sensors = new HashMap();
public Sensor getById(String id) {
return (Sensor) sensors.get(id);
}
}
8.2 浏览和学习边界
- 在接入第三方代码时,不要在生产代码中直接接入
- 应该先编写测试来遍览和理解第三方代码,这种方式叫 学习性测试( Learning Tests )
8.3 学习 log4j
- 使用标准的日志工具类来操作系统日志,是构建项目的不二之选
8.4 学习性测试的好处不只是免费
- 当需要接入第三方接口时,不论如何都无法避免去学习其中的 APi
- 而编写测试则是获得这些知识的 即容易,又不会影响其他工作 的途径
- 而且,当第三方程序包发布了新版本,可以通过之前编写的学习性测试看看程序包的行为是否发生改变
8.5 使用尚不存在的代码
- 如果系统的部分边界是需要和其他项目对接
- 提前编写我们想要得到的接口,有助于保持客户代码高可读性
- 例如现在盛行的前后分离项目,前后端工程师先说出各自对接口的期望,然后同步开发,前端工程师通常会使用 mock.js 工具进行接口模拟
8.6 整洁的边界
- 良好的软件设计,后期无需巨大投入和重写即可对系统进行修改
- 而整洁的边界有助于将系统本身和第三方代码分割开来,当后期需要替换时工作量就更小