背景:
1.网易考拉APP首页、频道页、活动页、发现页feed流实现,需要对有序列表数据进行数据转换、聚合处理、还原排序等操作。
2.资源投放系统的设计和上线,提供了持久化对象高度抽象的可能,各模块处理逻辑垂直拆分是趋势。
需求分析:
如上图,需求可抽象为:持久化对象——> 业务对象 ——> 视图对象 的处理流程。
看起来可能没有什么价值,那么看一下批量处理的图示:
需要保持数据顺序的同时,将数据归类批量处理,而后还原顺序。
看起来好像很简单,但是写起来其实很繁琐,且不说各种判空,就是根据类型作相应的处理,每个接口写一遍也是很烦的。
重复劳动是不可以忍受的!怎么办呢?
方案设计
V1.0
抽象出Po、Bo、Vo三组模型
设计Adapter、Filter、Handler三个接口,实现适配、过滤、处理功能
设计AdapterFactory<S,T>,扫描注解绑定Adapter、Handler,校验流程完整性,实现初始化。
通过 List<View> buildView(String accountId, List<Module>) 接口实现根据po批量获取vo
V2.0
定义对象ProcessTemplate<S,T>(流程模板),用于定义流程,由流程节点组成,每个节点有一个Adapter和多个前处理器(Handler)、后处理器(Handler)
定义上下文对象接口ProcessContext<S,T>
定义流程引擎接口
为使用方便,定义自动加载流程引擎接口,并在AbstractAutoProcessFactory中定义抽象方法设置默认流程引擎上下文,在DefaultAutoProcessFactory中实现根据注解初始化默认流程引擎上下文。
接入实战
为了方便大家理解,首先看一下时序图
上面介绍的很复杂,其实使用起来很简单,举一个简单的例子,当前从资源投放系统取到原始素材列表中含有对象BigImageWithGoods,需要给客户端展示的数据对象为BigImgGoodsViewV2。
kaola-mobile-compose系统会先把BigImageWithGoods数据拷贝到BigImageWithGoodsBo对象中,然后进行相关业务处理,最后将业务数据输出到BigImgGoodsViewV2。
如图所示:
下面看一下业务代码:
1. 由BigImageWithGoodsAdapterPo2Bo完成把BigImageWithGoods数据拷贝到BigImageWithGoodsBo对象中的任务
2. 由BigImageWithGoodsBoHandler完成对一拖八商品数据批处理
3.由BigImageWithGoodsAdapterBo2Vo完成把BigImageWithGoodsBo输出到BigImgGoodsViewV2中的任务
4. 配置自动初始化工厂类
5.注入工厂类就可以使用API啦!
至此,单一模块的配置就完成了。下面看一下使用现况:
业务场景
1. APP首页、频道页、活动页、发现页流式数据处理
2. APP调查问券等资源投放数据接入场景(图片暂无)
3. 种草社区首页
4. 种草社区后台(接入中)
总结:有一定的学习成本,但接入成本不高。根据APP首页改造对比,熟练使用后,业务代码可减少60%以上,大大提高开发效率。
PS:配合资源投放系统效果更好喔!资源投放系统适配接入包开发中。
未来将支持功能:
1. 自加载Handler支持优先级设置
2. 多线程
……
本文来自网易实践者社区,经作者曹一帆授权发布。
作者简介:曹一帆 跨境电商/内容产品事业部
个人邮箱:evain.c@icloud.com