Refactoring(重构).ppt_第1页
Refactoring(重构).ppt_第2页
Refactoring(重构).ppt_第3页
Refactoring(重构).ppt_第4页
Refactoring(重构).ppt_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1 Refactoring 重构 黄海波 陶万山Withcontributionby劳晖www chinaxp org 2 什么是Refactoring Refactoring是对已经完成的代码进行改进的过程 在不对代码的外部行为进行改动的情况下 对代码内部的结构进行优化 Refactoring是严谨地对完成的代码进行清理的从而减少出错的一种方法 Refactoring的实质是对完成代码的设计进行改进 Refactoring是XP项目中每天的例行练习 Refactoring必须和Test DrivenDesignandDevelopment伴随进行 3 为什么要Refactoring Refactoring的目的 1 改进软件的设计 程序员对代码所做的为了满足短期利益代码改动 或再没有完全清楚增个架构下的改动 都很容易是代码失去它的清晰结构 偏离需求或设计 而这些改动的积累很容易使代码偏离它原先设计的初衷而变得不可立即和无法维护 Refactoring则帮助重新组织代码 重新清晰的体现结构和进一步改进设计 4 为什么要Refactoring Refactoring的目的 2 提高代码质量 可维护性 容易理解的代码可以很容易的维护和做进一步的开发 即使对写这些代码的程序员本身 容易理解代码也可以帮助容易地做修改 程序代码也是文档 而代码首先是写给人看的 让后才是给计算机看的 5 为什么要Refactoring Refactoring的目的 3 Refactoring帮助尽早的发现错误 Defects Refactoring是一个codereview和反馈的过程 在另一个时段重新审视自己或别人代码 可以更容易的发现问题和加深对代码的理解 Refactoring是一个良好的软件开发习惯 6 为什么要Refactoring Refactoring的目的 Refactoring可以提高提高开发速度Refactoring对设计和代码的改进 都可以有效的提高开发速度 好的设计和代码质量实体提高开发速度的关键 在一个有缺陷的设计和混乱代码基础上的开发 即使表面上进度较快 但本质是试延后对设计缺陷的发现和对错误的修改 也就是延后了开发风险 最终要在开发的后期付出更多的时间和代价 7 Refactoring和传统流程 在传统的流程中 分为设计和编码两个阶段 设计阶段 概要设计 详细设计 在编码阶段 先设计 后编码 之前 在传统的过程中 设计是一个很严谨和占用大量时间的阶段 比如一个项目6个月 4个月需求分析和设计 从设计阶段获得的几乎不会变化的详细设计文档 然后程序员对这些详细设计进行实现 现实 程序员需要改动代码来迎合需求的改变 程序员需要改动代码来能满足实际中性能的要求程序员没能理解和按设计实现程序员为了赶DeadLine对代码做的Quick and Ugly修改结果 代码从设计偏离 设计变的过时 8 Refactoring和敏捷流程 Refactoring表现敏捷方法的设计哲学 软件开发是一个进化的过程 过去的传统的设计方法则专著于软件的设计阶段 力求整体设计的完美和详细 从而防止开发过程的后期出现没由预见到的情况而危害软件的质量和进度 敏捷方法则专注于当前的设计的完美 不过分考虑将来设计 依赖目前的好的设计和代码来应付将来可能出现的需求和情况 而Refactoring就是敏捷方法的实现其设计哲学的工具 9 什么时候适合做Refactoring 在开始增加一个新的功能之前为了增加一个新的功能 程序员需要首先读懂现有的代码 在修复一个错误的时候为了修复一个Bug 程序员需要读懂现有的代码 在做CodeReview的时候 10 什么时候不适合做Refactoring 代码太混乱 设计完全错误与其Refactor 不如重新开始 明天是DeadLine永远不要做Last Minute Change 推迟Refactoring 但不可以忽略 即使进入Production的代码都正确的运行 Refactoring的工作量显著的影响Estimate一个Task的estimate是 天 如果为了Refactoring 需要更多的时间 天或更多 推迟Refactoring 同步可以忽略 可以把这个Refactoring作为一个新的Task 或者安排在Refactoring的Iteration中完成 11 Refactoring的流程 读懂代码 包括测试例子代码 Refactoring运行所有的UnitTests 12 BadSmells DuplicatedCodeLongMethodLargeClassLongParameterListDivergentChangeShortgunSurgeryFeatureEnvyDataClumpsPrimitiveObsessionSwitchStatementsParallelInheritanceHierarchiesLazyClassSpeculativeGeneralityTemporaryFieldMessageChainsMiddleManInappropriateIntimacyAlternativeClasseswithDifferentInterfacesIncompleteLibraryClassDataClassRefusedBequestComments 13 Refactoring之ExtractMethods voidprintOwing printbannerSystem out println System out println Banner System out println printdetailsSystem out println name name System out println amount getOutstanding voidprintOwing printBanner printDetails getOutstanding VoidprintBanner printbannerSystem out println System out println Banner System out println voidprintDetails doubleoutstanding System out println name name System out println amount outstanding 14 Refactoring之ExtractMethods 一个复杂些和现实些的例子 Stringname request getParameter Name if name nullif age null age length 0 Stringname request getParameter Name if isNullOrEmpty name Stringage request getParameter Age if isNullOrEmpty age privatebooleanisNullOrEmpty finalStringstring if string null 15 Refactoring之InlineMethod 如果一个Method中的逻辑太简单 则把其中的代码移到调用它的代码 取消这个Method intgetRating return moreThanFiveLateDeliveries 2 1 booleanmoreThanFiveLateDeliveries return numberOfLateDeliveries 5 intgetRating return numberOfLateDeliveries 5 2 1 16 Refactoring之InlineTemp doublebasePrice anOrder basePrice return basePrice 1000 return anOrder basePrice 1000 17 Refactoring之ReplaceTempwithQuery doublebasePrice quantity itemPrice if basePrice 1000 returnbasePrice 0 95 elsereturnbasePrice 0 98 if basePrice 1000 returnbasePrice 0 95 elsereturnbasePrice 0 98 doublebasePrice return quantity itemPrice 18 Refactoring之IntroduceExplainingVariable if platform toUpperCase indexOf MAC 1 browser toUpperCase indexOf IE 1 wasInitialized resize 0 dosomething finalbooleanisMacOs atform toUpperCase indexOf MAC 1 finalbooleanisIEBrowser browser toUpperCase indexOf IE 1 finalbooleanwasResized resize 0 if isMacOs isIEBrowser wasInitialized wasResized dosomething 19 Refactoring之IntroduceExplainingVariable doubletemp 2 height width System out println temp temp height width System out println temp finaldoubleperimeter 2 height width System out println perimeter finaldoublearea height width System out println area 20 Refactoring之RemoveAssignmentstoParameters intdiscount intinputVal intquantity intyearToDate if inputVal 50 inputVal 2 intdiscount intinputVal intquantity intyearToDate intresult inputVal if inputVal 50 result 2 如果参数是Object 容易误赋值 采用final来防止误用参数 21 Refactoring之ReplaceMethodwithMethodObject classOrder doubleprice doubleprimaryBasePrice doublesecondaryBasePrice doubletertiaryBasePrice longcomputation 或者可以采用staticmethod 22 Refactoring之ReplaceMethodwithMethodObject StringfoundPerson String people for inti 0 i people length i if people i equals Don return Don if people i equals John return John if people i equals Kent return Kent return StringfoundPerson String people Listcandidates Arrays asList newString Don John Kent for inti 0 i people length i if candidates c

温馨提示

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

评论

0/150

提交评论