IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]使用面向对象重构之-把抽象控制在一处:提高内聚性

    csharp25发表于 2017-03-02 00:14:16
    love 0
    承接上文 使用面向对象重构之-使用接口抽象完成不同维度的扩展。
    本文所介绍的内容可能不是面向对象编程所特有的,在其他编程(函数式或过程式)中也会常用的技巧——使用统一的抽象。上文遗留的问题就是,太多类型的Staff要创建:
    public class StaffBase{
    	...
    }
    public class LocalStaff :StaffBase{
    	public Staff(ITransportClaim transportClaimProvider){
    		...
    	}
    }
    public class OTStaff: LocalStaff{
    	public class OTStaff(ITransportClaim transportClaimProvider, IOverTimeFoodClaim otClaimProvider): base(transportClaimProvider){
    		...		
    	}
    }
    public class TravelStaff :StaffBase{
    	public class TravelStaff(ITravelClaim travelClaimProvider){
    	
    	}
    }




    问题来了,哪个类要做这件事情?如果没有类来做这件事情的话,将会所有调用者的责任,即创建对象的代码(new XXStaff())将会到处都是。这看起来并不是我们想要的。一种普遍的方案就是使用工厂模式来统一管理对象的创建。
    ...
    public interface IStaffFactory<T> where T: StaffBase{
    	T CreateStaff();
    }
    public class StaffFactory: IStaffFactory<LocalStaff>{
    	public LocalStaff CreateStaff();
    }
    public class TravelStaff: IStaffFactory<TravelStaff>{
    	public TravelStaff CreateStaff();
    }
    
    
    ...




    本文只是以对象的创建为例,来说明一个重要的原则:信息的统一管理,即确保每件事只在一个地方做,可以是行为或是数据。DRY和information expert原则其实是相辅相成的,当代码重复时,就意味要创建抽象来集中管理某信息;当代码缺乏集中信息管理时,就难免出现重复(调用)。


沪ICP备19023445号-2号
友情链接