用Mikado方法重构遗留软件

标签: mikado 方法 重构 | 发表时间:2012-03-18 13:36 | 作者:
出处:http://pipes.yahoo.com/pipes/pipe.info?_id=10560380f804c7341f042a2b8a03e117

在敏捷印度2012的一次研讨会上, Daniel Brolund介绍了 Mikado方法。此方法主张敏捷团队在面临低质的遗留代码时,采用简单的方法,分成小部分逐步完成重构。

通常,当你想在遗留应用程序中做个简单的改动时,经常会有某些事情出错而使这个改动无法执行——如编译出错、验收测试失败(如果有验收测试!)等。当你修复这些问题后,更多的问题又出现了——直到看上去事情全都失控,你都恨不得来重写这个系统了。

Mikado方法提出了简单的解决方案。当你进行重构时,一旦发现某些依赖的部分出错了,则画一张图表来表示这些错误,并标明真正去修复错误之前,需要先做什么事情。然后还原你的改动,开始观察那张依赖图中的某个叶子结点。修复那个错误,看它是否会引起更多的问题——如果不会,重复这个过程——继续对剩余部分进行重构并在图中画出更多的叶子、还原你的改动,并再从某个叶子结点开始修复工作。

每当还原代码时,你可能觉得自己又回到了原点,而实际上并没有——比起刚开始,你已经掌握了更多的信息。而且,你也主要是在编译能通过(并且测试通过!)的代码上做修改,而不是大量无法编译的代码, 所以也有可能可以使用IDE重构工具。每当一个叶子结点上的问题都修复完了、且不再引起更多错误时,就可以签入代码,在依赖图上把这个叶子结点标记为绿色;当某个结点上的所有叶子结点都是绿色了,你就可以以那个结点为基准开始工作,重复上述的过程,直到完成所有原定的重构工作。这意味着代码是以很小的增量逐渐签入的,且可以直接在主干代码上工作(而不用为此再打分支)。

对于重构大型应用系统,似乎这个图表会变得太庞大且难以控制,但是Daniel说通常并不是这样的——依赖图的规模与代码的规模通常并不直接成比例。依赖图的主要目的是清楚地记录每一步重构开始时的目标和范围,以便让自己只朝着这个目标工作,而不是试图一次做太多改动。

Daniel用一个简单的Java程序演示了这个方法(这个程序需要重构以使它能支持多种多样的客户)。在随后一场简单的交流会上,与会者也按照此方法顺利完成了重构。你可以从Github上下载这个 练习的主要内容,也可以下载这本 电子书。你还可以阅读InfoQ上更早的一篇文章《 如何进行大规模重构》了解更多。

查看英文原文: Mikado Method For Refactoring Legacy Software

相关 [mikado 方法 重构] 推荐:

用Mikado方法重构遗留软件

- - InfoQ cn
在敏捷印度2012的一次研讨会上, Daniel Brolund介绍了 Mikado方法. 此方法主张敏捷团队在面临低质的遗留代码时,采用简单的方法,分成小部分逐步完成重构. 通常,当你想在遗留应用程序中做个简单的改动时,经常会有某些事情出错而使这个改动无法执行——如编译出错、验收测试失败(如果有验收测试.

提升代码质量的 6 个重构方法

- - 蓝飞技术部落格
在过去做了不少代码走读,发现了一些代码质量上比较普遍的问题,以下是其中的前五名:. 臃肿的类:类之所以会臃肿,是因为开发者缺乏对最基本的编码原则,即“单一职责原则”(SRP)的理解. 这些类往往会变得很臃肿,是由于不同的且在功能上缺少关联的方法都放在了相同的类里面. 长方法:方法之所以会变得很长主要是有以下几个原因:.

[Java][activiti]同步或者重构activiti identify用户数据的方法

- - CSDN博客架构设计推荐文章
同步或者重构Activiti Identify用户数据的多种方案比较. 相信每个涉及到用户的系统都有一套用户权限管理平台或者模块,用来维护用户以及在系统内的功能、数据权限,我们使用的Activiti工作流引擎配套设计了包括 User、Group的Identify模块,怎么和业务数据同步呢,这个问题是每个新人必问的问题之一,下面介绍几种同步方案,最后总结比较.

代码重构

- - ITeye博客
随着程序的演化,我们有必要重新思考早先的决策,并重写部分代码. 代码需要演化;它不是静态的事物. 重写、重做和重新架构代码合起来,称为重构.    当你遇到绊脚石  ---  代码不在合适,你注意到有两样东西其实应该合并或是其他任何对你来说是"错误"的东西  -------- . 如果代码具备以下特征,你都应该考虑重构代码:.

Sunny谈重构

- - CSDN博客架构设计推荐文章
       按照软件工程大神Martin Fowler的定义, 重构就是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,进而提高软件的可扩展性和可维护性. 这是重构的定义,简单来说就是不改变软件的功能,优化软件设计和代码,让软件更易于扩展和维护,当然也包括易于复用.

代码重构总结

- - 开源软件 - ITeye博客
重构:对软件内部结构的一种调整,目的是在不改变软件之可察行为前提下,提高其理解性,降低其修改成本. 创建一个新方法,命名以它做什么来命名,而不是怎么做来命名. 如果只是简单的委托,可以将方法内联. 被子类继承的方法不能内联. 如果一个临时变量只被简单的表达式赋值一次,就可以将它内联. 将这个临时变量申明为final.

代码坏味道——重构

- - CSDN博客推荐文章
1.    Duplicated Code(重复的代码). 臭味行列中首当其冲的就是Duplicated Code. 如果你在一个以上的地点看到相同的程序结构,那么当可肯定:设法将它们合而为一,程序会变得更好. 最单纯的Duplicated Code就是[同一个class内的两个函数含有相同表达式(expression)].

模板方法

- - 博客园_首页
由于前两天刚好用到模板方法这个模式,而且这个模式相对来 比较简单实用,就写写个人的一些认知吧. 大家对宋丹丹和赵本山的小品里有一个很经典的台词一定不会陌生,而且还日常中经常引用:. 《钟点工》中宋丹丹问要把大象装冰箱,总共分几步. 赵本山就懵了,大象那么大,冰箱那么小,怎么才能把大象装冰箱里呢. 答案也很经典:三步:第1步,把冰箱门打开;第2步,把大象装进去;第3步,把冰箱门带上.

【外刊IT评论网】什么是重构,什么不是重构

- - 外刊IT评论网
  有时候,会有程序员跑到我这里说他们不喜欢某个东西的设计,“我们需要给它来个全面的重构”,来纠正里面的错误.   重构(Refactoring)这个词最初由Martin Fowler 和 Kent Beck给下的定义,它是. 一种修改,使软件的内部结构更容易理解,在不改变软件的可见行为方式前提下使软件更容易变更…它是一种有节制的整理代码、使bug产生几率最小化的方法.

详解 equals() 方法和 hashCode() 方法

- - ImportNew
Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码. equals()和hashCode()都不是final方法,都可以被重写(overwrite). 本文介绍了2种方法在使用和重写时,一些需要注意的问题. Object类中equals()方法实现如下:.