第 8 章 边界
本章介绍一些保持软件边界整洁的实践手段和技巧。web
8.1 使用第三方代码
在接口提供者和使用者之间,存在与生俱来的张力。第三方程序包和框架提供者追求普适性,这样就能在多个环境中工做,吸引普遍的用户。而使用者则想要集中知足特定需求的接口。这种张力会致使系统边界上出现问题。
使用相似 Map 这样的边界接口,就把它保留在类或近亲类中(封装 Map 的使用到类中)。避免从公共 API 中返回边界接口,或将便捷接口做为参数传递给公共 API 。框架
8.2 浏览和学习边界
不要在生产代码中试验新东西,而是编写测试来遍览和理解第三方代码。 Jim Newkirk 把这叫作学习性测试(learning tests)。
在学习性测试中,咱们如在应用中那样条用第三方代码。咱们基本上是在经过核对试验来检测本身对那个 API 的理解程度。测试聚焦咱们想从 API 获得的东西。学习
8.3 学习 log4j
使用学习性测试方法,在应用程序中使用如何 log4j 包的步骤。测试
8.4 学习性测试的好处不仅是免费
学习性测试毫无成本。不管如何咱们都得学习要使用的 API ,而编写测试则是得到这些知识的容易而不会影响其余工做的途径。学习性测试是一种精确试验,帮助咱们增进对 API 的理解。
学习性测试不光免费,还在投资上有正面的回报。当第三方程序包发布了新版本,咱们能够运行学习性测试,看看程序包的行为有没有改变。
学习性测试确保第三方程序包按照咱们想要的方法工做。一旦整合进来,就不能保证第三方代码总与咱们的需求兼容。原做者不得不修改代码来知足他们本身的新需求。他们会修正缺陷,添加新功能。风险伴随新版本而来。若是第三方程序包的修改与测试不兼容,咱们就能立马发现。
不管你是否须要经过学习性测试来学习,总要有一系列与生产代码中调用方式一致的输出测试来支持整洁的边界。不使用这些边界测试来减轻迁移的劳力,咱们可能会超出应有时限,长久地绑在旧版本上面。设计
8.5 使用尚不存在的代码
还有另外一种边界,那种将已知和未知分隔开的边界。在代码中总有许多地方是咱们的知识未及之处。有时,边界那边就是未知的(至少目前未知)。有时,咱们并不往边界那边看过去。
使用尚不存在的代码,能够先定义本身使用的接口,接口中包括须要使用的方法,这是咱们但愿获得的接口。而后编写类实现接口,等到真实的 API 被定义出来,只须要修改实现类而已,而且当 API 发生变更时,类时惟一须要改动的地方。code
8.6 整洁的边界
边界上会发生有趣的事,改动是其中之一。有良好的软件设计,无需巨大投入和重写便可进行修改。在使用咱们控制不了的代码时,必须加倍当心保护投资,确保将来的修改不至于代价太大。
边界上的代码须要清洗的分割和定义了指望的测试。应该避免咱们的代码过多地了解第三方代码中的特定信息。依靠你能控制的东西,好过依靠你控制不了的东西,省得往后受它控制。
咱们经过代码中少数几处引用第三方边界接口的位置来管理第三方边界。能够像咱们对待 Map 那样包装它们(将 Map 包装到类或近类中),也可使用 ADAPTER 模式将咱们的接口转换为第三方提供的接口(将须要使用的 API 经过 Adapter 类调用)。采用这两种方式,代码都能更好地与咱们沟通,在边界两边推进内部一致的用法,当第三方代码有改动时修改点也会更少。接口
8.7 文献