代码整洁之道-第8章-边界-读书笔记

第 8 章 边界

  本章介绍一些保持软件边界整洁的实践手段和技巧。

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 发生变动时,类时唯一需要改动的地方。

8.6 整洁的边界

  边界上会发生有趣的事,改动是其中之一。有良好的软件设计,无需巨大投入和重写即可进行修改。在使用我们控制不了的代码时,必须加倍小心保护投资,确保未来的修改不至于代价太大。
  边界上的代码需要清洗的分割和定义了期望的测试。应该避免我们的代码过多地了解第三方代码中的特定信息。依靠你能控制的东西,好过依靠你控制不了的东西,免得日后受它控制。
  我们通过代码中少数几处引用第三方边界接口的位置来管理第三方边界。可以像我们对待 Map 那样包装它们(将 Map 包装到类或近类中),也可以使用 ADAPTER 模式将我们的接口转换为第三方提供的接口(将需要使用的 API 通过 Adapter 类调用)。采用这两种方式,代码都能更好地与我们沟通,在边界两边推动内部一致的用法,当第三方代码有改动时修改点也会更少。

8.7 文献

posted on 2019-03-03 21:25  zhangmiao14  阅读(683)  评论(0编辑  收藏  举报