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


    一、Form Templlate Method(塑造模板函数)

    动机(Motivation)

    有一些subclasses,其中相应的某些函数以相同顺序执行类似的措施,但各措施实际上有所不同。将各个措施分别放进独立函数中,并保持它们都有相同的签名式(signature),于是原函数也就变得相同了。然后将原函数上移至baseclass。

    示例

    01 public abstract class Site
    02 {
    03     private double _unit;
    04     private double _rate;
    05     private double _taxRate;
    06  
    07     public double TaxRate
    08     {
    09         get return _taxRate; }
    10         set { _taxRate = value; }
    11     }
    12  
    13     public double Unit
    14     {
    15         get return _unit; }
    16         set { _unit = value; }
    17     }
    18  
    19     public double Rate
    20     {
    21         get return _rate; }
    22         set { _rate = value; }
    23     }
    24 }
    25  
    26 public class ResidentialSite : Site
    27 {
    28     public double GetBillableAmount()
    29     {
    30         double baseAmount = Unit * Rate;
    31         double tax = baseAmount * TaxRate;
    32         return basePrice + tax;
    33     }
    34 }
    35  
    36 public class LifeLineSite : Site
    37 {
    38     public double GetBillableAmount()
    39     {
    40         double baseAmount = Unit * Rate*0.5;
    41         double tax = baseAmount * TaxRate*0.2;
    42         return basePrice + tax;
    43     }
    44 }

    改为

    01 public abstract class Site
    02 {
    03     private double _unit;
    04     private double _rate;
    05     private double _taxRate;
    06  
    07     public double TaxRate
    08     {
    09         get return _taxRate; }
    10         set { _taxRate = value; }
    11     }
    12  
    13     public double Unit
    14     {
    15         get return _unit; }
    16         set { _unit = value; }
    17     }
    18  
    19     public double Rate
    20     {
    21         get return _rate; }
    22         set { _rate = value; }
    23     }
    24     public abstract double GetBaseAmount();
    25     public abstract double GetTaxAmount();
    26     public double GetBillAbleAmount()
    27     {
    28         return GetBaseAmount() + GetTaxAmount();
    29     }
    30      
    31 }
    32  
    33 public class ResidentialSite : Site
    34 {
    35     public override double GetBaseAmount()
    36     {
    37         return Unit * Rate;
    38     }
    39  
    40     public override double GetTaxAmount()
    41     {
    42         return baseAmount * TaxRate; ;
    43     }
    44 }
    45  
    46 public class LifeLineSite : Site
    47 {
    48     public override double GetBaseAmount()
    49     {
    50         return Unit * Rate * 0.5;
    51     }
    52  
    53     public override double GetTaxAmount()
    54     {
    55         return baseAmount * TaxRate * 0.2;
    56     }
    57 }

    二、Replace Inheritance with Delegation(以委托取代继承)

    动机(Motivation)

    某个subclass只使用superclass接口中的一部分,或是根本不需要继承而来的数据。在subclass中新建一个值域用以保存superclass;调整subclass函数,令它改而委托superclass;然后去掉两者之间的继承关系。

    示例

    01 public class Vector
    02 {
    03     public int Size()
    04     {
    05         return 100;
    06     }
    07  
    08     public bool IsEmpte()
    09     {
    10         return false;
    11     }
    12 }
    13  
    14 public class MyStack : Vector
    15 {
    16  
    17 }

    改为

    01 public class Vector
    02 {
    03     public int Size()
    04     {
    05         return 100;
    06     }
    07  
    08     public bool IsEmpty()
    09     {
    10         return false;
    11     }
    12 }
    13  
    14 public class MyStack
    15 {
    16     private Vector _vector;
    17  
    18     public int Size()
    19     {
    20         return _vector.Size();
    21     }
    22 }

    三、Replace Delegation with Inheritance(以继承取代委托)

    动机(Motivation)

    如果发现自己需要使用委托class中的所有函数,并且费了很大力气编写所有极简的请托函数(delegating methods),请回头使用继承。

    示例

    01 public class Vector
    02 {
    03     public int Size()
    04     {
    05         return 100;
    06     }
    07  
    08     public bool IsEmpty()
    09     {
    10         return false;
    11     }
    12 }
    13  
    14 public class MyStack
    15 {
    16     private Vector _vector;
    17  
    18     public int Size()
    19     {
    20         return _vector.Size();
    21     }
    22  
    23     public bool IsEmpty()
    24     {
    25         return _vector.IsEmpty();
    26     }
    27 }

    改为

    01 public class Vector
    02 {
    03     public int Size()
    04     {
    05         return 100;
    06     }
    07  
    08     public bool IsEmpte()
    09     {
    10         return false;
    11     }
    12 }
    13  
    14 public class MyStack : Vector
    15 {
    16  
    17 }
    1   
    1   
    1   

    四、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 代码重构学习笔记 十三

  • 相关阅读:
    Space for commit to queue couldn't be acquired
    数据埋点(浅谈埋点方式与上报收集)
    Hashed Indexes Geospatial Index
    线程安全 对StringBuilder抛出ArrayIndexOutOfBoundsException的探究
    [a,s]=[22,3]
    Flume-ng-sdk源码分析
    pstree
    将线上服务器生成的日志信息实时导入kafka,采用agent和collector分层传输,app的数据通过thrift传给agent,agent通过avro sink将数据发给collector,collector将数据汇集后,发送给kafka
    线程池 最大线程数
    es 300G 数据删除 执行计划 curl REST 操作
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2073918.html
Copyright © 2020-2023  润新知