加减乘除的扩展设计
需求:
- 实现加减运算(注意:以后可能会扩展乘除,备注:时间日期类型好像不支持乘除)
- 加减的操作对象包括(Date和DateTime按天加减,currency实现减法时不能小于0,percent最大值不超过100,最小值不小于0),如果超出范围则不执行运算,并返回信息相应的错信息(eg:percent is more than 100% unable to add)
设计方案
方案一:模版+工厂
- 定义一个计算接口,里面包含add和subtract
- Date,DateTime,Percent,Number类型实现这个计算接口,并进行相应的验证
- 定义一个工厂类,用来确定哪个类型的哪个操作符调用哪个方法
- 对于之后添加的乘除操作符,在计算接口里面添加,Multiplication和 division,使用default修饰。
方案二:策略+策略
- 定义一个计算接口,里面只有calculation抽象方法
- Date,DateTime,Percent,Number类型实现这个计算接口,再在每个里面实现计算策略,相当于使用两次策略模式。
- 验证可以定义一个Result,里面包含boolean的isSuccess和String的message。
方案三:策略+工厂
- 计算是单独一个模块,验证是单独一个类的共能,功能上解耦
- 使用策略模式和工厂模式。
体会
高内聚,低耦合。不变的真理,但是到做的时候有很多种方式,就这个例子来说,划分的时候有多种思路:
- 根据不同的计算对象分(Date,DateTime,Number,Percent,Currency)
- 根据不同的操作符划分(加减乘除)
- 验证和计算要不要分割?
- 从可扩展角度来讲,怎么设计
越来越体会到,写代码的时间占了一小部分,大部分时间花在了设计和代码优化。
具体代码会上传到GitHub 上,周末整理一下