步步为营 .NET 代码重构学习笔记 十四

一、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)让其中一个可以调用另一个。

示例

image

改为

image

五、Convert Procedural Design to Objects(将过程化设计转化为对象设计)

动机(Motivation)

有一些代码,以传统的过程化风格(procedural style)写就。将数据记录(data records)变成对象,将形为分开,并将行为移入相关对象之中。

示例

image

改为

image

 

 

六、Separate Domain from Presentation(将领域和表述/显示分离)

动机(Motivation)

某些GUI classes之中包含了domain logic(领域逻辑)。将domain logic(领域逻辑)分离出来,为它们建立独立的domain classes。

示例

image

改为

image

 

七、Extract Hierarchy(提炼继承体系)

动机(Motivation)

有某个class做了大多工作,其中一部分工作是以大量条件式完成的。建立继承体系,以一个subclass表示一种特殊情况。

示例

image

改为

image

 

 

 

步步为营 .NET 代码重构学习笔记系列

步步为营 .NET 代码重构学习笔记 一、为何要代码重构

步步为营 .NET 代码重构学习笔记 二、提炼方法(Extract Method)

步步为营 .NET 代码重构学习笔记 三、内联方法(Inline Method)

步步为营 .NET 代码重构学习笔记 四、临时变量(Temporary Variable)

步步为营 .NET 代码重构学习笔记 五、分解函数和替换算法(Replace Method And Substitute Algorithm)

步步为营 .NET 代码重构学习笔记 六、移动函数和移动值域(Move Method And Move Field)

步步为营 .NET 代码重构学习笔记 七

步步为营 .NET 代码重构学习笔记 八

步步为营 .NET 代码重构学习笔记 九

步步为营 .NET 代码重构学习笔记 十

步步为营 .NET 代码重构学习笔记 十一

步步为营 .NET 代码重构学习笔记 十二

步步为营 .NET 代码重构学习笔记 十三

posted @ 2011-06-06 16:58  spring yang  阅读(1503)  评论(0编辑  收藏  举报