
重构 - 重新组织数据
IT_FISH629
纯正程序员一枚
展开
-
重新组织数据之三 :Change Value to Reference(将实值对象改为引用对象)
你有一个class,衍生出许多相等实体(equal instances),你希望将它们替换为单一对象。将这个value object (实值对象)变成一个reference object (引用对象)。动机(Motivation)在许多系统中,你都可以对对象做一个有用的分类:reference object和value objects。前者就像「客户」、「帐户」这样转载 2013-05-06 17:13:09 · 798 阅读 · 0 评论 -
重新组织数据之一 :Self Encapsulate Field(自封装值域)
你直接访问一个值域(field),但与值域之间的耦合关系逐渐变得笨拙。为这个值域建立取值/设值函数(getting and setting methods ),并且只以这些函数来访问值域。private int _low, _high;boolean includes (int arg) { return arg >= _low && arg } pri转载 2013-05-06 17:07:56 · 774 阅读 · 0 评论 -
重新组织数据之十四 :Replace Type Code with Subclasses(以子类取代型别码)
你有一个不可变的(immutable)type code ,它会影响class 的行为。以一个subclass 取代这个type code。动机(Motivation)如果你面对的type code 不会影响宿主类的行为,你可以使用Replace Type Code with Class 来处理它们。但如果type code 会影响宿主类的行为,那么最好的办法就是借转载 2013-05-07 09:06:52 · 794 阅读 · 0 评论 -
重新组织数据之十二 :Replace Record with Data Class(以数据类取代记录)
你需要面对传统编程环境中的record structure (记录结构)。 为该record (记录)创建一个「咂」数据对象(dumb data object)。动机(Motivation)Record structures (记录型结构)是许多编程环境的共同性质。有一些理由使它们被带进面向对象程序之中:你可能面对的是一个老旧程序( legacy program ),也可转载 2013-05-07 09:01:52 · 818 阅读 · 0 评论 -
重新组织数据之十 :Encapsulate Field(封装值域)
你的class中存在一个public值域。将它声明为private,并提供相应的访问函数(accessors)。public String _name private String _name;public String getName() {return _name;}public void setName(String arg) {_name = arg;}转载 2013-05-07 08:57:10 · 753 阅读 · 0 评论 -
重新组织数据之九 :Replace Magic Number with Symbolic Constant(以符号常量/字面常量取代魔法数)
你有一个字面数值(literal number ),带有特别含义。创造一个常量,根据其意义为它命名,并将上述的字面数值替换为这个常量。 double potentialEnergy(double mass, double height) { return mass * 9.81 * height; } double potentialEne转载 2013-05-07 08:55:43 · 923 阅读 · 0 评论 -
重新组织数据之七 :Change Unidirectional Association to Bidirectional(将单向关联改为双向)
两个classes都需要使用对方特性,但其间只有一条单向连接(one-way link)。添加一个反向指针,并使修改函数(modifiers)能够同时更新两条连接。(译注:这里的指针等同于句柄(handle),修改函数(modifier)指的是改变双方关系者)动机(Motivation)开发初期,你可能会在两个classes之间建立一条单向连接,使其中一个可以引用另转载 2013-05-07 08:51:08 · 746 阅读 · 0 评论 -
重新组织数据之五 :Replace Array with Object(以对象取代数组)
你有一个数组(array),其中的元素各自代表不同的东西。 以对象替换数组。对于数组中的每个元素,以一个值域表示之。String[] row = new String[3]; row [0] = "Liverpool"; row [1] = "15"; Performance row = new Performance(); row.setName("转载 2013-05-06 17:33:36 · 794 阅读 · 0 评论 -
重新组织数据之十六 :Replace Subclass with Fields(以值域取代子类)
你的各个subclasses 的惟一差别只在「返回常量数据」的函数身上。修改这些函数,使它们返回superclass 中的某个(新增)值域,然后销毁subclasses 。动机(Motivation)建立subclass 的目的,是为了增如新特性,或变化其行为。有一种变化行为(variant behavior )称为「常量函数」(constant method)转载 2013-05-07 09:11:38 · 686 阅读 · 0 评论 -
重新组织数据之十五 :Replace Type Code with State/Strategy(以State/strategy 取代型别码)
你有一个type code ,它会影响class 的行为,但你无法使用subclassing。以state object (专门用来描述状态的对象)取代type code 。动机(Motivation)本项重构和Replace Type Code with Subclasses 很相似,但如果「type code 的值在对象生命期中发生变化」或「其他原因使得宿主类不转载 2013-05-07 09:09:47 · 1440 阅读 · 0 评论 -
重新组织数据之十三 :Replace Type Code with Class(以类取代型别码)
class 之中有一个数值型别码( numeric type code ),但它并不影响class 的行为。以一个新的class 替换该数值型别码(type code)。动机(Motivation)在以C 为基础的编程语言中,type code(型别码)或枚举值(enumerations)很常见。如果带着一个有意义的符号名,type code 的可读性还是不错的。问转载 2013-05-07 09:04:33 · 761 阅读 · 0 评论 -
重新组织数据之八 :Change Bidirectional Association to Unidirectional(将双向关联改为单向)
两个鄉之间有双向关联,但其中一个class如今不再需要另一个class的特性。 去除不必要的关联(association)。动机(Motivation)双向关联(bidirectional associations)很有用,但你也必须为它付出代价,那就是「维护双向连接、确保对象被正确创建和删除」而增加的复杂度。而且,由于很多程序 员并不习惯使用双向关联,它往往成为错转载 2013-05-07 08:53:30 · 1185 阅读 · 0 评论 -
重新组织数据之二 :Replace Data Value with Object(以对象取代数据值)
你有一笔数据项(data item),需要额外的数据和行为。 将这笔数据项变成一个对象。动机(Motivation)开发初期,你往往决定以简单的数据项(data item)表示简单的行为。但是,随着开发的进行,你可能会发现,这些简单数据项不再那么简单了。比如说,一开始你可能会用一个字符串来表示「电话号码」概念,但是随后你就会发现,电话号码需要「格式化」、「抽取区号」转载 2013-05-06 17:10:39 · 801 阅读 · 0 评论 -
重新组织数据之十一 :Encapsulate Collection(封装群集)
有个函数(method)返回一个群集(collection)。让这个函数返回该群集的一个只读映件(read-only view),并在这个class中提供「添加/移除」(add/remove)群集元素的函数。动机(Motivation)class常常会使用群集(collection,可能是array、list、set或vector)来保存一组实体。这样的class通转载 2013-05-07 08:59:49 · 996 阅读 · 0 评论 -
重新组织数据之六 :Duplicate Observed Data(复制「被监视数据」)
(译注:本节大量保留domain,presentation,event,getter/setter,observed等字眼。所谓presentation class,用以处理「数据表现形式」;所谓domain class,用以处理业务逻辑。)你有一些domain class置身于GUI控件中,而domain method需要访问之。将该笔数据拷贝到一个domain object中。转载 2013-05-07 08:48:52 · 870 阅读 · 0 评论 -
重新组织数据之四 :Change Reference to Value(将引用对象改为实值对象)
你有一个reference object(引用对象),很小且不可变(immutable),而且不易管理。将它变成一个value object(实值对象)。动机(Motivation)正如我在Change Reference to Value 中所说,要在reference object和value object之间做选择,有时并不容易。作出选择后,你常会需要一条转载 2013-05-06 17:15:15 · 1000 阅读 · 0 评论