步步为营 .NET 代码重构学习笔记 十四
2011-06-06 16:58
776 查看
一、FormTempllateMethod(塑造模板函数)
动机(Motivation)
有一些subclasses,其中相应的某些函数以相同顺序执行类似的措施,但各措施实际上有所不同。将各个措施分别放进独立函数中,并保持它们都有相同的签名式(signature),于是原函数也就变得相同了。然后将原函数上移至baseclass。
示例
publicabstractclassSite
{
privatedouble_unit;
privatedouble_rate;
privatedouble_taxRate;
publicdoubleTaxRate
{
get{return_taxRate;}
set{_taxRate=value;}
}
publicdoubleUnit
{
get{return_unit;}
set{_unit=value;}
}
publicdoubleRate
{
get{return_rate;}
set{_rate=value;}
}
}
publicclassResidentialSite:Site
{
publicdoubleGetBillableAmount()
{
doublebaseAmount=Unit*Rate;
doubletax=baseAmount*TaxRate;
returnbasePrice+tax;
}
}
publicclassLifeLineSite:Site
{
publicdoubleGetBillableAmount()
{
doublebaseAmount=Unit*Rate*0.5;
doubletax=baseAmount*TaxRate*0.2;
returnbasePrice+tax;
}
}
改为
publicabstractclassSite
{
privatedouble_unit;
privatedouble_rate;
privatedouble_taxRate;
publicdoubleTaxRate
{
get{return_taxRate;}
set{_taxRate=value;}
}
publicdoubleUnit
{
get{return_unit;}
set{_unit=value;}
}
publicdoubleRate
{
get{return_rate;}
set{_rate=value;}
}
publicabstractdoubleGetBaseAmount();
publicabstractdoubleGetTaxAmount();
publicdoubleGetBillAbleAmount()
{
returnGetBaseAmount()+GetTaxAmount();
}
}
publicclassResidentialSite:Site
{
publicoverridedoubleGetBaseAmount()
{
returnUnit*Rate;
}
publicoverridedoubleGetTaxAmount()
{
returnbaseAmount*TaxRate;;
}
}
publicclassLifeLineSite:Site
{
publicoverridedoubleGetBaseAmount()
{
returnUnit*Rate*0.5;
}
publicoverridedoubleGetTaxAmount()
{
returnbaseAmount*TaxRate*0.2;
}
}
二、ReplaceInheritancewithDelegation(以委托取代继承)
动机(Motivation)
某个subclass只使用superclass接口中的一部分,或是根本不需要继承而来的数据。在subclass中新建一个值域用以保存superclass;调整subclass函数,令它改而委托superclass;然后去掉两者之间的继承关系。
示例
publicclassVector
{
publicintSize()
{
return100;
}
publicboolIsEmpte()
{
returnfalse;
}
}
publicclassMyStack:Vector
{
}
改为
publicclassVector
{
publicintSize()
{
return100;
}
publicboolIsEmpty()
{
returnfalse;
}
}
publicclassMyStack
{
privateVector_vector;
publicintSize()
{
return_vector.Size();
}
}
三、ReplaceDelegationwithInheritance(以继承取代委托)
动机(Motivation)
如果发现自己需要使用委托class中的所有函数,并且费了很大力气编写所有极简的请托函数(delegatingmethods),请回头使用继承。
示例
publicclassVector
{
publicintSize()
{
return100;
}
publicboolIsEmpty()
{
returnfalse;
}
}
publicclassMyStack
{
privateVector_vector;
publicintSize()
{
return_vector.Size();
}
publicboolIsEmpty()
{
return_vector.IsEmpty();
}
}
改为
publicclassVector
{
publicintSize()
{
return100;
}
publicboolIsEmpte()
{
returnfalse;
}
}
publicclassMyStack:Vector
{
}
四、TeaseApartInheritance(梳理并分解继承体系)
动机(Motivation)
某个继承体系(inheritancehierarchy)同时承担两项责任。建立两个继承体系,并通过委托关系(delegation)让其中一个可以调用另一个。
示例
改为
五、ConvertProceduralDesigntoObjects(将过程化设计转化为对象设计)
动机(Motivation)
有一些代码,以传统的过程化风格(proceduralstyle)写就。将数据记录(datarecords)变成对象,将形为分开,并将行为移入相关对象之中。
示例
改为
六、SeparateDomainfromPresentation(将领域和表述/显示分离)
动机(Motivation)
某些GUIclasses之中包含了domainlogic(领域逻辑)。将domainlogic(领域逻辑)分离出来,为它们建立独立的domainclasses。
示例
改为
七、ExtractHierarchy(提炼继承体系)
动机(Motivation)
有某个class做了大多工作,其中一部分工作是以大量条件式完成的。建立继承体系,以一个subclass表示一种特殊情况。
示例
改为
步步为营.NET代码重构学习笔记系列
步步为营.NET代码重构学习笔记一、为何要代码重构
步步为营.NET代码重构学习笔记二、提炼方法(ExtractMethod)
步步为营.NET代码重构学习笔记三、内联方法(InlineMethod)
步步为营.NET代码重构学习笔记四、临时变量(TemporaryVariable)
步步为营.NET代码重构学习笔记五、分解函数和替换算法(ReplaceMethodAndSubstituteAlgorithm)
步步为营.NET代码重构学习笔记六、移动函数和移动值域(MoveMethodAndMoveField)
步步为营.NET代码重构学习笔记七
步步为营.NET代码重构学习笔记八
步步为营.NET代码重构学习笔记九
步步为营.NET代码重构学习笔记十
步步为营.NET代码重构学习笔记十一
步步为营.NET代码重构学习笔记十二
步步为营.NET代码重构学习笔记十三
动机(Motivation)
有一些subclasses,其中相应的某些函数以相同顺序执行类似的措施,但各措施实际上有所不同。将各个措施分别放进独立函数中,并保持它们都有相同的签名式(signature),于是原函数也就变得相同了。然后将原函数上移至baseclass。
示例
改为
二、ReplaceInheritancewithDelegation(以委托取代继承)
动机(Motivation)
某个subclass只使用superclass接口中的一部分,或是根本不需要继承而来的数据。在subclass中新建一个值域用以保存superclass;调整subclass函数,令它改而委托superclass;然后去掉两者之间的继承关系。
示例
改为
三、ReplaceDelegationwithInheritance(以继承取代委托)
动机(Motivation)
如果发现自己需要使用委托class中的所有函数,并且费了很大力气编写所有极简的请托函数(delegatingmethods),请回头使用继承。
示例
改为
四、TeaseApartInheritance(梳理并分解继承体系)
动机(Motivation)
某个继承体系(inheritancehierarchy)同时承担两项责任。建立两个继承体系,并通过委托关系(delegation)让其中一个可以调用另一个。
示例
改为
五、ConvertProceduralDesigntoObjects(将过程化设计转化为对象设计)
动机(Motivation)
有一些代码,以传统的过程化风格(proceduralstyle)写就。将数据记录(datarecords)变成对象,将形为分开,并将行为移入相关对象之中。
示例
改为
六、SeparateDomainfromPresentation(将领域和表述/显示分离)
动机(Motivation)
某些GUIclasses之中包含了domainlogic(领域逻辑)。将domainlogic(领域逻辑)分离出来,为它们建立独立的domainclasses。
示例
改为
七、ExtractHierarchy(提炼继承体系)
动机(Motivation)
有某个class做了大多工作,其中一部分工作是以大量条件式完成的。建立继承体系,以一个subclass表示一种特殊情况。
示例
改为
步步为营.NET代码重构学习笔记系列
相关文章推荐
- 步步为营 .NET 代码重构学习笔记 十四
- 步步为营 .NET 代码重构学习笔记 七
- 步步为营 .NET 代码重构学习笔记 十三
- 步步为营 .NET 代码重构学习笔记 三、内联方法(Inline Method)
- 步步为营 .NET 代码重构学习笔记 五、分解函数和替换算法(Replace Method And Substitute Algorithm)
- 步步为营 .NET 代码重构学习笔记 一、为何要代码重构
- 步步为营 .NET 代码重构学习笔记 一、为何要代码重构
- 步步为营 .NET 代码重构学习笔记 一、为何要代码重构
- 步步为营 .NET 代码重构学习笔记 二、提炼方法(Extract Method)
- 步步为营 .NET 代码重构学习笔记 五、移动函数和移动值域(Move Method And Move Field)
- 步步为营 .NET 代码重构学习笔记 二、提炼方法(Extract Method)
- 步步为营 .NET 代码重构学习笔记 四、临时变量(Temporary Variable)
- 步步为营 .NET 代码重构学习笔记 六、移动函数和移动值域(Move Method And Move Field)
- 步步为营 .NET 代码重构学习笔记 四、分解函数和替换算法(Replace Method And Substitute Algorithm)
- [转]步步为营 .NET 代码重构学习笔记 一、为何要代码重构
- 步步为营 .NET 代码重构学习笔记 八
- 步步为营 .NET 代码重构学习笔记 三、内联方法(Inline Method)
- 步步为营 .NET 代码重构学习笔记 十二
- 步步为营 .NET 代码重构学习笔记 二、提炼方法(Extract Method)
- 步步为营 .NET 代码重构学习笔记 六