重构
文章平均质量分 75
silvia0427
这个作者很懒,什么都没留下…
展开
-
《重构改善既有代码的设计》之重构列表--在对象之间搬移特性(二)
三、Extract Class (提炼类) 某个类做了应该由两个类做的事。 建立一个新类,将相关的字段和函数从旧类搬移到新类。 动机 你也许听过类似的教诲:一个类应该是一个清楚的抽象,处理一些明确的责任。但是在实际工作中,类会不断成长扩展。你会在这儿加入一些功能,在那儿加一些数据。给某个类添加一项新责任时,你会觉得不值得为这项责任分离出一个单独的类。于是,随着责任的不断增加,这个类会变得过原创 2012-12-18 11:02:18 · 400 阅读 · 0 评论 -
《重构改善既有代码的设计》之重构列表--处理概括关系(三)
九、Collapse Hierarchy(折叠继承体系) 超类和子类之间无太大区别。 将它们合为一体。 动机 如果你曾经编写过继承体系,就会知道,继承体系很容易变得过分复杂。所谓重构继承体系,往往是将函数和字段在体系中上下移到。完成这些动作后,你狠可能发现某个子类并未带来该有的价值,因此需要把超类和子类合并起来。 做法 1、选择你想移除的类:是超类还是子类? 2、使用Pull Up原创 2012-12-18 11:04:14 · 340 阅读 · 0 评论 -
《重构改善既有代码的设计》之代码的坏味道(二)
三、Large Class(过大的类) 如果想利用单个类做太多事情,其内往往会出现太多实例变量。一旦如此,Duplicate Code 也就接踵而至了。 四、Long Paramter List(过长参数列) 如果向已有的对象发送一条请求就可以取代一个参数,那么你应该激活重构手法Replace Parameter with Method。在这里,“已有对象”可能是函数所属类内原创 2012-12-18 11:02:01 · 276 阅读 · 0 评论 -
《重构改善既有代码的设计》之重构列表--重新组织函数(一)
一、Extract Method(提炼函数) 你有一段代码可以被组织在一起并独立出来。 将这段代码放进一个独立函数中,并让函数名称解释该函数的用途。 Void printOwing(double amount){ printBanner(); //print details System.out.println("name:" + _name); System.out.println原创 2012-12-18 11:02:09 · 287 阅读 · 0 评论 -
《重构改善既有代码的设计》之重构列表--重新组织函数(二)
四、Replace Temp with Query(以查询取代临时变量) 你的程序以一个临时变量保存某一表达式的运算结果。 将这个表达式提炼到一个独立函数中。将这个临时变量的所有引用点为对新函数的调用。此后,新函数就可被其他函数使用。 Double basePrice = _quantity * _ itemPrice; If(basePrice >1000){ Return baseP原创 2012-12-18 11:02:11 · 265 阅读 · 0 评论 -
《重构改善既有代码的设计》之重构列表--重新组织函数(三)
七、Remove Assignments to Parameters(移除对函数的赋值) 代码对一个参数进行赋值 以一个临时变量取代该参数的位置 Int discount(int inputVal,int quantity,int yearToDate){ If(inputVal > 50) inputVal -= 2; } 转换后: Int discount(int in原创 2012-12-18 11:02:13 · 244 阅读 · 0 评论 -
《重构改善既有代码的设计》之重构列表--重新组织数据(三)
八、Change Bidirectional Association to Unidirectional(将双向关联改为单向关联) 两个类之间有双向关联,但其中一个类如今不再需要另一个类的特性。 去除不必要的关联。 动机 双向关联很有用,但你也必须为它付出代价,那就是维护双向连接、确保对象被正确创建和删除而增加的复杂度。而且,由于很多程序员并不习惯使用双向连接,它往往成为错误之源。 大量原创 2012-12-18 11:02:33 · 368 阅读 · 0 评论 -
《重构改善既有代码的设计》之重构列表--重新组织数据(四)
十二、Encapsulate Collection (封装集合) 有个函数返回一个集合。 让这个函数返回该集合的一个只读副本,并在这个类中提供添加、移除集合元素的函数。 动机 我们常常会在一个类中使用集合(collection,可能是array、list、set或vector)来保存一组实例。这样的类通常也会提供针对该集合的取值、设值函数。 但是,集合的处理方式应该和其他种类的数据略有不原创 2012-12-18 11:02:35 · 325 阅读 · 0 评论 -
《重构改善既有代码的设计》之重构列表--简化条件表达式(二)
五、Replace Nested Conditional with Guard Clauses(以卫语句取代嵌套条件表达式) 函数中条件逻辑使人难以看清正常的执行路径。 使用卫语句表现所有特殊情况。 Double getPayAmount(){ Double result; If(_isDead) result = deadAmount(); Else{ If(_isSeparate原创 2012-12-18 11:02:59 · 346 阅读 · 0 评论 -
《重构改善既有代码的设计》之重构列表--简化函数调用(二)
六、Replace Parameter with explicit methods(以明确函数取代参数) 你有一个函数,其中完全取决于参数值而采取不同行为。 针对该参数的每一个可能值,建立一个独立函数。 动机 Replace parameter with explicit methods恰恰相反于parameterize method。如果某个参数有多种可能的值,而函数内又以条件表达式检查原创 2012-12-18 11:03:37 · 374 阅读 · 0 评论 -
《重构改善既有代码的设计》之重构列表--处理概括关系(二)
五、Push Down Field(下移字段) 超类中的某个字段只被部分(而非全部)子类用到。 将这个字段移到需要它的子类中去。 动机 Push Down Field 与Pull Up Field恰恰相反:如果只有某些(而非全部)子类需要超类内的一个字段,你可以使用本项重构。 做法 1、在所有子类中声明该字段。 2、将该字段从超类中移除。 3、编译,测试。 4、将该字段从所有不需原创 2012-12-18 11:04:11 · 353 阅读 · 0 评论 -
《重构改善既有代码的设计》之重构列表--处理概括关系(一)
有一批重构手法专门用来处理概括关系(既继承关系)。 一、Pull Up Field(字段上移) 两个子类拥有相同的字段。 将该字段移至超类中。 动机 如果各子类是分别开发的,或者是在重构过程中组合起来的,你常会发现他们拥有重复特性,特别是字段更容易重复,这样的字段有时拥有相似的名字,但也并非绝对如此。判断若干字段是否重复,唯一的办法是观察函数如果使用它们。如果它们被使用的方式相似,你就可原创 2012-12-18 11:04:09 · 356 阅读 · 0 评论 -
《重构改善既有代码的设计》之重构列表--简化函数调用(一)
一、Rename Method(函数改名) 函数的名称未能揭示函数的用途 修改函数名称 动机 函数的名称应该准确表达它的用途。给函数命名有一个好的方法:首先考虑应该给这个函数写上一句怎样的注释,然后想办法将注释变成函数名称。 做法 1、检查函数签名是否被超类或子类实现过。如果是,则需要针对每份实现分别进行下列步骤。 2、声明一个新函数,将它命名为你想要的名称。将旧函数代码复制到新函数原创 2012-12-18 11:03:01 · 308 阅读 · 0 评论 -
《重构改善既有代码的设计》之重构列表--重新组织数据(一)
一、Self Encapsulate Field (自封装字段) 你直接访问一个字段,但与字段之间的耦合关系逐渐变得笨拙。 为这个字段建立取值、设值函数,并且只以这些函数来访问 字段。 Private int _low,_height; Boolean includes(int arg){ Return arg >= _low && arg } 转换后: Private in原创 2012-12-18 11:02:22 · 309 阅读 · 0 评论 -
《重构改善既有代码的设计》之重构列表--重新组织数据(五)
十四、Replace Type Code with Subclass(以子类取代类型码) 你有一个不可变的类型码,它会影响类的行为。 以子类取代这个类型码。 动机 如果你面对的类型码不会影响宿主类的行为,可以使用Replace Type Code with Class来处理它们。但如果类型码会影响宿主类的行为,那么最好的办法就是借助多态来处理变化行为。 一般来说,这种情况的标志就是像sw原创 2012-12-18 11:02:55 · 263 阅读 · 0 评论 -
《重构改善既有代码的设计》之重构列表--简化条件表达式(一)
一、Decompose Conditional(分解条件表达式) 你有一个复杂的条件(if-then-else)语句。 从if、then、else三个段落中分别提炼出独立函数。 If(date.before(SUMMER_START) || date.after(SUMMER_END)){ charge = quantity * _winterRate + _winterServiceCh原创 2012-12-18 11:02:57 · 461 阅读 · 0 评论 -
《重构改善既有代码的设计》之重构列表--大型重构
一、Tease Apart Inheritance (梳理并分解继承体系) 某个继承体系同时承担两项责任。 建立两个继承体系,并通过委托关系让其中一个可以调用另一个。 动机 继承是个好东西,它可以明显减少子类中的代码量。函数的重要性可能并不和它的大小成比例--在继承体系中尤然。 不过,先别急着为这个强大的工具欢呼雀跃,因为继承也很容易被误用,并且这种误用还很容易在开发人员之间蔓延。今天你原创 2012-12-18 11:04:21 · 417 阅读 · 0 评论 -
《重构改善既有代码的设计》之代码的坏味道(一)
一、Duplicated Code(重复代码) 坏味道行列中首当其冲的就是Duplicate Code.如果你在一个以上地点看到相同的程序结构,那么可以肯定:设法将其合二为一,程序会变得更好。 最单纯的Duplicate Code就是“同一个类的两个函数含有相同的表达式”。这时,你需要做的是采用Extract Method提炼出重复代码,然后让这两个地点都调用被提炼出来的那一段原创 2012-12-18 11:01:56 · 327 阅读 · 0 评论 -
《重构改善既有代码的设计》之代码的坏味道(三)
十一、Parallel Inheritance Hierarchies(平行继承体系) Prallel Inheritance Hierarchies其实是Shotgun Surgery的特殊情况。在这种情况下,每当你为某个类增加ige子类,必须也为另一个类相应增加一个子类。如果你发现某个继承体系的类名称前缀和另一个继承体系的类名称前缀完全相同,便是闻到了这种坏味道。 消除这种原创 2012-12-18 11:02:07 · 455 阅读 · 0 评论 -
《重构改善既有代码的设计》之重构列表--在对象之间搬移特性(一)
一、Move Method(搬移函数) 你的程序中,有个函数与其所贮类之外的类进行更多交流。 在该函数最常引用的类中建立一个有着类似行为的新函数。将旧函数编程一个单纯的委托函数,或是将旧函数完全移除。 动机 “搬移函数”是重构理论的支柱。如果一个类有太多的行为,或如果一个类与另一个类有太多合作而形成的高度耦合,我就会搬移函数。通过这种手段,可以使系统中的类更简单,这些类最终也将更干净利落的原创 2012-12-18 11:02:15 · 367 阅读 · 0 评论 -
《重构改善既有代码的设计》之重构列表--在对象之间搬移特性(三)
六、Remove Middle Man(移除中间人) 某个类做了过多的简单委托动作。 让客户直接调用受托类。 动机 在Hide Delegate的“动机”一节中,我谈到了“封装受托对象”的好处。但是这层封装也是要付出代价的,它的代价就是:每当客户要使用受托类的新特性时,你就必须在服务端添加一个简单委托函数。随着受委托类的特性(功能)越来越多,这一过程会让你痛苦不已。服务类完全变成一个“中间原创 2012-12-18 11:02:20 · 266 阅读 · 0 评论 -
《重构改善既有代码的设计》之重构列表--重新组织数据(二)
五、Replace Array with Object(以对象取代数组) 你有一个数组,其中的元素各自代表不同的东西。 以对象取代数组。对于数组中的每个元素,以一个字段表示。 动机 数组是一种常见的用以组织数据的结构。不过,它们应该只用于“以某种顺序容纳一组相似的对象”。有时候你会发现,一个数组容纳了多种不同的对象,这会给用户带来麻烦,因为他们很难记住像“数组的第一个元素是人名”这样的约定原创 2012-12-18 11:02:31 · 251 阅读 · 0 评论 -
《重构改善既有代码的设计》之重构列表--简化函数调用(三)
十一、Hide Method(隐藏函数) 有一个函数,从来没有被其他任何类调用。 将这个函数修改为private。 动机 重构往往需要促使你修改函数的可见度。提高函数可见度的情况很容易想象:另一个类需要用到某个函数,因此你必须提高函数的可见度。但是要指出一个函数的可见度是否过高就稍微困难一些。理想状况下,你可以使用工具检查所有函数,指出可被隐藏的函数。即使没有这样的工具,你也应该时常进行这原创 2012-12-18 11:03:53 · 362 阅读 · 0 评论