重构-从思想做起.ppt_第1页
重构-从思想做起.ppt_第2页
重构-从思想做起.ppt_第3页
重构-从思想做起.ppt_第4页
重构-从思想做起.ppt_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、重构从思想做起,郑蒙家2008-09-02,重构-refactoring,改善既有代码的设计重构,就是在不破坏可察功能的前提下,借由搬移、提炼、打散、凝聚来改善事物的本质。“非常的建设需要非常的破坏”,很多人都认同这一观点。但对现役的应用软件、构筑过半的项目、运转中的系统却容不得推倒重来。老子说:“治大国,如烹小鲜。”维护一个运转中的系统亦如治国,改善体质、强化可读性、为未来扩充和维护做准备乃至找出潜伏的BUG也要有如烹小鲜,不能乱动没有原则性的频频强动,而是要遵循它自己的道啊,这个道就是重构。,作为一个程序员,任谁都有看不上眼的代码:代码来自你邻桌的那菜鸟或者是三个月前的自己。面临此境有人选

2、择得过且过,然而根据程序员特质,更多的人盼望着手整顿,挽起袖子,剑及履及,其勇虽佳,其虑未缜。孔子说:“暴虎凭河,死而无悔者,吾不与也。”现在有了严谨的重构规则和严密的后果构手法,孔子也不会说“吾不与也了”,稳定中求发展也有了保障。,重构不是一份靠着天份挥洒的艺术,必须是一项工程。,什么是重构?,重构是这样一个过程:在不改变代码行为的前提下,对代码做出修改,以改进程序内部结构。重构是一种有纪律的、经过训练的、有条不紊的程序整理方法,本质上说,重构就是在代码写好以后改变它的设计。,重构的目的是什么?,1、改进软件的设计。2、使软件更容易理解。3、帮你找到BUGS。4、有助于你提高编程速度。,什么

3、时候重构?,重构不是一件特别拨出时间去做的一件事情,它应该随时随地的进行,你不应该为了重构而重构,之所以重构,是因为你想做别的事情,而重构能让你把那些事情做得更好。,重构的三次法则1、添加功能时一并重构2、修补错误时一并重构3、复审代码时一并重构,什么样的程序难以相与?,1、难以阅读的程序2、逻辑重复的程序3、添加新行为需要修改既有代码的程序4、带复杂条件逻辑的程序,重构的难题?,1、数据库2、修改接口3、难以通过重构手法完成的设计改动,何时不该重构?,1、代码太混乱重构它还不如重写它来得简单2、项目已近最后期限,也应该避免重构,重构与设计?,重构肩负着一项特别任务:它和设计互补。有了设计你可

4、以思考得更快,但其中充满漏洞。重构改变了预先设计的角色,如果没有重构你就必须保证预先设计正确无误这个压力太大了。运用重构,前期的设计你只需要得到一个足够合理的方案,在实施过程中你也许会发觉最佳解决方案和你当初的设想有所不同,但有重构这个武器在手,就不是问题,因为重构让日后修改的成本不再高昂。重构可以带来更简单的设计,同时又不损失灵活性,它降低了设计过程的难度,减少了设计压力。,重构与性能?,重构可以帮助你写出更快的软件,短程来看重构也许会使软件变慢,但它使优化分阶段的性能调优更容易。关于性能有一个很有趣的现象,大多数程序,它大把的时间都花费在一小段代码上,如果你优化所有工作,你会发现90%的优

5、化其实都是白费功能,因为你优化的代码许多难得被执行起来,你花时间是为了让程序运行更快,如果缺乏清醒认识而花费时间,那些时间是被浪费掉了。重构对于提升性能有两方面的帮助,首先分解良好的代码可以让你快整完成功能开发,有更多的时间用于调整性能;其次,良好的代码分解,使你在进行性能分析时把握更好的粒度,更好的理解自己的选择,更清楚哪种调整起关键作用。,代码的坏味道,重复的代码,1、单纯的重复代码是指一个class内的两个函数具有相同的表达式。2、两个毫不相干的类使用相同的代码。,过长的函数,1、拥有短函数的对象会活得比较好、比较长。2、我们应当遵循这样一条原则,每当想用注释来说明点什么的时候,我们最好

6、把需要说明的内容写到一个独立的函数里。,过大的class,想利用一个类做过多的事情,其内往往会出现太多的instance变量,一旦如此,重复代码就接踵而至了。class太大,是代码重复、混乱、死亡的绝佳滋生地点,最简单的解决方案,就是把累赘的东西消灭在class内。,过长参数列,太长参数列的函数难以理解,太多参数会造成前后不一致,不易使用。,发散式变化,当某个class因为不同原因在不同方向上发生变化时,发散式变化就产生了。,霰弹式修改,如果遇到某种变化时,你需要在许多不同的class间作一些小修改,你所面临的就是霰弹式修改。发散式变化和霰弹式修改正好是相反的,一个是一个class受多种变化的

7、影响;另一个是一个变化影响多个class。这两种情况你都要整理代码,取得外部变化和待改类呈现一对一的理想关系。,依恋情结,函数对某个class的兴趣高过它自己所在class,这种孺慕之情的焦点便是数据。典型的例子就是某个函数为了计算某值几乎调用了另一个class的半打函数。,TheEnd,数据泥团,数据项就像小孩子,喜欢成群结队呆在一起,你常常会在很多地方看到相同的数据项,两个class内相同的值域,许多函数签名中相同的参数,这些绑在一起出现的数据应该放进属于它们自己的对象中。,基本型别偏执,大多数编程环境都有两种数据:结构类型允许你将数据组织为有意义的形式;基本类型就是构成结构类型的积木块。结构总是会带来额外开销,它们有点像数据库中的表格,或是那些得不偿失(只为做一两件事而创建,却付出太大的额外开销)的东西。,Switch惊悚现身,面向对象的一个显著特点就是少用switch(或case)语句,本质上说switch语句的问题在于重复。,平行继承关系,当你为某个class增加一个子类的时候,也必须为另一个class增加一个子类,如果你发现某个继承体系的class名前缀和另一个继承体系的class名前缀完全相同,便是闻到了这仲坏味道。,冗赘类,你所创建的每个

温馨提示

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

评论

0/150

提交评论