1、 Copyright 2002 Chinaxp. All rights reservedRefactoring( 重 构 )黄海波 & 陶万山 With contribution by 劳晖www.chinaxp.org 1 Copyright 2002 Chinaxp. All rights reserved什么是 RefactoringRefactoring是对已经完成的代码进行改进的过程。在不对代码的外部行为进行改动的情况下,对代码内部的结构进行优化。Refactoring是严谨 地 对完成的代码进行清理的从而减少出错的一种方法。Refactoring的实质是对完成代码的设计进行改进。R
2、efactoring是 XP项目中每天的例行练习。Refactoring必须和 Test-Driven Design and Development伴随进行。2 Copyright 2002 Chinaxp. All rights reserved为什么要 Refactoring?Refactoring的目的:1. 改进软件的设计。程序员对代码所做的为了满足短期利益代码改动,或再没有完全清楚增个架构下的改动,都很容易是代码失去它的清晰结构,偏离需求或设计。而这些改动的积累很容易使代码偏离它原先设计的初衷而变得不可立即和无法维护。Refactoring则帮助重新组织代码,重新清晰的体现结构和进一
3、步改进设计。3 Copyright 2002 Chinaxp. All rights reserved为什么要 Refactoring?Refactoring的目的:2. 提高代码质量,可维护性。容易理解的代码可以很容易的维护和做进一步的开发。即使对写这些代码的程序员本身,容易理解代码也可以帮助容易地做修改。程序代码也是文档。而代码首先是写给人看的,让后才是给计算机看的。4 Copyright 2002 Chinaxp. All rights reserved为什么要 Refactoring?Refactoring的目的:3. Refactoring帮助尽早的发现错误( Defects)Ref
4、actoring是一个 code review和反馈的过程。在另一个时段重新审视自己或别人代码,可以更容易的发现问题和加深对代码的理解。Refactoring是一个良好的软件开发习惯。5 Copyright 2002 Chinaxp. All rights reserved为什么要 Refactoring?Refactoring的目的: . Refactoring可以提高提高开发速度Refactoring对设计和代码的改进,都可以有效的提高开发速度。好的设计和代码质量实体提高开发速度的关键。在一个有缺陷的设计和混乱代码基础上的开发,即使表面上进度较快,但本质是试延后对设计缺陷的发现和对错误的修
5、改,也就是延后了开发风险,最终要在开发的后期付出更多的时间和代价。6 Copyright 2002 Chinaxp. All rights reservedRefactoring和 传统流程在传统的流程中,分为设计和编码两个阶段。设计阶段(概要设计,详细设计)在编码阶段(先设计,后编码)之前。在传统的过程中,设计是一个很严谨和占用大量时间的阶段(比如一个项目 6个月, 4个月需求分析和设计),从设计阶段获得的几乎不会变化的详细设计文档,然后程序员对这些详细设计进行实现。现实: 程序员需要改动代码来迎合需求的改变。 程序员需要改动代码来能满足实际中性能的要求 程序员没能理解和按设计实现 程序员为
6、了赶 DeadLine对代码做的 Quick-and-Ugly修改结果:代码从设计偏离,设计变的过时7 Copyright 2002 Chinaxp. All rights reservedRefactoring和敏捷 流程Refactoring表现敏捷方法的设计哲学 :软件开发是一个进化的过程。过去的传统的设计方法则专著于软件的设计阶段,力求整体设计的完美和详细,从而防止开发过程的后期出现没由预见到的情况而危害软件的质量和进度。敏捷方法则专注于当前的设计的完美,不过分考虑将来设计 , 依赖目前的好的设计和代码来应付将来可能出现的需求和情况。而 Refactoring就是敏捷方法的实现其设计哲
7、学的工具。8 Copyright 2002 Chinaxp. All rights reserved什么时候适合做 Refactoring? 在开始增加一个新的功能之前为了增加一个新的功能,程序员需要首先读懂现有的代码。 在修复一个错误的时候为了修复一个 Bug,程序员需要读懂现有的代码。 在做 Code Review的时候9 Copyright 2002 Chinaxp. All rights reserved什么时候不适合做 Refactoring? 代码太混乱,设计完全错误与其 Refactor, 不如重新开始。 明天是 DeadLine永远不要做 Last-Minute-Change。 推迟 Refactoring, 但不可以忽略,即使进入 Production的代码都正确的运行。 Refactoring的工作量显著的影响 Estimate一个 Task的 estimate是天,如果为了 Refactoring, 需要更多的时间( 天或更多)。推迟 Refactoring,同步可以忽略。可以把这个Refactoring作为一个新的 Task, 或者安排在 Refactoring的 Iteration中完成。10