Refactoring--Pull Up /Push Down Method or Field

复制代码
// 重构前代码说明:
//Pull Up Method
//Pulling it up in the inheritance chain when a method needs to be used by multiple implementers

    
    
/// <summary>
    
/// 交通工具
    
/// </summary>
    public abstract class Vehicle
    {
       
// other methods
    }


    
/// <summary>
    
/// 小车
    
/// </summary>
    public class Car : Vehicle
    {
        
public void Turn(Direction direction)
        {
             
// code here
        }
     }

    
/// <summary>
    
/// 摩托车
    
/// </summary>
     public class Motorcycle : Vehicle
     {

     }

    
/// <summary>
    
/// 方向
    
/// </summary>
     public enum Direction
     {
         Left,
         Right
     }
复制代码

重构后代码:

复制代码
代码
    /// <summary>
    
/// 交通工具
    
/// </summary>
    public abstract class Vehicle
    {
        
public void Turn(Direction direction)
        {
            
// code here
        }
    }

/// <summary>
    
/// 小车
    
/// </summary>
    public class Car : Vehicle
    {
        
// other methods
    }

    
/// <summary>
    
/// 摩托车
    
/// </summary>
     public class Motorcycle : Vehicle
     {
         
// other methods
     }

    
/// <summary>
    
/// 方向
    
/// </summary>
     public enum Direction
     {
         Left,
         Right
     }
复制代码

 

看上去很自然,但有时候在实际code的时候,新增,修改过程中却往往容易破坏这个规则。

同样,只在继承链的一个子类中使用的方法,就要考虑push down 了!

 

复制代码
代码
// 重构前代码说明:
//Push Down Method
//Push it Down in the inheritance chain when a method only one sub-class to be used by implementer

    
    
public abstract class Animal
    {
        
//犬吠
        public void Bark()
        {
        
//很明显其他动物是不会吠的,only dog
        
// code to bark
        }
    }

     
public class Dog : Animal
     {
     }

     
public class Cat : Animal
     {
     }
复制代码

 

这样重构也很自然了,注:当一个抽象类没有任何方法的时候你是否考虑将其转换到接口?没有任何方法和属性的接口即标识接口(marker interface)。标识接口没有具体语义,只是对统一类对象的一个标识却没有相同的方法,方便framework基本的统一处理。

 

方法的pull和push就这么简单和自然了,字段当然也是,只是这个意识需要加强。

 

posted @   go on coding  阅读(367)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
悠季瑜伽会馆
点击右上角即可分享
微信分享提示