写点什么

书评与访谈:Refactoring for Software Design Smells

  • 2015 年 10 月 14 日
  • 本文字数:3792 字

    阅读完需:约 12 分钟

很少有软件可以写得完美,也很少有软件写完就不需要再看了。随着社会发展,需求变化不可避免,软件需要维护。因此,设计可维护的软件非常重要,不要让它在提交到版本控制系统的时候就开始腐烂。软件工程师和设计人员要有一个好鼻子,可以闻出代码中的臭味和设计决策中的腥味。

Girish Suryanarayana、Ganesh Samarthyam 和 Tushar Sharma 将“设计味道(design smell)”定义为“设计中违反基本设计原则并对设计质量产生负面影响的特定结构”。他们合著的 _Refactoring for Software Design Smells_ 一书可以帮人训练感觉器官,更好地发现、识别、修复软件设计中的味道。他们提供了一个包含 25 种味道的目录,并给出了处理味道的重构策略。

设计味道的产生有许多原因,一部分是由编程语言的限制所导致(比如,Java 的早起版本不支持泛型编程,或者 Java 8 之前的版本没有 Lambda 表达式),另外一部分是由于程序员没经验或者出于时间压力而采用临时方法快速完成任务所导致。这本书侧重于常见的面向对象语言(如 Java、C#和 C++)中的结构性设计味道,而并不是关于某一门特定语言的软件架构或实现味道。

目录中的设计味道分为四类:抽象味道、封装味道、模块味道和层次味道(请参看目录)。该书对每种味道都进行了讨论,列出了潜在的原因,提出了重构建议,并提供了许多例子,讲述了许多趣闻轶事。由于部分味道有不同的名称,所以查看下介绍_ 别名_ 的章节会有所帮助。例如,“抽象缺失(Missing Abstraction)”又称为“基本类型偏执(Primitive Obsession)”——在有些使用了基本类型(如字符串、整数)的地方,也许类是一种更恰当的抽象。在这种情况下,可以通过引入抽象(比如,运用使用类替换类型代码的重构方式)重构——但不要过度设计。

Girish、Ganesh 和 Tushar 同 InfoQ 谈了他们的写作动机以及他们如何收集设计味道并据此写作。

InfoQ:是什么促使你们写一本关于设计味道的书?

我们正在从事一项工作,创建一种行业软件设计质量评估方法。我们试图识别出软件设计中潜在的问题或味道,并设法重构它们。当我们开始探索设计味道时,我们发现味道有众多来源,比如书、论文。我们收集到了 530 多种味道!我们想要理解这个巨大的集合,于是就开始了一项任务,将它们进行有意义地分类。为了解决这个问题,在经过了几个月的努力后,我们认识到:

当我们将每种味道都看成是违反了一个或多个基本设计原则时,我们就了解了那种味道是如何出现的;但是更重要的可能是,那自然而然地为我们指出了一种重构那种味道的可能方法。

我们以这个基本概念为基础,并根据味道如何违反了 Booch 的基本设计原则将其分类(抽象、封装、模块和层次)。我们将前期工作发表成了一篇论文;其中,有的评论者还建议我们用一本书的篇幅来详细描述这项工作,他们认为那是个不错的主意。我们开始提供关于这项工作的培训,而且发现,设计人员和架构师都非常喜欢我们的味道目录,认为它非常有用。基于这种积极的反馈,我们在这本书中详细地阐述了我们的工作。我们写这本书的目的是提供一个框架,帮助理解气味如何以违反设计原则的形式出现, 以及如何运用设计原则进行重构可以将技术债务维持在可控的范围内。我们希望通过这本书将这种核心信息传达给读者。

InfoQ:这本书是面向特定的读者吗?

这本书主要是面向软件开发人员和架构师。这本书所涉及的内容包括基本设计原则、“使能技术(enabling techniques)”、具体的设计味道及重构建议,为提升他们所创建或维护的设计的质量提供可以直接使用的思路。这本书还将帮助他们理解如何在实践中运用设计原则。此外,这本书可以帮助项目经理理解如何在项目中管理技术债务。我们在架构和设计培训中发现,味道方法是一种在实践中探讨软件设计的特别有效的方法;因此,学员们会发现,这本书非常有助于学习软件设计。

InfoQ:通过讲授不要怎样设计软件?

我们首先介绍了 Booch 的原则和我们为运用这些规则所归纳出的相应的使能技术。通过我们的介绍可以看出,它们简单明了(比如,“隐藏变量”是一种封装使能技术)。接下来,我们介绍了几段“真实世界中有味道的设计”,并要求他们识别潜在的味道及提供重构建议。在许多情况下,识别味道和相应的重构方法比较简单。但有些相关问题需要更深层次的分析,参与者慢慢地开始认识到,那是一项困难的工作。另外,当我们开始讨论设计质量如何受到影响及实际问题时,会有一些“顿悟”时刻。实战中一些处理味道的趣闻轶事常常也有启发作用。最后,我们还谈论了重构和流程方面的工具。

经过数周的休息后,参与者介绍了他们项目中的味道以及他们计划如何应对。如此一来,就带出了许多真实世界的思考。

最终的结果是更深入地阐述设计原则,让设计人员和架构师对如何在实践中处理设计味道和重构有个充分的理解。

InfoQ:你们如何决定书中要包含哪种味道?

就像前面提到的那样,我们有一个巨大的集合,其中包含 530 种味道。重构可以改善内部结构,而我们的关注点在设计上,因此,我们决定将重点仅仅放在结构性设计味道上。在设计评估的过程中以及在分析 OpenJDK 7 中的味道时,我们发现,某些种类的味道在真实世界的软件中尤其常见。因此,我们决定,研究重点仅限于这种在实际软件中常见的味道。我们的架构和设计培训项目涵盖了这些设计味道——架构师的反馈帮助我们完善目录。最终,这本书涵盖了 25 种味道。

InfoQ:你们做这件事仅仅通过阅读代码,还是使用或为此构建了工具?

我们同时使用了人工分析和分析工具。大部分工具都需要人工分析。例如,网上有 JDK 的克隆代码。我们在这个代码库上运行了若干工具(包括 PMD CPD 、Understand、iPlasma、Simian、JArchitect 和 Structure101)并分析结果。我们在书中还讨论了许多使用广泛的分析工具无法检测出来的味道(比如,层次缺失、未用封装)。 为了检测这些味道,我们编写了 Groovy 脚本。

InfoQ:这本书的重点是结构性设计味道。你们有写第二本书的计划吗?

这本书,我们花了三年的时间才写完,而且去年年底刚刚出版。我们相信,围绕这个点我们可以有许多新的新的方向。架构味道就是这样的一个方向;不过, 我们围绕设计味道的探索仍然在进行,因此,现在预言接下来要写什么还有点早。我们希望,软件工程社区会继续这项工作,并根据我们在这本书中描述的框架将其它种类的味道编目(也就是违反设计原则的味道)。

InfoQ:读完这本书后,我该如何开始评审和重构代码?

当设计新软件时,通过使能技术运用设计原则。当维护现有的软件时,识别味道并重构(以味道所违反的基本原则为指导)。我们建议将持续重构作为开发过程的一部分(比如,在增加任何新特性或者修复缺陷时重构代码)。此外,如果你是一名架构师或者团队负责人,那么要让团队成员意识到设计原则在高质量软件中的作用:违背原则如何产生了味道以及原则如何指导重构。

InfoQ:你们最喜欢什么味道?

Girish:叛逆的层次(Rebellious Hierarchy)”——这是一种在行业软件中常见的味道,其出现可能是由于开发人员在设计层次时没有意识到违反了里氏替换原则(LSP)。

Ganesh:我最喜欢的味道是“未用封装(Missing Encapsulation)”——这是一种在实际软件中存在最广泛的味道之一,但同时也是工具很难自动检测的一种味道。而且,这是其中一种可以使用设计模式(比如根据上下文选择策略、装饰或者桥接)重构的味道。

Tushar:所有的味道都非常有趣,但味道出现的上下文、导致味道的根本原因、味道对未来设计决策施加的约束以及可以加重其它味道的味道所产生的影响更让我感兴趣。

InfoQ:谢谢你们接受我们的采访!

这本书的网站上还提供了其它资料和相关文章(比如,设计评审检查清单),并且持续更新中。 Designite 是一款面向 C#的商业设计味道检测工具,已经采用了这本书中提出的编目、分类和命名约定。

关于这本书的作者

Girish Suryanarayana目前是印度班加罗尔西门子技术与服务分公司研究与技术中心的一名高级研究科学家。Girish 于 2007 年获得了美国加州大学厄文分校信息与计算机科学博士学位。他的研究兴趣包括软件架构、设计模式、设计味道、重构、云计算和安全。他是一名获得 IEEE 认证的软件工程认证讲师(SECI),会定期为 IEEE SWEBOK 认证项目(SCP)和 IEEE IEEE Certified Software Development Associate(CSDA)项目提供培训。他的 Twitter 账号为 @girish_sur

Ganesh Samarthyam 有超过 13 年的 IT 行业经验。他目前居于印度班加罗尔,是一名企业培训师兼独立顾问。之前,他为西门子班加罗尔公司研究与技术部门的“软件架构和开发”团队工作。在为西门子工作之前,他在班加罗尔的 Hewlett-Packard C++ 编译器团队工作。他有 IEEE 颁发的软件工程认证讲师(SECI)和软件工程专业硕士(PSEM)证书。读者可以通过他的 LinkedIn 页面][5] 与他取得联系。

Tushar Sharma 目前是印度班加罗尔西门子技术与服务分公司研究与技术中心的一名技术专家。他在西门子的工作涵盖软件设计、重构、设计味道、代码和设计质量、设计模式和变更影响分析等相关主题的研究,并提供咨询服务。他与人合著了两本书:一本是 2013 年 2 月出版的“Oracle Certified Professional Java SE 7 Programmer Exams 1Z0-804 and 1Z0-805”;另一本是 2014 年 11 月出版的“Refactoring for Software Design Smells”。他的 Twitter 账号为 @Sharma__Tushar

查看英文原文: Refactoring for Software Design Smells Review and Q&A with the Authors

2015 年 10 月 14 日 19:311443
用户头像

发布了 1008 篇内容, 共 335.3 次阅读, 收获喜欢 314 次。

关注

评论

发布
暂无评论
发现更多内容

架构训练营 week6 作业

红莲疾风

「架构实战营」

大数据开发之Flink + TiDB

@零度

flink 大数据开发

龙头整机厂商宝德加入,共建龙蜥社区开源新生态

OpenAnolis小助手

Linux 开源 合作伙伴

免费下载!FFA 系列专刊|《Flink CDC 新一代数据集成框架》电子书

Apache Flink

大数据 flink 编程 实时计算 IT

Flink 大规模作业调度性能优化

Apache Flink

大数据 flink 编程 实时计算

大咖集结,共创生态|AIOps社区专家团正式集结出道

云智慧AIOps社区

开源项目 开源社区 智能运维 开发者社区 社区治理

Pravega Flink Connector Table API 进阶功能探秘

Apache Flink

大数据 flink 编程 实时计算 Pravega

工商银行实时大数据平台建设历程及展望

Apache Flink

大数据 flink 编程 实时计算

教程直播第7期|如何对 OceanBase 进行 SQL 诊断和调优

OceanBase 数据库

oceanbase OceanBase 开源 OceanBase 社区版 OceanBase教程

从 Flink Forward Asia 2021,看 Flink 未来开启新篇章

Apache Flink

大数据 flink 编程 实时计算

netty系列之:可以自动通知执行结果的Future,有见过吗?

程序那些事

Java Netty 程序那些事

Alink、Tensorflow on Flink 在京东的应用

Apache Flink

大数据 flink 编程 实时计算 Alink

有一群青年人,用热爱连接起科技与智慧生活的“双向奔赴”

最新动态

WorkPlus移动数字化平台赋能新型智慧城市建设

WorkPlus Lite

🏆【Alibaba中间件技术系列】「Nacos技术专题」配置中心加载原理和配置实时更新原理分析(中)

浩宇天尚

nacos 配置中心 Alibaba 1月日更 Apache alibaba

MyBatis的功能架构是怎样的

编程江湖

mybatis

针对 jQuery 的优化方法有哪些

编程江湖

足球、篮球、花样滑冰、乒乓球四大运动的动作识别通用方案开源了

百度大脑

人工智能

内网是什么意思?指什么网?内网需要做等保测评吗?

行云管家

安全 内网 等保测评

技术升级!国内公有云厂商首个支持保留消息功能

百度开发者中心

物联网

数据安全产品之堡垒机详细介绍-行云管家

行云管家

网络安全 防火墙 数据安全 堡垒机

Flink CDC 系列 - Flink MongoDB CDC 在 XTransfer 的生产实践

Apache Flink

大数据 flink 编程 实时计算 IT

Apache Flink ML 2.0.0 发布公告

Apache Flink

大数据 flink 编程 实时计算

HBase的 rowkey 设计原则

编程江湖

HBase 架构

初识MASA Blazor

MASA技术团队

C# .net 微软 后端 blazor

书评与访谈:Refactoring for Software Design Smells_重构_Mirko Stocker_InfoQ精选文章