您的位置:首页 > 编程语言

步步为营 .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代码重构学习笔记十三
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐