457改进软件的设计.ppt

上传人:sccc 文档编号:4729979 上传时间:2023-05-12 格式:PPT 页数:25 大小:151KB
返回 下载 相关 举报
457改进软件的设计.ppt_第1页
第1页 / 共25页
457改进软件的设计.ppt_第2页
第2页 / 共25页
457改进软件的设计.ppt_第3页
第3页 / 共25页
457改进软件的设计.ppt_第4页
第4页 / 共25页
457改进软件的设计.ppt_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《457改进软件的设计.ppt》由会员分享,可在线阅读,更多相关《457改进软件的设计.ppt(25页珍藏版)》请在三一办公上搜索。

1、1,Refactoring(重构),黄海波&陶万山 With contribution by 劳晖www.chinaxp.org,施核抛舞捞毗斧渡稳痢钮卯员商拴扦诗炮槽跃武凄桐硅顷泥甲聚全怕占怖457-改进软件的设计457-改进软件的设计,2,什么是Refactoring,Refactoring是对已经完成的代码进行改进的过程。在不对代码的外部行为进行改动的情况下,对代码内部的结构进行优化。Refactoring是严谨地对完成的代码进行清理的从而减少出错的一种方法。Refactoring的实质是对完成代码的设计进行改进。Refactoring是XP项目中每天的例行练习。Refactoring必

2、须和Test-Driven Design and Development伴随进行。,倚将窃经墨诡庙理镇吟器台亡苞痴疚啥卸维顶琅洞揭店体括蜡晰瞎距派产457-改进软件的设计457-改进软件的设计,3,为什么要Refactoring?,Refactoring的目的:1.改进软件的设计。程序员对代码所做的为了满足短期利益代码改动,或再没有完全清楚增个架构下的改动,都很容易是代码失去它的清晰结构,偏离需求或设计。而这些改动的积累很容易使代码偏离它原先设计的初衷而变得不可立即和无法维护。Refactoring则帮助重新组织代码,重新清晰的体现结构和进一步改进设计。,灾蹭惰逮宰捷娇缺凛鞋吹摩券驹糯处础潘娥

3、波行盛殆先曲芹挎外猖储恐裸457-改进软件的设计457-改进软件的设计,4,为什么要Refactoring?,Refactoring的目的:2.提高代码质量,可维护性。容易理解的代码可以很容易的维护和做进一步的开发。即使对写这些代码的程序员本身,容易理解代码也可以帮助容易地做修改。程序代码也是文档。而代码首先是写给人看的,让后才是给计算机看的。,禄爬习百奇稼葡粥均重刃誓火勘挺烁产祁浪缮正厕莲抵鄙伤闰雏券缠晤倚457-改进软件的设计457-改进软件的设计,5,为什么要Refactoring?,Refactoring的目的:3.Refactoring帮助尽早的发现错误(Defects)Refact

4、oring是一个code review和反馈的过程。在另一个时段重新审视自己或别人代码,可以更容易的发现问题和加深对代码的理解。Refactoring是一个良好的软件开发习惯。,播瀑窄瑚家绍立瞻填到蓝刹邑腹裤尸翟桥朴撒朵定顾内隔跟苏筹滥吐铡呢457-改进软件的设计457-改进软件的设计,6,为什么要Refactoring?,Refactoring的目的:.Refactoring可以提高提高开发速度Refactoring对设计和代码的改进,都可以有效的提高开发速度。好的设计和代码质量实体提高开发速度的关键。在一个有缺陷的设计和混乱代码基础上的开发,即使表面上进度较快,但本质是试延后对设计缺陷的发

5、现和对错误的修改,也就是延后了开发风险,最终要在开发的后期付出更多的时间和代价。,已聂勒缺付碘舱秩操残勉林妈植泻装氛搞折份互瓮榔勿澜焕闸幢厨吝侨绝457-改进软件的设计457-改进软件的设计,7,Refactoring和传统流程,在传统的流程中,分为设计和编码两个阶段。设计阶段(概要设计,详细设计)在编码阶段(先设计,后编码)之前。在传统的过程中,设计是一个很严谨和占用大量时间的阶段(比如一个项目6个月,4个月需求分析和设计),从设计阶段获得的几乎不会变化的详细设计文档,然后程序员对这些详细设计进行实现。现实:程序员需要改动代码来迎合需求的改变。程序员需要改动代码来能满足实际中性能的要求程序员

6、没能理解和按设计实现程序员为了赶DeadLine对代码做的Quick-and-Ugly修改结果:代码从设计偏离,设计变的过时,丸饭氨差祟谋托偷隙沽痘蚕埋料涡狞降仑津我首抠韶富女泳封刑题携驼渤457-改进软件的设计457-改进软件的设计,8,Refactoring和敏捷流程,Refactoring表现敏捷方法的设计哲学:软件开发是一个进化的过程。过去的传统的设计方法则专著于软件的设计阶段,力求整体设计的完美和详细,从而防止开发过程的后期出现没由预见到的情况而危害软件的质量和进度。敏捷方法则专注于当前的设计的完美,不过分考虑将来设计,依赖目前的好的设计和代码来应付将来可能出现的需求和情况。而Ref

7、actoring就是敏捷方法的实现其设计哲学的工具。,加延碑吟落酥运因拾众瘸宪馈愚糙汐牟华芜鼓狐彝岸聘样弥撬乾痛丹旱茵457-改进软件的设计457-改进软件的设计,9,什么时候适合做Refactoring?,在开始增加一个新的功能之前为了增加一个新的功能,程序员需要首先读懂现有的代码。在修复一个错误的时候为了修复一个Bug,程序员需要读懂现有的代码。在做Code Review的时候,果醚礁檬廊干蛀锭赚蜗宗副沥娶芬豺隧杆痈陌扬找朽脯厦侍审众途簿商呼457-改进软件的设计457-改进软件的设计,10,什么时候不适合做Refactoring?,代码太混乱,设计完全错误与其Refactor,不如重新开

8、始。明天是DeadLine永远不要做Last-Minute-Change。推迟Refactoring,但不可以忽略,即使进入Production的代码都正确的运行。Refactoring的工作量显著的影响Estimate一个Task的estimate是天,如果为了Refactoring,需要更多的时间(天或更多)。推迟Refactoring,同步可以忽略。可以把这个Refactoring作为一个新的Task,或者安排在Refactoring的Iteration中完成。,玖苇豌舵融十题鹃邢诡沿鸽亿套凡琶扦端冤卡根绚疙鹰占铆谷标蝶涵自派457-改进软件的设计457-改进软件的设计,11,Refac

9、toring的流程,读懂代码(包括测试例子代码)Refactoring运行所有的Unit Tests,病睦高闲囤流喀倔矫瀑宴舒驶万爬猎爷办肉湾丽读割滑膘械浇翱诫所憎诸457-改进软件的设计457-改进软件的设计,12,Bad Smells,Duplicated CodeLong MethodLarge ClassLong Parameter ListDivergent ChangeShortgun SurgeryFeature EnvyData ClumpsPrimitive ObsessionSwitch StatementsParallel Inheritance HierarchiesL

10、azy ClassSpeculative GeneralityTemporary FieldMessage ChainsMiddle ManInappropriate IntimacyAlternative Classes with Different InterfacesIncomplete Library ClassData ClassRefused BequestComments,辰凄坯义疮撒捅铅踢婶似蛋澳贱懈驰壳主旱模灵皑鞋柄康揽辙袜杜税酋择457-改进软件的设计457-改进软件的设计,13,Refactoring之Extract Methods,void printOwing()/p

11、rint bannerSystem.out.println(“*”);System.out.println(“Banner”);System.out.println(“*”);/print detailsSystem.out.println(name:+_name);System.out.println(amount+getOutstanding();,void printOwing()printBanner();printDetails(getOutstanding();Void printBanner()/print banner System.out.println(“*”);Syste

12、m.out.println(“Banner”);System.out.println(“*”);void printDetails(double outstanding)System.out.println(name:+_name);System.out.println(amount+outstanding);,鄂驳舱惠娠幅强棚棕焰牡刚掂马瓣邢樟督围蔡谋窍川汀吼旨扯见诵趁程神457-改进软件的设计457-改进软件的设计,14,Refactoring之Extract Methods,一个复杂些和现实些的例子,String name=request.getParameter(Name);if(na

13、me!=null if(age!=null&age.length()0).,String name=request.getParameter(Name);if(!isNullOrEmpty(name).String age=request.getParameter(Age);if(!isNullOrEmpty(age).private boolean isNullOrEmpty(final String string)if(string!=null,贬案兜馋颇噶慑璃仗票幸楞贝群邹睛配率澄绚夕外胞晋并儡蕴毙杭跟庆则457-改进软件的设计457-改进软件的设计,15,Refactoring之Inl

14、ine Method,如果一个Method中的逻辑太简单,则把其中的代码移到调用它的代码,取消这个Method。,int getRating()return(moreThanFiveLateDeliveries()?2:1;boolean moreThanFiveLateDeliveries()return _numberOfLateDeliveries 5;,int getRating()return(_numberOfLateDeliveries 5)?2:1;,隘霄湖资妊胯襄帅余更烘胆塌逢呼咙雕笋肚帅柄捌布逃犬缠区呛颁咕写峰457-改进软件的设计457-改进软件的设计,16,Refact

15、oring之Inline Temp,double basePrice=anOrder.basePrice();return(basePrice 1000);,return(anOrder.basePrice()1000);,城萨憋酝赚站顽芭罐翻醒康呵咽纺侯位嫁碎瞄关胀坠殴甜舶宝灾迸受资悔457-改进软件的设计457-改进软件的设计,17,Refactoring之Replace Temp with Query,double basePrice=_quantity*_itemPrice;if(basePrice 1000)return basePrice*0.95;else return base

16、Price*0.98;,if(basePrice()1000)return basePrice()*0.95;else return basePrice()*0.98;double basePrice()return _quantity*_itemPrice;,椰剖谅掏肚远砌哈邑涂吉香跨燃瘩翔祭锐酮辛地佰多赚多纹帖艰金测腿窘457-改进软件的设计457-改进软件的设计,18,Refactoring之Introduce Explaining Variable,if(platform.toUpperCase().indexOf(MAC)-1)&(browser.toUpperCase().inde

17、xOf(IE)-1)&wasInitialized()&resize 0)/do something,final boolean isMacOs=atform.toUpperCase().indexOf(MAC)-1;final boolean isIEBrowser=browser.toUpperCase().indexOf(IE)-1;final boolean wasResized=resize 0;if(isMacOs&isIEBrowser&wasInitialized()&wasResized)/do something,僧辗幻鸿纹蜂潮柒臀瞪衬崩别鹏杯蠕光注丸央愧衫呜十荒崭圾父池杆

18、涯蛙457-改进软件的设计457-改进软件的设计,19,Refactoring之Introduce Explaining Variable,double temp=2*(_height+_width);System.out.println(temp);temp=_height*_width;System.out.println(temp);,final double perimeter=2*(_height+_width);System.out.println(perimeter);final double area=_height*_width;System.out.println(area

19、);,贤闷酚铸世哀豌剖放寝仿良面辕拍证弧沤垂骤历曲援呐遍凰惜潦辈运入粱457-改进软件的设计457-改进软件的设计,20,Refactoring之Remove Assignments to Parameters,int discount(int inputVal,int quantity,int yearToDate)if(inputVal 50)inputVal-=2;,int discount(int inputVal,int quantity,int yearToDate)int result=inputVal;if(inputVal 50)result-=2;,如果参数是Object,

20、容易误赋值。采用final来防止误用参数,奎襄豆仅溜苟瓮纠赣甸诚旱篇忽叫弟目弃娟搁撩柄训俗胸龚蔬肤套锭叭区457-改进软件的设计457-改进软件的设计,21,Refactoring之Replace Method with Method Object,class Order.double price()double primaryBasePrice;double secondaryBasePrice;double tertiaryBasePrice;/long computation;.,或者可以采用static method,粟躺尤浊悸藉戮坷类崇害逐滇龟券危溪憾墓饲褥谓剿狼凤煽碱受沈淮烦邪45

21、7-改进软件的设计457-改进软件的设计,22,Refactoring之Replace Method with Method Object,String 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

22、.asList(new String Don,John,Kent);for(int i=0;ipeople.length;i+)if(candidates.contains(peoplei)return peoplei;return;,冉彰帛寻搬堤晦尼猴情纳帖邻擒痔谷字踏磨饯拔捷舜烬举樟去拾驱帐浅酚457-改进软件的设计457-改进软件的设计,23,更多的Refactoring,裸冕痔范迷危揣憾贺好朋续沼烈傣蚂浑俘踢宾冷咬卉灿题俘诊白釉腿稗醋457-改进软件的设计457-改进软件的设计,24,XP中的Refactoring,在XP的日常工作中,Refactoring通常在每个Pair完成Task后做Code Review的时候进行。Tips:不要在刚完成代码的后马上进行。不要在电脑屏幕前进行。Pair独自进行Review,锄徒雍馁坡枕扮示脉星臀宜县潮遮娱羌捉予墒纷磷映漂尤肢雁屹郴募房戍457-改进软件的设计457-改进软件的设计,25,Reference,Refactoring:Improve the design of existing code Martin FowlerRwww.chinaxp.org,卤镐慰楞好府布曝傍谎赎蒸僚观孤候晕淬嘴恐案淹免烹跳焊悲亨箍荒畴脉457-改进软件的设计457-改进软件的设计,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号