Refactoring重构学习讲稿_第1页
Refactoring重构学习讲稿_第2页
Refactoring重构学习讲稿_第3页
Refactoring重构学习讲稿_第4页
Refactoring重构学习讲稿_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Refactoring(重构)黄海波 & 陶万山 With contribution by 劳晖1什么是RefactoringRefactoring是对已经完成的代码进行改进的过程。在不对代码的外部行为进行改动的情况下,对代码内部的结构进行优化。Refactoring是严谨地对完成的代码进行清理的从而减少出错的一种方法。Refactoring的实质是对完成代码的设计进行改进。Refactoring是XP项目中每天的例行练习。Refactoring必须和Test-Driven Design and Development伴随进行。2为什么要Refactoring?R

2、efactoring的目的:1.改进软件的设计。程序员对代码所做的为了满足短期利益代码改动,或再没有完全清楚增个架构下的改动,都很容易是代码失去它的清晰结构,偏离需求或设计。而这些改动的积累很容易使代码偏离它原先设计的初衷而变得不可立即和无法维护。Refactoring则帮助重新组织代码,重新清晰的体现结构和进一步改进设计。3为什么要Refactoring?Refactoring的目的:2.提高代码质量,可维护性。容易理解的代码可以很容易的维护和做进一步的开发。即使对写这些代码的程序员本身,容易理解代码也可以帮助容易地做修改。程序代码也是文档。而代码首先是写给人看的,让后才是给计算机看的。4为

3、什么要Refactoring?Refactoring的目的:3.Refactoring帮助尽早的发现错误(Defects)Refactoring是一个code review和反馈的过程。在另一个时段重新审视自己或别人代码,可以更容易的发现问题和加深对代码的理解。Refactoring是一个良好的软件开发习惯。5为什么要Refactoring?Refactoring的目的:. Refactoring可以提高提高开发速度Refactoring对设计和代码的改进,都可以有效的提高开发速度。好的设计和代码质量实体提高开发速度的关键。在一个有缺陷的设计和混乱代码基础上的开发,即使表面上进度较快,但本质是

4、试延后对设计缺陷的发现和对错误的修改,也就是延后了开发风险,最终要在开发的后期付出更多的时间和代价。6Refactoring和传统流程在传统的流程中,分为设计和编码两个阶段。设计阶段(概要设计,详细设计)在编码阶段(先设计,后编码)之前。在传统的过程中,设计是一个很严谨和占用大量时间的阶段(比如一个项目6个月,4个月需求分析和设计),从设计阶段获得的几乎不会变化的详细设计文档,然后程序员对这些详细设计进行实现。现实:程序员需要改动代码来迎合需求的改变。程序员需要改动代码来能满足实际中性能的要求程序员没能理解和按设计实现程序员为了赶DeadLine对代码做的Quick-and-Ugly修改结果:

5、代码从设计偏离,设计变的过时7Refactoring和敏捷流程Refactoring表现敏捷方法的设计哲学:软件开发是一个进化的过程。过去的传统的设计方法则专著于软件的设计阶段,力求整体设计的完美和详细,从而防止开发过程的后期出现没由预见到的情况而危害软件的质量和进度。敏捷方法则专注于当前的设计的完美,不过分考虑将来设计,依赖目前的好的设计和代码来应付将来可能出现的需求和情况。而Refactoring就是敏捷方法的实现其设计哲学的工具。8什么时候适合做Refactoring?在开始增加一个新的功能之前为了增加一个新的功能,程序员需要首先读懂现有的代码。在修复一个错误的时候为了修复一个Bug,程

6、序员需要读懂现有的代码。在做Code Review的时候9什么时候不适合做Refactoring?代码太混乱,设计完全错误与其Refactor,不如重新开始。明天是DeadLine永远不要做Last-Minute-Change。推迟Refactoring,但不可以忽略,即使进入Production的代码都正确的运行。Refactoring的工作量显著的影响Estimate一个Task的estimate是天,如果为了Refactoring,需要更多的时间( 天或更多)。推迟Refactoring,同步可以忽略。可以把这个Refactoring作为一个新的Task,或者安排在Refactoring

7、的Iteration中完成。10Refactoring的流程读懂代码(包括测试例子代码)Refactoring运行所有的Unit Tests11Bad SmellsDuplicated CodeLong MethodLarge ClassLong Parameter ListDivergent ChangeShortgun SurgeryFeature EnvyData ClumpsPrimitive ObsessionSwitch StatementsParallel Inheritance HierarchiesLazy ClassSpeculative GeneralityTempora

8、ry FieldMessage ChainsMiddle ManInappropriate IntimacyAlternative Classes with Different InterfacesIncomplete Library ClassData ClassRefused BequestComments12Refactoring之Extract Methodsvoid printOwing() /print bannerSystem.out.println(“*”);System.out.println(“Banner”);System.out.println(“*”);/print

9、detailsSystem.out.println (name: + _name); System.out.println (amount + getOutstanding(); void printOwing() printBanner(); printDetails(getOutstanding(); Void printBanner() /print banner System.out.println(“*”); System.out.println(“Banner”); System.out.println(“*”);void printDetails (double outstand

10、ing) System.out.println (name: + _name); System.out.println (amount + outstanding); 13Refactoring之Extract Methods一个复杂些和现实些的例子String name = request.getParameter(Name);if( name != null & name.length() 0 ).String age = request.getParameter(Age);if( age != null & age.length() 0 ).String name = request.g

11、etParameter(Name);if( !isNullOrEmpty( name ) ) .String age = request.getParameter(Age);if( !isNullOrEmpty( age ) ) .private boolean isNullOrEmpty( final String string ) if( string != null & string.length() 0 ) return true; else return false; 14Refactoring之Inline Method如果一个Method中的逻辑太简单,则把其中的代码移到调用它的

12、代码,取消这个M getRating() return (moreThanFiveLateDeliveries() ? 2 : 1; boolean moreThanFiveLateDeliveries() return _numberOfLateDeliveries 5; int getRating() return (_numberOfLateDeliveries 5) ? 2 : 1; 15Refactoring之Inline Tempdouble basePrice = anOrder.basePrice(); return (basePrice 1000) ;ret

13、urn (anOrder.basePrice() 1000) ;16Refactoring之Replace Temp with Query double basePrice = _quantity * _itemPrice; if (basePrice 1000) return basePrice * 0.95; else return basePrice * 0.98; if (basePrice() 1000) return basePrice() * 0.95; else return basePrice() * 0.98; double basePrice() return _quan

14、tity * _itemPrice; 17Refactoring之Introduce Explaining Variable if ( (platform.toUpperCase().indexOf(MAC) -1) & (browser.toUpperCase().indexOf(IE) -1) & wasInitialized() & resize 0 ) / do something final boolean isMacOs = atform.toUpperCase().indexOf(MAC) -1; final boolean isIEBrowser = browser.toUpp

15、erCase().indexOf(IE) -1; final boolean wasResized = resize 0; if (isMacOs & isIEBrowser & wasInitialized() & wasResized) / do something 18Refactoring之Introduce Explaining Variabledouble temp = 2 * (_height + _width); System.out.println (temp); temp = _height * _width; System.out.println (temp); fina

16、l double perimeter = 2 * (_height + _width);System.out.println (perimeter); final double area = _height * _width; System.out.println (area); 19Refactoring之Remove Assignments to Parametersint discount (int inputVal, int quantity, int yearToDate) if (inputVal 50) inputVal -= 2; int discount (int input

17、Val, int quantity, int yearToDate) int result = inputVal; if (inputVal 50) result -= 2; 如果参数是Object,容易误赋值。采用final来防止误用参数20Refactoring之Replace Method with Method Objectclass Order. double price() double primaryBasePrice; double secondaryBasePrice; double tertiaryBasePrice; / long computation; . 或者可以采

18、用static method21Refactoring之Replace Method with Method ObjectString foundPerson(String people) for (int i = 0; i people.length; i+) if (peoplei.equals (Don) return Don; if (peoplei.equals (John) return John; if (peoplei.equals (Kent) return Kent; return ; String foundPerson(String people) List candidates = Arrays.asList(new String Don, John, Kent); for

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论