![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
重构道路
文章平均质量分 88
重构之路,任重道远
随遇而安的生活
努力努力的学习。
展开
-
Replace Temp with Query 以查询取代临时变量
一、用法你的程序以一个临时变量保存某一表达式的运算结果。**将这个表达式提炼到一个独立函数。将这个临时变量的所有引用点替换为对新函数的调用。此后,新函数就可被其他函数使用。 二、动机临时变量的问题在于:它们是暂时的,而且只能在所属函数内使用。由于临时变量只在所属函数内可见,所以它们会驱使你写出更长的函数,因为只有这样你才能访问到需要的临时变量、如果把临时变量替换为一个查询,那么同一个类中的所有翻译 2017-05-04 09:28:53 · 398 阅读 · 0 评论 -
Extract Class(提炼类)
某个类做了应该由两个雷做的事。 建立一个新类,将相关的字段和函数从旧类搬移到新类。 1. 动机你也许听过类似这样的教诲:一个类应该是一个清楚的抽象,处理一些明确的责任。但是在实际工作中,类会不断成长扩展。你会在这儿家如一些功能,在那儿加入一些数据,给某个类添加一箱新责任时,你会觉得不知为这项责任分离出一个单独的类。于是,随着责任不断增加,这个类会变得过分复杂。很快,你的类就会变成一团乱麻。这翻译 2017-06-16 09:21:08 · 662 阅读 · 0 评论 -
Extract Interface(提炼接口)
若干客户使用类接口中的同一子集,或者两个类的接口有部分相同。 将相同的子类提炼到一个独立接口中。 1.动机类之间彼此互用的方式有若干种。①.“使用一个类”通常意味用到该类的所有责任区。②.某一组客户只使用类责任区中的一个特定子集。③.这个类需要与所有协助处理某些特定请求的类合作。对于后两种情况,将真正用到的这部分责任分离出来通常很有意义,因为这样可以使系统的用法更清晰,同时也更容易看清系统的翻译 2017-06-21 09:54:07 · 1359 阅读 · 0 评论 -
Parameterize Method(令函数携带参数)
若干函数做了类似的工作,但在函数本体中却包含了不同的值。 建立单一函数,以参数表达那些不同的值。 1.动机两个函数做着类似的工作,但因少数几个值致使行为略有不同。这种情况下,你可以将这些个子分离的函数统一起来,并通过参数来处理那些变化情况,用以简化问题。这样的修改可以去除重复的代码,并提高灵活性,因为你可以用这个参数处理更多的变化情况。2.做法新建一个带有参数的函数,使它可以替换先前所有的翻译 2017-07-18 09:17:11 · 974 阅读 · 0 评论 -
Extract Subclass(提炼子类)
类中的某些特性只被某些(而非全部)实例用到。 *新建一个子类,将上面所说的那一部分特性移到子类中* 1. 动机1.主要动机:你发现类中的某些行为只被一部分实例用到,其他实例不需要它们。 2. Extract Class(提炼类)是Extract Subclass之外的另一种选择,两者之间的抉择其实就是委托和继承之间的抉择。Extract Subclass通常更容易进行,但它也有限制:一旦对象创翻译 2017-06-16 09:41:01 · 517 阅读 · 0 评论 -
Introduce Parameter Object(引入参数对象)
1.形式某些参数总是很自然地同时出现。以一个对象取代这些参数。 2.动机你常会看到特定的一组参数总是一起被传递。可能有好几个函数都是用这一组参数,这些函数可能隶属同一个类,也可以隶属不同的类。这样一组参数就是所谓的Data Clumps(数据泥团),我们可以运用一个对象包装所有这些数据。本项重构的价值在于缩短参数列,而你知道,过长的参数总是难以理解。新对象所定义的访问函数还可以使代码更具一致性,翻译 2017-05-23 09:13:56 · 2275 阅读 · 0 评论 -
Extract Method 提炼函数
一、用法你有一段代码可以被组织在一起并独立出来。将这段代码放进一个独立函数中,并让函数名称解释该函数的用途。二、动机当看见一个过长的函数或者一段需要注释才能让人理解用途的代码,就应该将这段代码放进一个独立函数中。首先,如果每个函数的粒度都很小,那么函数被复用的机会就更大;其次,这回使高层函数读起来就像一系列注释;再次,如果函数都是细粒度,那么函数的覆写也会更容易些。三、做法创建一个新函数翻译 2017-05-03 08:52:26 · 539 阅读 · 0 评论 -
Hide Delegate(隐藏“委托关系”)
客户通过一个委托类来调用另一个对象。 在服务类上建立客户所需的所有函数,用以隐藏委托关系。 1.动机“封装”意味每个对象都应该尽可能少了解系统的其他部分。如此一来,一旦发生变化,需要了解这一变化的对象就会比较少—这会使变化比较容易进行。如果某个客户先通过服务对象的字段得到另一个对象,然后调用后者的函数,那么客户必须知晓这一层委托关系。万一委托干洗发生变化,客户也得相应变化。你可以在服务对象上翻译 2017-06-21 09:29:16 · 1091 阅读 · 0 评论 -
Replace Delegation with Inheritance(以委托取代继承)
某个子类只用超类接口中的一部分,或是根本不需要继承而来的数据。 在子类中新建一个字段用以保存超类;调整子类函数,令它改而委托超类;然后去掉两者之间的继承关系 1.动机继承是个好东西,但有时候它并不是你要的。你常常会遇到这样的情况:①.一开始继承了一个类,随后发现超类中许多操作并不真正适用于子类。这种情况下,你所拥有的接口并未真正反映出子类的功能。②.你可能发现从超类中继承了一大堆子类并不需要的翻译 2017-06-20 10:05:01 · 728 阅读 · 0 评论 -
Replace Method with Method Object(以函数对象取代函数)
将这个函数放进一个单独对象中,如此一来局部变量就成了对象内的字段,。然后你可以再同一个对象中将这个大型函数分解为多个小型函数。 将获取的参数变量封装到另一个对象中。1. 动机小型函数能大大提高代码的可读性。但是局部变量的存在会增加函数分解难度。如果一个函数之中局部变量泛滥成灾,那么想分解这个函数是非常困难的。Replace Temp with Query(以查询取代临时变量)可以帮助你减轻这翻译 2017-06-14 09:31:03 · 1057 阅读 · 1 评论 -
Remove Middle Man(移除中间人)
Remove Middle Man翻译 2017-06-21 09:35:14 · 537 阅读 · 0 评论 -
Preserve Whole Object(保存对象完成)
你从某个对象中取出若干值,将它们作为某一次函数调用时的参数。 1.动机有时候,你会讲来自同一对象的若干项数据作为参数,传递给某个函数。这样做的问题在于:万一将来被调用函数需要新的数据项,你就必须查找并修改一次函数的所有调用。如果你把这些数据所属的整个独享传给函数,可以避免这种尴尬的处境,因为被调用函数可以向那个参数对象请求任何它想要的数据。提高代码可读性。不好处:如果传递的参数是整个对象,被翻译 2017-06-14 09:01:35 · 595 阅读 · 0 评论 -
Replace Inheritance with Delegation(以继承取代委托)
你在两个类之间使用委托关系,并经常为整个接口编写许多极简单的委托函数。 让委托类继承受托类 1. 动机本重构与Replace Inheritance with Delegation恰恰相反翻译 2017-06-22 09:18:40 · 820 阅读 · 1 评论 -
重构学习(一)
文档编写:记录学习《重构 改善既有代码的设计》。时间久了发现程序员这个行业的魅力就是神秘。“我不是个伟大的程序员,我只是个有这一些优秀习惯的好程序员。”重构能够帮助我更有效地写出强健的代码。一、重构1.重构定义名词形式:对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。动词形式:使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。“翻译 2017-04-25 08:42:57 · 864 阅读 · 0 评论