第八章 边界
在软件开发的过程中,难免会引入第三方程序包或者是开源代码,然后整合进自己的项目代码中。这一章主要从引入第三方程序或者开源代码入手,介绍一些保持软件边界整洁的实践手段和技巧。
8.1 使用第三方代码
接口提供者和使用者之间,存在与生俱来的矛盾。第三方程序包和框架提供者追求普适性,这样就能在多个环境中工作,吸引广泛的用户。而使用者则想要获得满足特定需求的接口。这种矛盾会导致系统边界上出现问题。
类似Map这样的边界接口,应该保留在类或近亲类中(或将Map的使用封装到类中)。避免从公共 API 中返回边界接口,或将边界接口作为参数传递给公共 API 。
8.2 浏览和学习边界
不要在生产代码中试验新东西,应该通过编写测试来遍览和理解第三方代码。 Jim Newkirk 把这叫做学习性测试(learning tests)。
在学习性测试中,我们如同在应用中一样调用第三方代码。通过试验来检测自己对那个 API 的理解程度。
8.3 学习 log4j
采用学习性测试的方式,学习使用如何 log4j 包。
8.4 学习性测试的好处不只是免费
论如何我们都得学习要使用的API ,而编写测试则是获得这些知识的容易途径,而且还不会影响其他工作。学习性测试是一种试验,帮助我们增进对 API 的理解。当第三方程序包发布了新版本,我们可以通过学习性测试,看看程序包的行为有没有改变。
学习性测试确保第三方程序包按照我们想要的方法工作。第三方代码整合进来,就必须保证与我们的需求兼容。一旦原作者修正缺陷,添加新功能,发布新版本,就可能给我们的系统带来风险。而如果我们之前编写了学习性测试用例,对新发布的第三方程序包进行测试,就能立马发现不兼容的地方。
8.5 使用尚不存在的代码
使用尚不存在的代码(接口未定义)时,可以先定义自己需要使用的接口(接口中包括我们需要使用的方法,这也就是我们希望得到的接口),然后编写类调用接口。
等到真实的 API 被定义出来,我们再编写一个adapter类来进行衔接。
当 API 发生变动时,adapter类是唯一需要改动的地方。
8.6 整洁的边界
边界那边的代码可能会经常发生改动。有良好的软件设计,就无需巨大投入和重写就能完成相应的修改。
边界上的代码需要清晰的分割,对期望的功能编写测试。避免我们的代码过多地了解第三方代码中的特定信息。
通过将封装,或使用 ADAPTER 模式将我们的接口转换为第三方提供的接口。使得代码都能更好地与我们沟通。在边界两边推动内部一致的用法,当第三方代码有改动时,我们需要修改的地方也会更少。