第八章 边界
8.1 使用第三方代码
借口提供者和使用者之间存在天然的分歧:提供者希望借口具有普适性,而使用者希望满足特定的需求;这样的差异导致在使用第三方接口时在边界上出现问题
//此方法将sensors暴露在外部,在函数间传递不安全 Map sensors = new HashMap(); ... Sensor s = (Sensor)sensors.get(sensorId); //此种方法在使用Sensors时无需考虑其内部实现,避免了对sensors的无意修改;当HashMap修改时,对Sensors 的修改就在此类的内部,做到了很好的隔离 public class Sensors{ private Map sensors = new HashMap(); public Sensor getById(String id){ return (Sensor) sensors.get(id); } .... }
以上的重构方法使HashMap的使用隔离在Sensors类的内部,当HashMap修改时,只需修改Sensors类一处,实现低耦合;
8.2 浏览和学习边界
- 对于第三方代码的浏览和学习应该独立出来,而不是在生产代码中;
- 编写测试来遍览和理解第三方代码,称为学习性测试;
- 在测试时聚焦于想要了解的特性;
8.3 学习log4j
- 该标题下的内容为一步步实现log4j的日志输出
8.4 学习性测试的的好处不只是免费
- 学习性测试是精确试验,帮助增进对API的理解;
- 对于新发行的第三方软件包可以运行学习性测试,查看功能是否改变;
- 使用好边界测试,方便软件迁移和第三方代码升级;
8.5 使用尚不存在的代码
- 另一种边界是已知和未知;
- 项目中可能存在能力圈范围之外的领域,工作可以先从远离该领域的地方开始;
- 对于不存在的接口可以先按照想要的样子编写接口,细节等该领域的人员设计出来后,再完善接口中的细节;
- 编写想要的接口可以使接口在自己的控制之下,有助于保持代码的可读性和内聚性;
8.6 整洁的边界
- 边界会经常需要改动,良好的软件设计无需巨大的投入和重写即可修改;
- 在使用控制不了的代码(第三方库)时,需要加倍的小心,确保未来的修改代价不要太大;
- 避免代码过多的依赖第三方代码中特定的信息,依靠能控制的好过依靠控制不了的,避免日后受它控制;