重构 - 处理概括关系
IT_FISH629
纯正程序员一枚
展开
-
处理概括关系之十二 :Replace Delegation with Inheritance(以继承取代委托)
你在两个classes 之间使用委托关系(delegation),并经常为整个接口编写许多极简单的请托函数(delegating methods)。让「请托(delegating)class」继承「受托 class (delegate)」。动机(Motivation)本重构与 Replace Delegation with Inheritance 恰恰相反。如果转载 2013-05-16 09:28:15 · 947 阅读 · 0 评论 -
处理概括关系之十 :Form Template Method(塑造模板函数)
你有一些subclasses ,其中相应的某些函数以相同顺序执行类似的措施,但各措施实际上有所不同。将各个措施分别放进独立函数中,并保持它们都有相同的签名式(signature),于是原函数也就变得相同了。然后将原函数上移至superclass 。动机(Motivation)继承是「避免重复行为」的一个强大工具。无论何时,只要你看见两个subclasses转载 2013-05-15 09:18:26 · 1375 阅读 · 0 评论 -
处理概括关系之九 :Collapse Hierarchy(折叠继承关系)
superclass 和subclass 之间无太大区别。将它们合为一体。动机(Motivation)如果你曾经编写过继承体系,你就会知道,继承体系很容易变得过分复杂。所谓重构继承体系,往往是将函数和值域在体系中上下移动。完成这些动作后,你 很可能发现某个subclass 并未带来该有的价值,因此需要把classes 并合(折叠)起来。作法(Mechanic转载 2013-05-15 09:15:32 · 1730 阅读 · 0 评论 -
处理概括关系之八 :Extract Interface(提炼接口)
若干客户使用class 接口中的同一子集;或者,两个classes 的接口有部分相同。将相同的子集提炼到一个独立接口中。动机(Motivation)classes 之间彼此互用的方式有若干种。「使用一个class 」通常意味覆盖该class 的所有责任区( whole area of responsibilities )。另一种情况是,某一组客户只使用class 责转载 2013-05-14 17:53:32 · 2082 阅读 · 0 评论 -
处理概括关系之七 :Extract Superclass(提炼超类)
两个classes 有相似特性(similar features)。为这两个classes 建立一个superclass ,将相同特性移至superclass 。动机(Motivation)重复代码是系统中最主要的一种糟糕东西。如果你在不同的地方进行相同一件事 情,一旦需要修改那些动作时,你就得负担比你原本应该负担的更多事情。重复代码的某种形式就是:两个cl转载 2013-05-14 17:50:55 · 1175 阅读 · 0 评论 -
处理概括关系之六 :Extract Subclass(提炼子类)
class 中的某些特性(features)只被某些(而非全部)实体(instances)用到。新建一个subclass ,将上面所说的那一部分特性移到subclass 中。动机(Motivation)使用Extract Subclass 的主要动机是:你发现class 中的某些行为只被一部分实体用到,其他实体不需要它们。有时候这种行为上的差异是通过type cod转载 2013-05-14 17:49:10 · 892 阅读 · 0 评论 -
处理概括关系之五 :Push Down Field(值域下移)
superclass 中的某个值域只被部分(而非全部)subclasses 用到。将这个值域移到需要它的那些subclasses 去。动机(Motivation)Push Down Field 恰恰相反 Pull Up Field。如果只有某些(而非全部)subclasses 需要superclass 内的一个值域,你可以使用本项重构。作法(Mechanic转载 2013-05-14 08:55:15 · 747 阅读 · 0 评论 -
处理概括关系之四 :Push Down Method(函数下移)
superclass 中的某个函数只与部分(而非全部)subclasses 有关。 将这个函数移到相关的那些subclasses 去。动机(Motivation)Push Down Method 恰恰相反于 Pull Up Method 。当我有必要把某些行为从superclass 移至特定的subclass 时,我就使用Push Down Method,它通常也只转载 2013-05-14 08:53:14 · 1082 阅读 · 0 评论 -
处理概括关系之二 :Pull Up Method(函数上移)
有些函数,在各个subclass 中产生完全相同的结果。将该函数移至superclass。动机(Motivation)避免「行为重复」是很重要的。尽管「重复的两个函数」也可以各自工作得很好, 但「重复」自身会成为错误的滋生地,此外别无价值。无论何时,只要系统之内出现重复,你就会面临「修改其中一个却未能修改另一个」的风险。通常,找出重复也有一定困难。如果某个函转载 2013-05-10 09:21:05 · 1133 阅读 · 0 评论 -
处理概括关系之一 :Pull Up Field(值域上移)
两个subclasses 拥有相同的值域。将此一值域移至superclass。动机(Motivation)如果各个subclass 是分别开发的,或者是在重构过程中组合起来的,你常会发现它们拥有重复特性,特别是值域更容易重复。这样的值域有时拥有近似的名字,但也并非绝对如此。判断若干值域是否重复,惟一的办法就是观察函数如何使用它们。如果它们被使用的方式很相似,你就可以转载 2013-05-10 09:16:59 · 1186 阅读 · 1 评论 -
处理概括关系之三 :Pull Up Constructor Body(构造函数本体上移)
你在各个subclass 中拥有一些构造函数,它们的本体(代码)几乎完全一致。 在superclass 中新建一个构造函数,并在subclass 构造函数中调用它。class Manager extends Employee... public Manager (String name, String id, int grade) { _name = nam转载 2013-05-10 09:23:03 · 842 阅读 · 0 评论 -
处理概括关系之十一 :Replace Inheritance with Delegation(以委托取代继承)
某个subclass 只使用superclass 接口中的一部分,或是根本不需要继承而来的数据。在subclass 中新建一个值域用以保存superclass ;调整subclass 函数,令它改而委托superclass ;然后去掉两者之间的继承关系。动机(Motivation)继承(Inheritance )是一件很棒的事,但有时候它并不是你要的。常常你会遇到这转载 2013-05-16 09:26:34 · 934 阅读 · 0 评论