使用面向对象重构之-使用接口抽象完成不同维度的扩展
来源:互联网 发布:婚礼现场互动软件 编辑:程序博客网 时间:2024/05/21 06:33
本文承接上文 使用面向对象重构之-使用接口完成行为抽象。
这次要面对的需求变化是报销流程不仅与员工类别相关,也与报销种类相关,每个报销种类的流程要去不同部门办理,流程差别较大,需要分别扩展。
车费分为打车费和公共交通;打车费需要小票而公共交通则不需要;加班可以报销晚餐;出差的人可以有出差补助,不同城市也有不同的流程。为了让代码体系适应这个需求,就需要引入新的抽象,让代码依赖这个新的抽象体系。
以下代码为之前的实现:
我们只是根据员工种类提供不同报销逻辑的provider,显然已经不够。现在需要进一步对抽象进行调整为:
接口和类接口基本定义好了。这样就完成了不同报销类别的横向扩展,可是出现了一个问题,staff种类变多了,创建责任就需要统一化,否则对象创建的位置不一,会降低程序的内聚性。这也是Information Expert原则所指出的,信息集中化。下一部分就会着重介绍统一对象创建的位置,以及提高程序内聚性的重要性。
这几个例子是比较极端的需求变更,通常建议project一开始就要规划清楚接口和类的结构,前期需求与代码结构的映射越匹配,所创建的抽象也就越稳定。
这次要面对的需求变化是报销流程不仅与员工类别相关,也与报销种类相关,每个报销种类的流程要去不同部门办理,流程差别较大,需要分别扩展。
车费分为打车费和公共交通;打车费需要小票而公共交通则不需要;加班可以报销晚餐;出差的人可以有出差补助,不同城市也有不同的流程。为了让代码体系适应这个需求,就需要引入新的抽象,让代码依赖这个新的抽象体系。
以下代码为之前的实现:
public interface IClaim { void Claim(); } public class StaffClaimProvider : IClaim { public void Claim() { throw new NotImplementedException(); } } public class SalesClaimProvider : IClaim { public void Claim() { throw new NotImplementedException(); } }
我们只是根据员工种类提供不同报销逻辑的provider,显然已经不够。现在需要进一步对抽象进行调整为:
public interface ITransportClaim{void ClaimTransport();}public class TaxiClaimProvider : ITransportClaim{public void ClaimTransport(){...}}public class PublicTrafficClaimProvider : ITransportClaim{public void ClaimTransport(){...}}public interface IOverTimeFoodClaim{void ClaimFood();}public class WorkOverTimeFoodClaimDefaultProvider: IOverTimeFoodClaim{public void ClaimFood(){...}}public class WorkOverTimeFoodClaimMidnightProvider: IOverTimeFoodClaim{public void ClaimFood(){...}}public interface ITravelClaim{void ClaimTravel();}public class TravelSameCountryClaimProvider:ITravelClaim{public void ClaimTravel();}public interface CrossCountryClaimProvider:ITravelClaim{public void ClaimTravel();}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){}}
接口和类接口基本定义好了。这样就完成了不同报销类别的横向扩展,可是出现了一个问题,staff种类变多了,创建责任就需要统一化,否则对象创建的位置不一,会降低程序的内聚性。这也是Information Expert原则所指出的,信息集中化。下一部分就会着重介绍统一对象创建的位置,以及提高程序内聚性的重要性。
这几个例子是比较极端的需求变更,通常建议project一开始就要规划清楚接口和类的结构,前期需求与代码结构的映射越匹配,所创建的抽象也就越稳定。
1 0
- 使用面向对象重构之-使用接口抽象完成不同维度的扩展
- 使用面向对象重构之-使用接口完成行为抽象
- 使用面向对象重构之-继承中的抽象—模板方法
- 使用面向对象重构之-把抽象控制在一处:提高内聚性
- php面向对象中抽象类与接口的使用:
- 使用面向对象重构之-依赖注入
- 面向对象高级——instanceof关键字的使用以及抽象类与接口的应用
- 使用面向对象重构之-从过程式设计到面向对象
- java面向对象思想之接口、抽象
- 面向对象之抽象、接口、多态
- 面向对象之抽象和接口
- 面向对象之抽象类、接口
- java面向对象之抽象, 接口
- Java面向对象接口的使用
- 面向接口、面向对象;接口、抽象类的理解
- 面向对象的抽象类与接口
- 使用Eclipse完成经典的重构
- 软件架构设计的三个维度 之 面向对象
- nginx配置详解
- hadoop学习笔记之初识hadoop hadoop单机版安装
- HDMI状态检测——学习笔记
- imprecise external abort
- 《统计学习方法》学习总结(未完待续)
- 使用面向对象重构之-使用接口抽象完成不同维度的扩展
- qt phonon 制作音乐播放器实现歌词和遮罩功能
- linux练习题
- Servlet容器Tomcat中web.xml中url-pattern的配置详解[附带源码分析]
- 实现对ListView中的条目进行排序
- 1061. 判断题(15)
- C/C++中赋值语句返回值
- 模板化vs模板特化vs模板偏特化
- Android Studio获取MD5和SHA1值