重构方法
文章平均质量分 72
bendan999999999
这个作者很懒,什么都没留下…
展开
-
Extract Method( 提炼函数 )
Extract Method( 提炼函数 ) void printOwing(double amount){ printBanner(); //print details System.out.println( "name:" + _name); System.out.println( "amount" + amount );}==>void printOwing(double a原创 2007-08-08 16:11:00 · 920 阅读 · 0 评论 -
Replace Array with Object(以对象取代数组)
你有一个数组(array),其中的元素各自代表不同的东西。 以对象替换数组。对于数组中的每个元素,以一个值域表示之。 String[] row = new String[3];row[0] = "Livepool";row[1] = "15"; ==〉 Performance row = new Performance();row.setName("Livepool转载 2009-01-21 13:22:00 · 676 阅读 · 0 评论 -
Duplicate Observed Data(复制被监视数据)
注:所谓presentation class,用以处理[数据表现形式];所谓domain class,用以处理业务逻辑。你有一些domain data置身于GUI控件中,而domain method需要访问之。将该笔数据拷贝一个domain object中。建立一个Observer模式,用以对domain object和GUI object内的重复数据进行同步控制(sync.)。转载 2009-01-22 12:32:00 · 927 阅读 · 0 评论 -
Replace Magic Number with Symbolic Constant(以符号常量/字面常量取代魔法数)
你有一个字面数值(literal number),带有特殊含义创造一个常量,根据其意义为它命名,并将上述的字面数值替换为这个常量.double potentialEnergy(double mass, double height) { return mass * 9.81 * height;}==〉double potentialEnergy(double mass, doub转载 2009-02-02 09:13:00 · 1047 阅读 · 0 评论 -
Change Unidirectional Association to Bidirectional(将单向关联改为双向)
两个classes都需要使用对方特性,但其间只有一条单向连接(one-way link)。添加一个反向,并使修改函数(modifiers)能够同时更新两条连接。(注译:这里的指针等同于句柄(handle),修改函数(modifier)指的是改变双方关系者) 动机开发初期,你可能会在两个classes之间建立一条单向连接,使其中一个class可以引用另一个class.随着时间推移,你可能转载 2009-01-23 10:14:00 · 868 阅读 · 0 评论 -
Change Bidirectional Association to Unidirectional(将双向关联改为单向)
两个classes之间有双向关联,但其中一个class如今不再需要另一个class的特性.去除不必要的关联(association). 动机双向关联(bidirectional associations)很有用,但你也必须为它付出代价,那就是[维护双向链接,确保对象被正确创建和删除]而增加的复杂度.而且,由于很多程序员并不习惯使用双向关联,它往往成为错误之源.大量的双向连接(two-w转载 2009-01-24 09:03:00 · 701 阅读 · 0 评论 -
Encapsulate Collection(封装群集)
有个函数(method)返回一个群集(collection).让这个函数返回该群集的一个只读映件(read-only view),并在这个class中提供[添加/移除](add/remove)群集元素的函数. Person... getCourse() :Set setCourse(Set) ==> Person getCourse() : Un转载 2009-02-04 16:05:00 · 1452 阅读 · 0 评论 -
Replace Type Code with Class(以类取代型别码)
class 中有一个数值型别码,但它不影响class的行为以一个新的class替换该数值型别码。class Person ...public static final int O = 0;public static final int A = 1;public static final int B = 2;public static final int AB = 3;private int原创 2009-02-06 09:24:00 · 1056 阅读 · 0 评论 -
Replace Type Code with Subclasses(以子类取代型别码)
你有一个不可变得type code,它会影响类的行为。以一个子类取代这个type code。动机如果一个type code不会影响行为,你可以使用Replace Type Code with Class;但是,如果一个type code会影响行为,最好的办法就是借助多态来处理变化的行为。一般来说,这种情况的标志就是条件表达式。可能是switch或者if-else。但是,无论哪种原创 2009-02-09 09:04:00 · 1685 阅读 · 1 评论 -
Replace Record with Data Class(以数据类取代记录 )
需要面对传统编程环境中的记录结构。为该记录创建一个哑数据对象。动机需要面对一个老的程序,需要通过API和记录结构交流。或者处理从数据库中读出的记录。创建一个接口类,用来处理这些数据。最简单的做法先建立一个类似外部记录的类,以便日后将某些值域和函数搬移到这个类。还有一种情况,数组中的每个元素都有特定的意义,应该使用Replace Array with Object[以对象取代数组]转载 2009-02-05 10:28:00 · 810 阅读 · 1 评论 -
Decompose Conditional(分解条件式 )
有一个复杂的(if-then-else)语句。从if-then-else三个段落中分别提炼出独立的函数f(date.before(SUMMER_START) || date.after(SUMMER_END)) charge=quantity*_winterRate+_winterServiceCharge;else charge=quantity*_summerRate;==转载 2009-02-13 09:29:00 · 925 阅读 · 0 评论 -
Replace Type Code with State/Strategy(以State/Strategy取代型别码)
你有一个type code,它会影响class的行为,但你无法使用subclassing.以state object(专门用来描述状态的对象)取代type code。动机本项重构和Replace Type Code with Subclasses很相似。但如果[type code值在对象生命期中发生变化],或者[其他原因使得宿主类不能被subclassing],你也可以使用本重构。原创 2009-02-11 14:22:00 · 2014 阅读 · 0 评论 -
Consolidate Conditional Expression(合并条件式)
你有一系列条件测试,都得到相同结果。将这些测试合并为一个条件式,并将这个条件式提炼成为一个独立函数。double disabilityAmount() {if (_seniority if (_monthsDisabled > 12) return 0;if (_isPartTime) return 0;// compute the disability amount==〉doub原创 2009-02-13 14:53:00 · 820 阅读 · 0 评论 -
Replace Subclass with Fields(以值域取代子类)
你的各个class的唯一差别只在[返回常量数据]的函数身上。修改这些函数,使它们返回superclass中的某个(新增)值域,然后销毁subclasses。 动机建立subclass的目的,是为了增加新特性或变化其行为。有一种变化行为称为常量函数,它们会返回硬编码值。这东西有其用途,你可以对不同的subclass中的同一个访问函数返回不同的值,你可以在superclass中将原创 2009-02-12 16:02:00 · 607 阅读 · 0 评论 -
Remove Control Flag(移除控制标记)
在一系列表达式中,某个变量带有控制标记的作用以break语句或return语句取代控制标记动机在一系列条件表达式中,你常常会用到[用以何时停止条件检查]的控制标记。set done to falsewhile not doneif (condition)do somethingset done to truenext step of loop这样的控制标记带来的麻烦超过了它所带原创 2009-02-17 11:08:00 · 1484 阅读 · 0 评论 -
Consolidate Duplicate Conditional Fragments(合并重复的条件片断)
在条件式的每个分支上有着相同一段的代码。将这段重复代码搬移到条件式之外。if (isSpecialDeal()) {total = price * 0.95;send();}else {total = price * 0.98;send();}if (isSpecialDeal())total = price * 0.95;elsetotal = price * 0.98;send();原创 2009-02-16 10:30:00 · 567 阅读 · 0 评论 -
Introduce Null Object(引入Null对象)
需要再三检查某物是否为null value。将null value (无效值)替换为 null object(无效对象)。if (customer == null) plan = BillingPlan.basic();else plan = customer.getPlan();==〉动机多态的最根本好处是不必再向对象询问你是什么类型,而后根据答案调用对象的某个行为,你只转载 2009-02-19 17:14:00 · 1895 阅读 · 2 评论 -
Change Reference to Value(将引用对象改变为实值对象)
你有一个reference object(引用对象),很小且不可变(immutable),而且不易管理。将它变成一个value object(实值对象)。 动机在分布系统和并发系统中,不可变的value object特别有用,因为你不须考虑它们的同步问题。value object有一个非常重要的特性:它们应该是不可变的(immutable)。无论何时只要你调用同一个对象的同一个查询转载 2009-01-20 09:47:00 · 955 阅读 · 0 评论 -
Change Value to Reference(将实值对象改为引用对象)
你有一个class,衍生出许多相等实体(equal instances),你希望将它们替换为单一对象。将这个value object(实值对象)变成一个reference object(引用对象)。 动机在许多系统中,你都可以对对象做一个有用的分类:reference object和value objects。前者就像[客户]、[帐户]这样的东西,每个对象都代表真实世界中的一个实物,你转载 2009-01-19 09:42:00 · 1865 阅读 · 0 评论 -
Inline Method(将函数内联化)
int getRation(){ return ( moreThanFiveLateDeliveries() ) ? 2 : 1;}boolean moreThanFiveLateDeliveries(){ return _numberOfLateDeliveries > 5;}==>int getRatiog(){ return ( _numberOfLateDeliveries原创 2007-08-09 09:58:00 · 1147 阅读 · 2 评论 -
Inline Temp( 将临时变量内联化 )
Inline Temp( 将临时变量内联化 )double basePrice = anOrder.basePrice();return ( basePrice > 1000 )==>return ( anOrder.basePrice() > 1000 )一、动机Inline Temp多半是作为Replace Temp with Query的一部分来使用。二、作法1、如果这个原创 2007-08-10 09:18:00 · 808 阅读 · 1 评论 -
Split Temporary Variable(剖解临时变量)
double temp = 2 * (_height + _widgth); System.out.println(temp); temp = _height * _widgth; System.out.println(temp);==〉final double perimeter = 2 * (_height + _widgth); System.out.printl转载 2008-11-05 08:55:00 · 682 阅读 · 0 评论 -
Remove Assignment to Parameters(移除对参数的赋值动作)
int discount(int inputVal, int quantity, int yearToDate) { if(inputVal > 50) inputVal -= 2;==〉int discount(int inputVal, int quantity, int yearToDate) { int result = inputVal; if(inputVal >转载 2008-11-06 12:27:00 · 1254 阅读 · 0 评论 -
Replace Temp With Query(以查询取代临时变量)
double basePrice = _quantity * _itemPrice;if(basePrice > 1000) return basePrice * 0.95;else return basePrice * 0.98; ==> if(basePrice() > 1000) return basePrice() * 0.95;else return ba转载 2008-11-03 16:36:00 · 904 阅读 · 0 评论 -
Introduce Explaining Variable(引入解释性变量)
if((platform.toUpperCase().indexOf("MAC") > -1) && (brower.toUpperCase().indexOf("IE") > -1) && wasInitialized() && resize > 0){ //do something}==>final boolean isMacOs = platform.toUpperCase().转载 2008-11-04 09:39:00 · 728 阅读 · 0 评论 -
Replace Method with Method Object(以函数对象取代函数)
class Order... double price() { double primaryBasePrice; double secondaryBasePrice; double tertiaryBasePrice; // long computation; ... }动机我在本书中不断向读者强调小型函数的优美动人转载 2008-11-08 14:49:00 · 2289 阅读 · 0 评论 -
Substitute Algorithm(替换你的算法)
String foundPerson(String[] people) { for(int i = 0; i if(people[i].equals("Don")) { return "Don"; } if(people[i].equals("John")) { return "John"; }转载 2009-01-05 09:57:00 · 766 阅读 · 0 评论 -
Move Method(搬移函数)
你的程序中,有个函数与其所驻class之外的另一个class进行更多交流:调用后者,或被后者调用。在该函数最常引用(指涉)的class中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数(delegating method),或者将旧函数完全移除。class class1{ public void aMethod(){...}}class class2{}转载 2009-01-05 10:30:00 · 993 阅读 · 0 评论 -
Move Field(搬移值域)
你的程序中,某个field(值域)被其所驻class之外的另一个class更多地用到。在target class建立一个new field,修改source field的所有用户,令它们改用new field。 class class1{ private int aField;}class class2{} ==>class class1{}c转载 2009-01-06 09:03:00 · 818 阅读 · 0 评论 -
Extract Class(提炼类)
某个class做了应该由两个class做的事. 建立一个新class,将相关的值域和函数从旧class搬移到新class。 class Person.. private String _name; private String _officeAreaCode; private String _officeNumber; public String g转载 2009-01-07 10:54:00 · 953 阅读 · 0 评论 -
Hide Delegate(隐藏委托关系)
客户直接调用其server object(服务对象)的delegate class。 在server端(某个class)建立客户所需的所有函数,用以隐藏委托关系(delegation)。 Client--〉Person | |Department ==〉 Client --〉Person--〉Department 动机 如果某个客户转载 2009-01-09 15:24:00 · 1434 阅读 · 0 评论 -
Inline Class(将类内联化)
你的某个class没有做太多事情(没有承担足够责任)。 将class的所有特性搬移到另一个class中,然后移除原class。 class Person... private string _name; public string getTelephoneNumber(); private TelephoneNumber _officeTelephone;class Telep转载 2009-01-08 08:57:00 · 1671 阅读 · 0 评论 -
Introduce Foreign Method(引入外加函数)
你所使用的server class需要一个额外函数,但你无法修改这个class。在client class中建立一个函数,并以一个server class实体作为第一引数(argument)。 Date newStart = new Date(previousEnd.getYear(), previousEnd.getMonth(), previousEnd.getDate() + 1转载 2009-01-12 09:10:00 · 1103 阅读 · 0 评论 -
Introduce Local Extension(引入本地扩展)
你所使用的server class需要一些额外函数,但你无法修改这个class。建立一个新class,使它包含这些额外函数。让这个扩展品成为source class的subclass(子类)或wrapper(外覆类)。Client Class... private nextDate(Date):Date ==>MfDate... public MfD转载 2009-01-13 09:30:00 · 878 阅读 · 0 评论 -
Self Encapsulate Field(自封装值域)
你直接访问一个值域(field),但与值域之间的耦合关系逐渐变得笨拙。为这个值域建立取值/设值函数(getting/setting methods),并且只以这些函数来访问值域。 private int _low, _high;boolean includes(int arg) { return arg >= _low && arg }==〉 private int转载 2009-01-14 09:11:00 · 671 阅读 · 0 评论 -
Replace Data Value with Object(以对象取代数据值)
你有一笔数据项(data item),需要额外的数据和行为。 将这笔数据项变成一个对象。 class Order... private string customer;==>class Order... private Customer _customer;class Customer... private string _name; 动机一开始你可能会用一转载 2009-01-15 09:09:00 · 1056 阅读 · 0 评论 -
Replace Conditional with Polymorphism(以多态取代条件式)
你手上有个条件式,它根据对象型别的不同而选择不同的行为。将这个条件式的每个分支放进一个subclass内的覆写函数中,然后将原始函数声明为抽象函数。double getSpeed() {switch (_type) {case EUROPEAN:return getBaseSpeed();case AFRICAN:return getBaseSpeed() - getLoadFactor(原创 2009-02-18 14:11:00 · 1671 阅读 · 1 评论