登录模块的一种设计与实现
最近在使用 Flutter 做一个新产品,其中一个需求是完成登录模块
开发过程中遇到了临时整体变更方案的问题,由自己请求接口变为接入公司内通用 SDK,因为这部分代码设计的还算不错,没有影响实际项目进展,可见良好的设计是非常重要的
不过还是应该批判这种临时改方案、开发兜时间的行为!
需求内容
- 完成登录模块,涉及到以下三端:
- 用户 - APP
- URS (User Register Service) - 帐号注册后台
- 客户端用户信息后台
- 登录业务有以下四种场景:
- 手机号验证码登录
- 第三方登录(需强制绑定手机号)
- 设置页内绑定第三方账号
- 普通打开APP
- 这四种场景内部的业务逻辑为:
- 手机号:获取验证码 -> 校验验证码 -> 获取个人信息 -> 登录成功
- 三方:第三方登录 -> 获取账号绑定状态 -> 获取验证码 -> 校验验证码 -> 绑定账号 -> 获取个人信息 -> 登录成功
- 绑定三方:第三方登录 -> 账号绑定 -> 获取个人信息 -> 登录成功
- 打开APP:获取个人信息 -> 登录成功
- 以三方登录为例,时序图如下:
方案设计
可以发现,登录这部分的业务场景,都是链式结构,多数比较长,而且其中有一些步骤是相似的,适合复用,因此实现方案应当完成如下的要求:
- 良好的模块化 - LoginTask,便于复用
- 支持链式定义 - LoginStream,整体记录日志与异常情况管理
对外只暴露已经定义好的登录事件链,提供可选的入参即可
如此设计后,整体的时序图为:
代码实现
- 抽象单个模块的行为,
ILoginTask
,各个小模块实现该接口 - 定义单个模块的生命周期回调,
ILoginTaskCallback
,管理类LoginStreamLine
实现该接口整体管理 - 对外只暴露事件流的定义
LoginStreamDefine
如下: