步步为营 .NET 代码重构学习笔记 十四
时间:2011-06-06 来源:spring yang
一、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)