457-改进软件的设计.ppt

上传人:京东小超市 文档编号:5821905 上传时间:2020-08-10 格式:PPT 页数:25 大小:151KB
返回 下载 相关 举报
457-改进软件的设计.ppt_第1页
第1页 / 共25页
457-改进软件的设计.ppt_第2页
第2页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

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

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

2、factoring必须和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. Refactor

4、ing帮助尽早的发现错误(Defects) Refactoring是一个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表现敏捷方法的设计哲学: 软件开发是一个进化的过程。 过去的传统的设计方法则专著于软件的设计阶段,力求整体设计的 完美和详细,从而防止开发过程的后期出现没由预见到的情况而危 害软件的质量和进度。 敏捷方法则专注于当前的

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

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

9、舵融十题鹃邢诡沿鸽亿套凡琶扦端冤卡根绚疙鹰占铆谷标蝶涵自派457-改进软件的设计457-改进软件的设计,11,Refactoring的流程,读懂代码(包括测试例子代码) Refactoring 运行所有的Unit Tests,病睦高闲囤流喀倔矫瀑宴舒驶万爬猎爷办肉湾丽读割滑膘械浇翱诫所憎诸457-改进软件的设计457-改进软件的设计,12,Bad Smells,Duplicated Code Long Method Large Class Long Parameter List Divergent Change Shortgun Surgery Feature Envy Data Clumps

10、 Primitive Obsession Switch Statements Parallel Inheritance Hierarchies Lazy Class Speculative Generality Temporary Field Message Chains Middle Man Inappropriate Intimacy Alternative Classes with Different Interfaces Incomplete Library Class Data Class Refused Bequest Comments,辰凄坯义疮撒捅铅踢婶似蛋澳贱懈驰壳主旱模灵皑

11、鞋柄康揽辙袜杜税酋择457-改进软件的设计457-改进软件的设计,13,Refactoring之Extract Methods,void printOwing() /print banner System.out.println(“*”); System.out.println(“Banner”); System.out.println(“*”); /print details System.out.println (“name: “ + _name); System.out.println (“amount “ + getOutstanding(); ,void printOwing() p

12、rintBanner(); printDetails(getOutstanding(); Void printBanner() /print banner System.out.println(“*”); System.out.println(“Banner”); System.out.println(“*”); void printDetails (double outstanding) System.out.println (“name: “ + _name); System.out.println (“amount “ + outstanding); ,鄂驳舱惠娠幅强棚棕焰牡刚掂马瓣邢樟

13、督围蔡谋窍川汀吼旨扯见诵趁程神457-改进软件的设计457-改进软件的设计,14,Refactoring之Extract Methods,一个复杂些和现实些的例子,String name = request.getParameter(“Name“); if( name != null if( age != null & age.length() 0 ) ,String name = request.getParameter(“Name“); if( !isNullOrEmpty( name ) ) String age = request.getParameter(“Age“); if( !i

14、sNullOrEmpty( age ) ) private boolean isNullOrEmpty( final String string ) if( string != null ,贬案兜馋颇噶慑璃仗票幸楞贝群邹睛配率澄绚夕外胞晋并儡蕴毙杭跟庆则457-改进软件的设计457-改进软件的设计,15,Refactoring之Inline Method,如果一个Method中的逻辑太简单,则把其中的代码移到调用它的代码, 取消这个Method。,int getRating() return (moreThanFiveLateDeliveries() ? 2 : 1; boolean more

15、ThanFiveLateDeliveries() return _numberOfLateDeliveries 5; ,int getRating() return (_numberOfLateDeliveries 5) ? 2 : 1; ,隘霄湖资妊胯襄帅余更烘胆塌逢呼咙雕笋肚帅柄捌布逃犬缠区呛颁咕写峰457-改进软件的设计457-改进软件的设计,16,Refactoring之Inline Temp,double basePrice = anOrder.basePrice(); return (basePrice 1000) ;,return (anOrder.basePrice() 100

16、0) ;,城萨憋酝赚站顽芭罐翻醒康呵咽纺侯位嫁碎瞄关胀坠殴甜舶宝灾迸受资悔457-改进软件的设计457-改进软件的设计,17,Refactoring之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; do

17、uble basePrice() return _quantity * _itemPrice; ,椰剖谅掏肚远砌哈邑涂吉香跨燃瘩翔祭锐酮辛地佰多赚多纹帖艰金测腿窘457-改进软件的设计457-改进软件的设计,18,Refactoring之Introduce Explaining Variable,if ( (platform.toUpperCase().indexOf(“MAC“) -1) & (browser.toUpperCase().indexOf(“IE“) -1) & wasInitialized() & resize 0 ) / do something ,final boolea

18、n 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 ,僧辗幻鸿纹蜂潮柒臀瞪衬崩别鹏杯蠕光注丸央愧衫呜十荒崭圾父池杆涯蛙457-改进软件的设计457-改进软件的设计,19,Refactorin

19、g之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);,贤闷酚铸世

20、哀豌剖放寝仿良面辕拍证弧沤垂骤历曲援呐遍凰惜潦辈运入粱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;

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

22、龟券危溪憾墓饲褥谓剿狼凤煽碱受沈淮烦邪457-改进软件的设计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 “; ,

23、String foundPerson(String people) List candidates = Arrays.asList(new String “Don“, “John“, “Kent“); for (int i=0; ipeople.length; i+) if (candidates.contains(peoplei) return peoplei; return “; ,冉彰帛寻搬堤晦尼猴情纳帖邻擒痔谷字踏磨饯拔捷舜烬举樟去拾驱帐浅酚457-改进软件的设计457-改进软件的设计,23,更多的Refactoring,,裸冕痔范迷危揣憾贺好朋续沼烈傣蚂浑俘踢宾冷咬卉灿题俘诊白釉腿稗

24、醋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 Fowler R www.chinaxp.org,卤镐慰楞好府布曝傍谎赎蒸僚观孤候晕淬嘴恐案淹免烹跳焊悲亨箍荒畴脉457-改进软件的设计457-改进软件的设计,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1