前面说到一个订单系统,需要显示下载回来的订单。由于业务发展,系统需要做一些调整
变更
系统需要扩展,需要支持第二个平台(如 eBay)。要下载第二个平台上的订单,也要在UI上显示得到订单的明细。
第二版(第一稿)
由于开发时间所限,我们做了以下操作:
- OrderDownloader 更改名字,成为 AmazonOrderDownloader
- 多写一个叫 EBayOrderDownloader
- 在定时器多添加一个调到EBayOrderDownloader上
- 订单数据结构保持不变,显示不变
可以下班了!
等等!如果数据结构保持不变,订单数据结构肯定会对Amazon倾斜,EBayOrderDownloader会有很多适配的代码。
同时由于通常用户需求的不明确,通常UI显示不到 eBay 特有的订单数据项,会感到郁闷,投诉在上线后开始来了。
回头看看,我们这次变更的贡献在那里?
- 多了一个 EBayOrderDownloader 对象
- 定时器多了一个调道
分析思路:定义贡献单元
从需求上,一般人可能只看到[增加了一个平台下载任务]。但这个需求背后隐藏了另外一个需求,就是[添加平台的可能性]。
需求到技术上,通常需要设计和落实的[添加平台的可能性]如何达到呢?
最理想的就是用JAR(或者是DLL,按语言不同会有所不同)包来交付。一个JAR包是:Amazon.jar 另一个是 eBay.jar。添加一个平台就只需要把JAR包放到特定地方。
这个是框架性的调整,是整个[贡献式编程]的核心思想和基础框架支持。可能有人会用不同的方式去实现:Java SPI,OSGi 等,具体实现插件的框架很多,在此不做详细描述。
我们定义了贡献的单位,为一个JAR包,我们就可以按照此思路去重构。