演化架构与紧急设计: 对设计进行重构
2009-11-05 00:00:00 来源:WEB开发网违反 DRY 原则
在 The Pragmatic Programmer 一书中,Andy Hunt 和 Dave Thomas 定义了 DRY 原则:不要自我复制。代码中有两处违背了 DRY 原则 — 复制和粘帖代码以及结构化复制,这将对设计产生影响。
复制和粘帖代码
代码复制使设计变得更加模糊,因为您无法找到惯用模式。在不同位置复制和粘帖代码会产生一些微小的差异,使您无法确定一个方法或多个方法的实际使用。当然,人们都知道复制和粘帖代码最终会害了自己,因为您不可避免地要修改行为,但是很难跟踪所有复制和粘帖了代码的位置。
如何找出代码库中隐藏的复制?有的 IDE 包括了复制检测器(比如 IntelliJ),或者提供了插件(比如 Eclipse)。还存在独立的工具,即包括开源的(比如 CPD,即 Copy/Paste Detector),也包括商业的(比如 Simian)。
CPD 项目是 PMD 源代码分析工具的一部分。它是一个基于 Swing 的应用程序,可以分析单独文件内或跨多个文件的标记的可配置数量。我需要一个典型的问题代码库来作为示例,因此选择了前面提到的 Struts 项目。在 Struts 2 代码上运行 CPD 将生成如图 3 所示的结果:
图 3. 在 Struts 2 上运行 CPD 生成的结果
图片看不清楚?请点击这里查看原图(大图)。
CPD 在 Struts 代码库中找到了大量复制。其中许多复制主要关于向 Struts 添加 portlet 支持。事实上,大多数跨文件复制存在于 PortletXXX 和 XXX (例如 PortletApplicationMap 和 ApplicationMap)之间。这表明 portlet 支持没有进行过良好设计。任何时候使用这些复制代码为现有框架添加额外的行为时,这都是主要的代码特征(code smell)。继承或复合都提供了一种更加干净的方法来扩展框架,如果这两种方法都不可行的话,那么问题就更加严重了。
更多精彩
赞助商链接