@lsmn
2015-08-28T06:49:50.000000Z
字数 4216
阅读 2351
设计味道
技术债务
设计原则
Girish Suryanarayana、Ganesh Samarthyam 和Tushar Sharma合著的Refactoring for Software Design Smells一书介绍了典型的软件设计味道,并提供了修复方法。
很少有软件可以写得完美,也很少有软件写完就不需要再看了。随着社会发展,需求变化不可避免,软件需要维护。因此,设计可维护的软件非常重要,不要让它在提交到版本控制系统的时候就开始腐烂。软件工程师和设计人员要有一个好鼻子,可以闻出代码中的臭味和设计决策中的腥味。
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。 |