目标:将外来代码干净利落地整合进自己的代码中
使用第三方代码
Map<Sensor> sensors = new HashMap<>();
...
Sensor s = sensors.get(sensorId);
public class Sensors {
// sensors 用户不必关心是否使用了泛型 那将是实现细节才关心的
private Map sensors = new HashMap();
public Sensor getById(String id) {
return (Sensor)sensors.get(id);
}
}
Map 的使用应该是上述的方式 但并不建议总是以这种方式封装 Map 的使用
建议不要将在边界接口(如上述 Map 接口)直接在系统中传递(避免从公共 API 中返回边界接口 或 将边界接口作为参数传递给公共 API)
原因:如果不稍加注意 生态内代码调用API 处会出现大量的不整洁代码 在专门的类中进行转化再使用 只在一出进行不整洁转化 不要到处调用到处需要转化
解决:如果使用边界接口 就把它保留在类或亲近类中 将不整洁代码封装起来 不要让这种不整洁到处出现
如何浏览和学习边界
学习性测试:不学习第三方代码 不整合第三方代码 不在生产代码中试验新东西 而是编写测试来遍览和理解第三方代码
如在应用中那样调用第三方代码 通过核对试验来检测自己对那个 API 的理解程度 测试聚焦于想从 API 得到的东西
学习性测试示例
- 阅读介绍文档
- 编写用例
- 调试(搜索——阅读——测试)
学习性测试的好处
- 无成本 只付出最少必要精力 总要有一系列与生产代码中调用方式一致的输出测试来支持整洁的边界
- 随时测试兼容 如第三方程序包版本更新 即可运行学习性测试 看是否兼容
- 精确试验
使用尚不存在的代码
事先定义自己使用的接口 在我们的控制之下 有助于保持客户代码更可读 且集中完成它该完成的工作
等三方 API 出来后 再使用适配器跨接 封装与 API 的互动 提供一个当 API 发生变动时唯一需要改动的地方
边界解耦
整洁的边界
目的:当三方有变动时可以减少修改点
边界代码需要清晰的分隔 定义了期望的测试 避免因过多了解三方代码特定信息而产生依赖(解耦)
通过代码少数几处引用第三方边界位置来管理三方边界 在边界两边推动内部一致
- 类转换:像对待 Map 那样封装
- 接口转换:使用 Adapter 模式转换三方接口