起因和思路:
达达商城里有多种类型的商品,每种商品有不同的展示,定价,发货,库存管理,退款逻辑。在项目开发半年后,代码逻辑繁杂混乱,难以维护。在2016年的十一,我们实施了一次重构,思路为:
商品购买流程是不变的,明确每个流程节点的触发方法。
流程节点上业务的逻辑是灵活多变的,受到前端框架react组件化的启发,用插件的形式拆分隔离,对不同的商品做插件配置。
商品可以在后台绑定和修改插件,及调整插件参数。
结构图
商品,节点和插件:
每一个商品会绑定多个插件,每个商品可动态的添加删除插件:
用户购买任何类型商品,都会经历如下图的各个节点。当某个节点被触发时,系统会检测购买的商品有哪些插件,并按顺序执行绑定插件在该节点的代码逻辑。
插件的灵活性和可读性:
插件的参数是可以实时配置的,可以针对商品的需求,调整插件参数。
插件的流程所执行的逻辑可以直接在后台看到,方便理清该商品的购买流程细节,无需再写文档。
编写一个插件:
接到新需求,你要做的只是编写一个插件文件。系统通过反射的方式,自动获取到路径里的新的插件,展示在后台界面上。后台配置后,插件即可生效。
插件基础属性:
属性 | 说明 |
---|---|
plugin_id | 插件id |
plugin_name | 插件展示名称 |
category | 插件分类 |
priority | 插件的执行顺序 |
desc | 插件在不同节点的逻辑描述 |
插件配置参数Props:
继承Props Class,定义了该参数的属性,默认值等。Props是可以在后台配置的,实时生效。
节点方法:
节点的业务代码都写在节点方法中。当一个节点被触发,绑定的插件上的节点方法就会按priority的顺序依次执行。节点方法会输入该插件的配置参数Props,API传入的参数Form,和贯穿不同插件的参数Data。每个插件执行结束后也会返回标准的Output Class,来处理一些异常情况。
使用现状:
当前达达商城已经使用了一年,运行良好,每次有新业务就用插件的形式增量添加,几乎没有再次重构的需要。
众包任务业务的结算系统也已使用插件系统来处理不同项目复杂的结算逻辑。接入整套插件系统及后台配置功能只花了半天的工作量。
未来发展:
自动化测试:
针对插件的自动化测试比单元测试更加贴近业务,比集成测试更加细粒度。插件系统对逻辑的细粒度分离和对input,output参数的把控,让自动化测试变得简单。后台界面可自动获取一个插件或一个业务所需要的所有input和所有预期的output参数,测试可以生成测例并定义input和预期的output。
开发流程优化:
业务的插件拆分产品也可以参与进来,界面的可读性让产品更能了解一个业务具体执行了哪些逻辑。在需求讨论时,产品和研发可以讨论出一个插件逻辑,在后台自动生成模板给研发,同时测试也可以开始根据此模版编写测例。
作者:翁思源,香港科技大学毕业,经历过新加坡创业公司,回国卖过宝石,创过业,加入达达后开发了达达商城,现在负责众包任务项目。