一、Form Templlate Method(塑造模板函数)
动机(Motivation)
有一些subclasses,其中相应的某些函数以相同顺序执行类似的措施,但各措施实际上有所不同。将各个措施分别放进独立函数中,并保持它们都有相同的签名式(signature),于是原函数也就变得相同了。然后将原函数上移至baseclass。
示例
public abstract class Site
{
private double _unit;
private double _rate;
private double _taxRate;
public double TaxRate
{
get { return _taxRate; }
set { _taxRate = value; }
}
public double Unit
{
get { return _unit; }
set { _unit = value; }
}
public double Rate
{
get { return _rate; }
set { _rate = value; }
}
}
public class ResidentialSite : Site
{
public double GetBillableAmount()
{
double baseAmount = Unit * Rate;
double tax = baseAmount * TaxRate;
return basePrice + tax;
}
}
public class LifeLineSite : Site
{
public double GetBillableAmount()
{
double baseAmount = Unit * Rate*0.5;
double tax = baseAmount * TaxRate*0.2;
return basePrice + tax;
}
}
改为
public abstract class Site
{
private double _unit;
private double _rate;
private double _taxRate;
public double TaxRate
{
get { return _taxRate; }
set { _taxRate = value; }
}
public double Unit
{
get { return _unit; }
set { _unit = value; }
}
public double Rate
{
get { return _rate; }
set { _rate = value; }
}
public abstract double GetBaseAmount();
public abstract double GetTaxAmount();
public double GetBillAbleAmount()
{
return GetBaseAmount() + GetTaxAmount();
}
}
public class ResidentialSite : Site
{
public override double GetBaseAmount()
{
return Unit * Rate;
}
public override double GetTaxAmount()
{
return baseAmount * TaxRate; ;
}
}
public class LifeLineSite : Site
{
public override double GetBaseAmount()
{
return Unit * Rate * 0.5;
}
public override double GetTaxAmount()
{
return baseAmount * TaxRate * 0.2;
}
}
二、Replace Inheritance with Delegation(以委托取代继承)
动机(Motivation)
某个subclass只使用superclass接口中的一部分,或是根本不需要继承而来的数据。在subclass中新建一个值域用以保存superclass;调整subclass函数,令它改而委托superclass;然后去掉两者之间的继承关系。
示例
public class Vector
{
public int Size()
{
return 100;
}
public bool IsEmpte()
{
return false;
}
}
public class MyStack : Vector
{
}
改为
public class Vector
{
public int Size()
{
return 100;
}
public bool IsEmpty()
{
return false;
}
}
public class MyStack
{
private Vector _vector;
public int Size()
{
return _vector.Size();
}
}
三、Replace Delegation with Inheritance(以继承取代委托)
动机(Motivation)
如果发现自己需要使用委托class中的所有函数,并且费了很大力气编写所有极简的请托函数(delegating methods),请回头使用继承。
示例
public class Vector
{
public int Size()
{
return 100;
}
public bool IsEmpty()
{
return false;
}
}
public class MyStack
{
private Vector _vector;
public int Size()
{
return _vector.Size();
}
public bool IsEmpty()
{
return _vector.IsEmpty();
}
}
改为
public class Vector
{
public int Size()
{
return 100;
}
public bool IsEmpte()
{
return false;
}
}
public class MyStack : Vector
{
}
四、Tease Apart Inheritance(梳理并分解继承体系)
动机(Motivation)
某个继承体系(inheritance hierarchy)同时承担两项责任。建立两个继承体系,并通过委托关系(delegation)让其中一个可以调用另一个。
示例
改为
五、Convert Procedural Design to Objects(将过程化设计转化为对象设计)
动机(Motivation)
有一些代码,以传统的过程化风格(procedural style)写就。将数据记录(data records)变成对象,将形为分开,并将行为移入相关对象之中。
示例
改为
六、Separate Domain from Presentation(将领域和表述/显示分离)
动机(Motivation)
某些GUI classes之中包含了domain logic(领域逻辑)。将domain logic(领域逻辑)分离出来,为它们建立独立的domain classes。
示例
改为
七、Extract Hierarchy(提炼继承体系)
动机(Motivation)
有某个class做了大多工作,其中一部分工作是以大量条件式完成的。建立继承体系,以一个subclass表示一种特殊情况。
示例
改为
步步为营 .NET 代码重构学习笔记系列
步步为营 .NET 代码重构学习笔记 二、提炼方法(Extract Method)
步步为营 .NET 代码重构学习笔记 三、内联方法(Inline Method)
步步为营 .NET 代码重构学习笔记 四、临时变量(Temporary Variable)
步步为营 .NET 代码重构学习笔记 五、分解函数和替换算法(Replace Method And Substitute Algorithm)