第八章 边界
我们很少能控制系统中的全部软件,有时用的第三方或者开源代码,有时用我们公司其他人打造的组件或者子系统,无论哪种情况,我们都得将外来的代码干净利落地整合进自己的代码中
8.1 使用第三方代码
第三方API的作者追求普适性,吸引广泛的用户。使用者想要集中满足特定的需求,这两者有一种张力,会导致系统边界上出问题
作者举了一个例子:
// 这段代码不太整洁,而且没说明自己的用途 Map sensors = new HashMap(); Sensor s = (Sensor)sensors.get(sensorId); // 改为泛型可读性大大提高 Map<Sensors> sensors = new HashMap<Sensor>(); Sensor s = sensors.get(sensorId); // 更整洁的方式如下,java5新增泛型之后,代码改动较小 public class Sensors { private Map sensors = new HashMap(); public Sensor getById(String id) { return (Sensor) sensors.get(id); } }
上面的例子其实还是说了一个第三方API打包的问题,只不过这次是用Java类库Map来做例子Java类库
8.2 浏览和学习边界
我们大部分的时候是停滞在,bug是出在我们自己的代码还是第三方里的代码
学习第三方代码不容易,整合也很难,如果另辟捷径怎么样,去写测试来加深对第三方代码的理解
8.3 学习log4j
作者举了个例子,来进行学习型测试,根据自己想要的结果,和编译器的报错,来倒推第三方API有什么问题,从而去更深的了解第三方API
8.4 学习性测试的好处不只是免费
编写测试可以增进我们对API的理解
学习性测试保证第三方程序包按照我们想要的方式工作
无论如何,总要有一系列与生产代码中调用方式一致的输出测试来支持整洁的边界
8.5 使用尚不存在的代码
也就是说我们先定义好我们需要的接口的,假装它的存在,当它真正的写好了以后再去对接
8.6 整洁的边界
如果有良好的软件设计,无需巨大投入和重写即可进行修改
在使用我们控制不了的代码时,必须加倍小心保护投资,确保未来的修改不至于代价太大
比如说打包、也可以使用adapter模式将我们的接口转换为第三方提供的接口
总结
这节的内容比较少,大多是概念性的东西。先到这,下次我回顾的时候带几个例子过来