maven 按业务拆分模块_如何使用RIB架构实现App业务流程的领域化改造

本文介绍了拍拍贷借款App按领域化拆分业务模块的思路及方案。随着业务发展,传统架构难以满足需求,以MVC为例存在解耦难等问题。采用RIB架构,包含Builder、Router、Interactor、View等部分,具有模块解耦、统一流转语义等优势,也存在接入成本高、路由待扩展等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

374c74542a10db4809c8326b100f3a99.png

使用RIB架构实现App业务流程的领域化改造

几乎所有App都会从匆匆开发V1.0版本开始,扛着众多的技术负债不断地继续加功能、加需求。随着业务的飞速发展, 团队迅速扩张,每天都产出大量的新需求代码,架在原始架构(MVC占大多数)上的整个App像云端高楼,摇摇欲坠。此时,各个团队都会开始寻找机会,调整App架构,强壮地基,但如何组织业务流程方面,行业暂时没有比较好的方案。本文主要介绍拍拍贷借款App在发展过程中按领域化拆分业务模块的主要思路及方案

强业务流程App

对借款业务有所了解的同学都知道借款App是属于强业务流程类型。借款业务的核心在于用户提交或授权材料信息、风控基于这些数据评估用户信用及借贷风险后进行放款。因此依据用户类型的不同、资信材料的不同、各项数据源状态不同进而引导用户到不同的业务流程,流程是业务的核心。一般强业务类型App都会有以下共同点:

1. 用户入口较少 

2. 流程入口要求高度动态化 

3. 业务模块间依赖层级较深,除以上行业特殊属性外,常规的A/B/n Testting、Multivariate Testing、也需要技术支持

现状

大多数App都采用分层架构来规划App的整体技术架构,但对于业务流程的总控却没有较好的技术方案, 对于按业务领域拆分模块,更是束手无策。 这时一般都会有人说,可以使用MVC/MVVM/MVP模式。OK,我们以MVC模式为例来看看是否能满足需求。先来看一段定义:

MVC模式(Model–View–Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

通过将软件的模块单元拆分为视图、数据模型、控制器完成基本的代码规划。比较常见的做法, 都是以页面为模块, 拆分到MVC中。各模块间的逻辑关联也就主要依赖于页面结构。同时也反映出MVC架构的一个典型缺点是:无法脱离View的参与,因此本文后续将这类架构模式统称为MVX模式。

5186613275bc73ee96f8279b39c0c5d5.png

下面我们以借款App的借款前校验流程为例, 使用目前行业主流架构MVC来尝试进行模块拆分。 先介绍下借款App借款前校验流程: 用户在首页入口点击借款, 需要判断用户是否存在未完善资料,如未完善,需要先跳转至特定完善资料页进行材料补充,然后再跳到借款页面进行借款。 以MVX类架构设计模块交互如下: 上图本身没有问题, 但使用MVC实现会有以下三个问题: 

1. 如按业务领域来划分,借款前校验流程应为借款模块子流程, 但图中借款前校验流程实际是包含在首页模块中的,未能实现解耦目标 

2. 可以观察到上述借款前校验流程引用了身份证上传页面、完善信息页面的方法调用,流程中的相互依赖也未能解决。

3. 风险审核拒绝的情况下, 发标模块在首页展示文案后退出,首页模块要过度关注发标逻辑实现

解决方案

结合借款App产品需求及上述案例分析, 想要实现按领域化完美拆分模块, 实际是要解决以下几个问题:

1. 模块化:模块必须凌驾于视图(页面)之上,总控逻辑

2. 无需依赖视图:模块要支持独立存在,能够脱离视图 

3. 流转标准化: 跳转到页面或跳转逻辑的语义要统一 (这个问题最好解决:URL路由)因此我需要的模块架构是一个可以支持URL路由,又可以组合视图或独立存在的逻辑控制器。有了基本原型,我开始在行业间寻找可参考的解决方案,研究过VIPER, 可是也是无法脱离视图, 不能满足需求。正好17年5月在参加Swift开发者大会时,Uber的架构师分享了他们的Riblet架构, 几乎能满足我的一切需求, 概念稍作修改即可!

Riblet 的模块架构如下: ba9ac48ea66a909821de3a7558d51a60.png1. Riblet模块整体组装采用Builder设计模式,可依据需求动态选择组件 2. 页面及页面内的交互统一到View(Controller),划分清晰 3. Presenter与View(Controller)是可选的 4. Router进行场景控制和视图切换,但不支持URL路由

因Uber Riblet虽然已经开源,但仅支持Java与Swift, 且因此需要我们基于UberRiblet概念从头设计拍拍贷RIB框架,以支持Objective-C语言。

PPDRIB包含以下主要类:

Builder

参考Uber Riblet,采用Builder作为模块的入口, 主要负责模块组件构造- (PPDRiblet* _Nonnull)buildWithPath:(PPDPath _Nullable)path params:(id _Nullable) params;

Router

PPDRIB的主要单元为页面及模块,Router主要负责模块的动态串联及页面的挂载。因此Router首先需要给他们定义URL路由标识, 路由结构目前最多支持两级:${模块标识}/${页面标识}

通过在RootRouter注册模块路由,以支持模块路由标识到模块Builder的关联, 调用对应模块则触发模块Build方法构建Riblet,同时调用addChild方法挂载为当前模块的子模块

7203db185502bd9cd85df47c50694993.png

- (void) registerNode:(PPDPath _Nonnull) path withClass:(Class _Nonnull) theClass; - (void)addChild:(PPDRiblet*_Nonnull)riblet withContext:(id _Nullable ) context params:(id _Nullable)params open:(PPDPath)path method:(PPDRouterOpenMethodWrapper*)method;页面在模块内部注册 “modulea/pagea”:- (void)registerPage:(PPDPath _Nonnull ) path withClass:(Class _Nonnull ) theClass; - (void)registerPage:(PPDPath _Nonnull ) path withBlock:(PPDRouterPageBuildBlock _Nonnull ) buildBlock;Router对外暴露Open、Redirect方法来控制模块的装载或替换, 同时支持标准转场动画- (BOOL)open:(PPDPath _Nullable ) path params:(id _Nullable)params method:(PPDRouterOpenMethodWrapper* _Nullable) method; - (BOOL)redirect:(PPDPath _Nullable ) newPath params:(id _Nullable )params method:(PPDRouterOpenMethodWrapper*_Nonnull) method;

Interactor

Interactor是模块的逻辑总控,完整的业务流程都在Interactor内部控制,设计到外部模块、(内外部)页面跳转均使用路由: - (void)didAddToRiblet:(PPDRiblet*_Nullable) riblet params:(id _Nullable )params open:(PPDPath _Nullable )path method:(PPDRouterOpenMethodWrapper*_Nonnull)method; - (void)didRemoveChildRiblet:(PPDRiblet* _Nullable) riblet;Interactor设计有标准的入口及事件接口:- (void)setEventListener:(id _Nonnull) listener; - (void)postEvent:(PPDRibletEvent* _Nonnull) event;

View

View则为页面级别视图, iOS中一般为ViewController,页面内视图变化内聚到ViewController中。

优势

  1. 完全解耦的高内聚模块

  2. 通过接管页面栈,统一流程流转语义

  3. 架构设计支持安卓、iOS、Web SPA

问题及改进计划

  • 需要将视图跳转统一改为outer.open, 首次接入成本高

  • 子模块多实例支持,支持设置挂载点

  • 目前仅支持重定向父级模块,不支持全局重定向

  • 单元测试支持

  • 路由扩展到三级,支持页面逻辑模块附件

  • 支持转场动画自定义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值