White Paper

创建一个跳转控制器

05 Aug 2020

理想需求:

结构化所有的页面跳转,便于维护;

动态配置页面路径,热更新路径;

跳转权限、流程由组件控制;

映射

使用URL做页面跳转的标记是绝佳的。我要实现一个URL -> JumpAction的映射(记作UJ),而不是URL -> ViewController的映射(记作UV)。

一个ViewController可能非常复杂,他的配置包含了许多状态、参数。如果使用到一个ViewController只有一个映射,那么这个映射可能会很大,难以维护。这样做就不符合目标了。

含义

UJ在业务上更方便理解,运营人员想跳到一个什么什么样的页面;UV则表示的是跳转到X页面。

在URL命名上,UJ可以命名为”edit-profile”,UV则是”profile-edit-view-controller”。这里的区别在于前者表示想去编辑profile,后者是跳转到编辑profile的页面,其中的业务含义差别巨大。

串联

UJURLJumpAction的映射,JumpAction也可以是一个UJ。通过分解UJ来达到简化复杂度。

流程

组件接受到一个URL后:

  1. 解析URL参数
  2. 通过注册的验证器验证URL合法性
  3. 执行所有的拦截器,修正跳转流程
  4. 解析子UJ(递归的从第一步开始执行)
  5. 执行构造ViewController方法
  6. 根据跳转方法进行跳转

验证器

验证器在异常时应该抛出Error而不是Bool,Error更能帮助调试。

拦截器

拦截器是对跳转流程的修正。一次跳转可能需要一些前置条件,或者上下文处理。

一个页面需要登录才能进入,而当前用户又没有登录,那么插入一个登录节点就很不错了;

或是当前URL里的Query需要解密,通过拦截器解密后再传给ViewController构造方法就不会影响后续代码的流畅了。

子UJ

一个UJ在分解后可以得到多个UJ,在构造最终ViewController前执行子UJ可以将理想的业务逻辑、页面路径展开。

跳转

跳转只应该是由组件执行的,开发者只应该告诉组件跳转的行为是什么样的。

组件控制跳转可以很方便的修改跳转的逻辑。

动态配置

远端可以下发配置来改变已经注册好的UJ表。配置最好是json化的。

json配置可以映射到本地代码,但是本地代码则不能完全映射到json配置。

或者说本地代码映射到json配置是用来输出文档给开发者、运营人员看的。

Tweet