承接上文 使用面向对象重构之-使用接口抽象完成不同维度的扩展。
本文所介绍的内容可能不是面向对象编程所特有的,在其他编程(函数式或过程式)中也会常用的技巧——使用统一的抽象。上文遗留的问题就是,太多类型的Staff要创建:
本文所介绍的内容可能不是面向对象编程所特有的,在其他编程(函数式或过程式)中也会常用的技巧——使用统一的抽象。上文遗留的问题就是,太多类型的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原则其实是相辅相成的,当代码重复时,就意味要创建抽象来集中管理某信息;当代码缺乏集中信息管理时,就难免出现重复(调用)。