马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
配景
现在贸易SDK中的点击事故,会根据差异的「事故范例」+「业务范例」,去实验差异的路由跳转逻辑,然而差异的跳转事故内部又有着很复杂的跳转逻辑,
痛点
- 差异的跳转逻辑之间存在耦合
比方,在deeplink的跳转逻辑之中有其他跳转逻辑,如果dp失败后会走normal的路由跳转;大概有些业务有deeplink链接的时间跳转dpplink,没有dp的时间会跳转默认的链接。
- 代码可读性差,维护资本高
在某一个click事故当中,由于产物特性,大概会包罗多个跳转逻辑,比方:跳转视频、跳转网页等等。
- 排盘标题的难度增长
基于以上现状,在排查跳转标题的时间,必要泯灭较长的时间去梳理代码。
现状流程图
可以从上图看出,跳转逻辑相互关联,对于代码流程处置惩罚非常困难。
优化想法
- 由于每一个卡片跳转都有肯定的次序和流程。我们必要团体先后次序。
- 拉产物沟通,将跳转的先后次序以及 乐成的条件举行沟通。
沟通后流程如图:
方案
开端想的方案是,根据跳转的页面的优先级,做一个类似链表的结构体,然后链表的每个子元素都是一个页面跳转流程。 根据「页面跳转的乐成」条件去举行判断,如果某个子元素跳转乐成,那么returen掉,如果失败,那么继续走到下一个链表的子元素。以此类推,终极走向兜底逻辑。
原理着实很简单,就是一个链式表达式,哪个乐成那么就跳转哪个,后边的流程不实验。
调用方式如下:
- //构建各个路由跳转的元素成链条
- var routers: [ChainedRouter] = [RouterA(), RouterB(), RouterC(), RouterD()...]
- // 通过方法调用,并传入对应的字段
- routers.chain()?.route(with: dataA, dataB: dataB, other: otherMessage)
复制代码 优化架构图:
优化流程图
调用方式参考
- //构建各个路由跳转的元素成链条
- var routers: [ChainedRouter] = [RouterA(), RouterB(), RouterC(), RouterD()...]
- // 通过方法调用,并传入对应的字段
- routers.chain()?.route(with: dataA, dataB: dataB, other: otherMessage)
复制代码 核心代码分享
- protocol HmgRouter: AnyObject {
- // 只需看当前响应者是否响应,不需要处理责任链传递
- func tryToRoute(with model: NSObject?, context: [String: Any]?, completionHandler: @escaping ((Bool) -> Void))
- }
-
- protocol HMGChainedRouter: HmgRouter, HmgRouterLifeCycle {
- var next: HMGChainedRouter? { get set }
- }
-
- protocol HmgRouterLifeCycle: AnyObject {
- var success: (() -> Void)? { get set }
- var failed: (() -> Void)? { get set }
- func lifeCycleCallBack(_ result: Bool)
- }
- extension HmgRouterLifeCycle {
- func lifeCycleCallBack(_ result: Bool) {
- if result {
- if let success = success {
- success()
- }
- } else {
- if let failed = failed {
- failed()
- }
- }
- }
- }
-
- extension HMGChainedRouter {
- func route(with model: NSObject?, context: [String: Any]?, completionHandler: ((Bool) -> Void)?) {
- tryToRoute(with: model, context: context, viewAction: viewAction) { res in
- if !res, let next = self.next {
- next.route(with: model, context: context, viewAction: viewAction, completionHandler: completionHandler)
- }
- completionHandler?(res)
- }
- }
- }
- class HmgRouterBuilder {
-
- private var top: HMGChainedRouter?
- private var tail: HMGChainedRouter?
-
- func add(_ router: HMGChainedRouter) -> Self {
- if top == nil {
- top = router
- tail = router
- } else {
- tail?.next = router
- tail = router
- }
- return self
- }
-
- func clean() -> Self {
- top = nil
- tail = nil
- return self
- }
-
- func build() -> HMGChainedRouter? {
- return top
- }
- }
- extension Array where Element == HMGChainedRouter {
- func chain() -> Element? {
-
- let a: (HMGChainedRouter?, HMGChainedRouter?) = (nil, nil)
-
- return reduce(a) { (res, current) in
- let (top, tail) = res
- guard let h = top else {
- return (current, current)
- }
- tail?.next = current
- return (h, current)
- }.0
- }
- }
-
复制代码 思索
本文中的实现方式着实就是一种责任链的实现。 我的另一篇文章具体先容了一个责任链模式的利用场景以及通例的实现方式。 责任链模式是代码中常常要用到的。责任链着实就是某个业务场景下每个处置惩罚理单位负责一部分使命,形成一个一连处置惩罚的链条,直到使命被处置惩罚或无人处置惩罚。这种模式使得代码结构清楚,易于扩展。
附上责任链文章:
|