重构 - 在对象之间搬移特性
IT_FISH629
纯正程序员一枚
展开
-
在对象之间搬移特性之二 :Move Field(搬移值域)
你的程序中,某个field(值域〕被其所驻class之外的另一个class更多地用到。在target class 建立一个new field,修改source field的所有用户,令它们改用此new field。动机(Motivation)在classes之间移动状态(states)和行为,是重构过程中必不可少的措施。随着系统发展,你会发现自己需要新的class,转载 2013-05-03 12:39:35 · 648 阅读 · 0 评论 -
在对象之间搬移特性之一 :Move Method(搬移函数)
你的程序中,有个函数与其所驻class之外的另一个class进行更多交流:调用后者,或被后者调用。在该函数最常引用(指涉)的class中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数(delegating method),或是将旧函数完全移除。动机(Motivation)「函数搬移」是重构理论的支柱。如果一个class有太多行为,或如果一个class与转载 2013-05-03 12:36:49 · 1042 阅读 · 0 评论 -
在对象之间搬移特性之四 :Inline Class(将类内联化)
你的某个class没有做太多事情(没有承担足够责任)。将class的所有特性搬移到另一个class中,然后移除原class。动机(Motivation)Inline Class正好与Extract Class 相反。如果一个class不再承担足够 责任、不再有单独存在的理由〔这通常是因为此前的重构动作移走了这个class的 责任),我就会挑选这一「萎缩cla转载 2013-05-06 09:13:55 · 921 阅读 · 0 评论 -
在对象之间搬移特性之五 :Hide Delegate(隐藏「委托关系」)
客户直接调用其server object(服务对象)的delegate class。在server端(某个class〕建立客户所需的所有函数,用以隐藏委托关系(delegation)。动机(Motivation)「封装」即使不是对象的最关键特征,也是最关键特征之一。「封装」意味每个对象都应该尽可能少了解系统的其他部分。如此一来,一旦发生变化,需要了解这一 变化的对象转载 2013-05-06 09:16:10 · 1010 阅读 · 0 评论 -
在对象之间搬移特性之六 :Remove Middle Man(移除中间人)
某个class做了过多的简单委托动作(simple delegation)。让客户直接调用delegate(受托类)。动机(Motivation)在Hide Delegate的「动机」栏,我谈到了「封装 delegated object(受托对 象)」的好处。但是这层封装也是要付出代价的,它的代价就是:每当客户要使用 delegate(受托类)的新特性时,你就必转载 2013-05-06 09:19:15 · 886 阅读 · 0 评论 -
在对象之间搬移特性之三 :Extract Class(提炼类)
某个class做了应该由两个classes做的事。建立一个新class,将相关的值域和函数从旧class搬移到新class。动机(Motivation)你也许听过类似这样的教诲:一个class应该是一个清楚的抽象(abstract),处理一些明确的责任。但是在实际工作中,class会不断成长扩展。你会在这儿加入一些功能,在那儿加入一些数据。给某个class添加一项新转载 2013-05-06 09:00:50 · 976 阅读 · 0 评论 -
在对象之间搬移特性之八 :Introduce Local Extension(引入本地扩展)
你所使用的server class需要一些额外函数,但你无法修改这个class。建立一个新class,使它包含这些额外函数。让这个扩展品成为source class的subclass (子类〕或wrapper(外覆类)。动机(Motivation)很遗憾,classes的作者无法预知未来,他们常常没能为你预先准备一些有用的函数。如果你可以修改源码,最好的办法就是直接转载 2013-05-06 17:05:40 · 801 阅读 · 0 评论 -
在对象之间搬移特性之七 :Introduce Foreign Method(引入外加函数)
你所使用的server class需要一个额外函数,但你无法修改这个class。在client class中建立一个函数,并以一个server class实体作为第一引数(argument) : Date newStart = new Date (previousEnd.getYear(), previousEnd.getMonth(转载 2013-05-06 17:02:48 · 806 阅读 · 0 评论