December 2015 Theme: 软件重构的过去、现在和未来
客座编辑导言: Emerson Murphy-Hill

正像一些人说的,软件正在吞噬世界。从个人电脑到手机、汽车和吸尘器,软件的数量日益增长,出现在各种场合,功能也迅速增加。不幸的是,就像我们大多数人一样,和成熟和强大如影随形的是问题也日益增多。尽管软件开始设计时可能十分干净漂亮,但后来也会变得一团糟,因为用户需要增加更多的功能,还要求快速清掉Bug。这个烂摊子越来越难维护,给开发者带来越来越高的成本。

开发者应付这种随时间增长而恶化问题的一个重要方法重构软件,即修改已有代码设计但不改变其行为方式。当一个软件的设计不再适合它的目的时,开发人员可以通过重构进行修改。重构有可能是非常小的调整,如改变一个方法(Method)使其接受一个新的参数,也可能是大规模调整,如用等效算法替换已有算法或重新安排继承层次。虽然重构最近越来越普遍,软件仍然需要继续不断调整,即使它已经是结构化的,毕竟没人能保证设计完美无缺。

工具和技术

手工重构可能乏味且容易出错,集成开发环境的进步已经使得用工具进行自动重构成为可能。事实上,一个开发环境成熟的标志就是具备了重构工具,这样的环境包括IntelliJ、Eclipse、Visual Studio和Xcode。对于开发人员指定的代码段,这些工具可以自动修改代码,并验证重构的有效性。例如,多个开发环境都用到的最流行的重构工具可以对程序元素进行重命名。采用这种重命名重构工具,开发者可以为一个类设定新名称,该工具先确认没有和已有类重名,然后替换所有类名,包括所有引用。实际比这复杂一点儿,但中心思想就是如此。

重构最初诞生于面向对象编程社群,现在已经渗透到各种编程范式。从逻辑编程到函数式编程甚至数据库,重构对你想得到的所有软件类型都是适用的。如果你足够细致,你可以随处发现模式,以同样的眼光,也可以发现通过重构发生的模式变化。

尽管近期重构实践进展很快,仍存在两个主要挑战需要研究人员应对。首先,重构工具必须更好地支持开发者需要的修改类型。其次,如何确保重构真的保留了程序行为?

主题文章

今日计算2015年12月号介绍五篇反映重构实践最新动态的文章。

重构的诞生:对软件工程高影响研究本质的反思中,Bill Griswold 作为此领域的先驱回顾了他们的经历,他们创造了这个概念,并在博士研究期间开发了第一代重构工具。结合他们的经验,作者提醒年轻研究人员:不应过分关注竞争性想法;运气和环境在创新过程中也发挥显著作用;应该从失败中学习。

重构神话 Munawar Hafiz 和 Jeff Overbey 分析了有关自动重构工具的流行观念。他们考察了以下看法:重构工具之所以有用,是因为有助于把繁琐的设计修改用自动方式完成,重构工具的关键价值是行为保全能力,以及重构工具是稳健的。所有这些神话确实包含一定的真理,但Hafiz和Overbey认为,也不完全准确。

你的代码何时开始变臭?原因何在? Michele Tufano及其同事在2015国际软件工程大会上的获奖论文。他们探讨了“代码味道”的想法——也就是不良设计中存在的可通过重构缓解的症状。通过对200多个开源项目的分析,Tufano和他的同事发现,大多数“代码变味”并非出现在进化式软件开发任务中,这与传统看法相左。

Miryung Kim、Thomas Zimmermann 和 Nachiappan Nagappan 在 微软软件重构的挑战与成效研究 中通过对微软开发人员的调查采访和对其代码的分析,深入研究了软件重构在微软的实践。在各种细节中,Kim 和她的同事们发现,从业者往往会模糊重构概念,Windows 7中的重构模块经历了复杂度相对降低的过程。

最后一篇文章是 我们如何重构以及如何了解它,这是 Chris Parnin, Andrew P. Black 和我在之前获奖论文的基础上开展的一个有关重构的大规模调研。通过采用多种技术手段我们发现,关于开发者是如何重构的,以前的研究结果有些可以确认,有些则不能确认。例如,开发者往往不把重构孤立进行,而是和其他类型的重构交叉进行,这使得传统重构工具用起来有点棘手。

结论

重构将继续是一个常用的和必要的实践,同时还是一个新兴的研究方向。希望这组文章能吸引你进一步探讨,并和我们一起共建未来:让开发人员能够有效、高效而且正确地重构。

 

客座编辑

Emerson Murphy-Hill是北卡罗莱纳州立大学计算机科学系的副教授。他的研究方向是人机交互和软件工程之间的交叉领域。Murphy-Hill从波特兰州立大学获得博士学位。他的联系方法是emurph3@ncsu.edu; http://people.engr.ncsu.edu/ermurph3。

Translations

English    |    Spanish

Translations by Osvaldo Perez and Tiejun Huang


Audio

English: