美文网首页
DTRouter 路由设计

DTRouter 路由设计

作者: DreamTracer | 来源:发表于2017-03-16 11:24 被阅读89次

文章内容转移到个人博客日后不会在简书中更新文章。​

随着移动互联网的不断发展,很多程序代码量和业务越来越多现有架构已经不适合公司业务的发展速度了,很多都面临着重构的问题。在公司项目开发中,如果项目比较小,普通的单工程+MVC架构就可以满足大多数需求了。但是像淘宝、蘑菇街、微信这样的大型项目,原有的简单架构就不足以满足架构需求了。

概要设计

看过很多开源路由框架,基本都是一个URL(与其说是URL 更应该为URL的规律)对应一个任务,如图:

keyvaluemap.png

那应该去想想URLPattern要用什么规则。

首先我们看一下我们在平时能看到的URL格式:

scheme://host/path?argument1=argumentValue1&argument2=argumentValue2

当然组合方式有很多,我只对如上格式的URL做了pattern分析。

这里我参考了一下JSRoutes的pattern。

比如我定义了一个pattern为:

dtrouter://:host/:path/hahaha/:otherpath

那么它就可以对应如下或者更多的url

dtrouter://router/pathhaha/hahaha/path2?arguemt1=argumentvalue1
dtrouter://router123/pathhahaasdf/hahaha/path456?arguemt1=argumentvalue1

可以看出 :host、:path、:otherpath部分是可变的,hahaha是不可变的,而且hahaha必须在第三个位置,后面的arguement 就看你需不需要了,JSRoutes 做了一个更好的处理,连hahaha的位置都是可选的。

pattern的规则已经选好了,接下来是task。

task指的是任务,我们希望访问一个url去执行一个任务。那这个任务是什么?

创建类、网络请求、查找数据库、push一个页面 等等。但是我没办法全面的考虑到开发者使用这个DTRouter具体要做什么,所以我需要把这些任务概括一下,而我的选择是Block。把这些任务打包成一个代码块儿是个好办法。

目前为止,设计路由的思路已经很清晰了。

  1. pattern的规则定义
  2. 任务的展现方式选用

Pattern与Task映射表

我打算用pattern为key,block为value的字典去存储映射关系。

value倒是好解决 ,直接存储就可以了存储之后类型为__NSGlobalBlock

那pattern怎么办?

我们都知道 NSDictionary的key必须是可哈希的。

NSObject默认以实例的内存地址为哈希的值。

回到话题,如果以内存地址为哈希值肯定不合适。

因为同样的pattern,可能是不同的对象,拥有不同的内存地址。

所以我打算重写isEqual和hashvalue 这两个方法,去根据pattern的内部属性去判断,是否为同一个pattern。

dtrouter://:host/:path    0x00000001

dtrouter://:host/:path    0x00000002

如果不重写以上两个方法,系统会视这两个pattern为不同的实例,但其实是同一个。

所以可能导致,字典中作为key的pattern相同。

这样pattern和task的映射表就设计完了。

路由

simpleworkflow.png

路由的过程很简单,分析url 并分解为pattern实例和键值对,通过pattern实例查找对应的任务,并只用键值对执行block得到返回值并返回。

具体使用方法以及demo请查阅DTRouter by DreamTracer

参考资料:JLRoutesBeeHive

相关文章

  • DTRouter 路由设计

    文章内容转移到个人博客日后不会在简书中更新文章。​ 随着移动互联网的不断发展,很多程序代码量和业务越来越多,现有架...

  • 手撸博客3 文章列表及文章

    1 设计思路 1.1 路由设计 /article路由到文章列表页面/article/aid路由到具体的文章页面 1...

  • iOS路由设计思路

    前言 iOS解耦方案大部分是通过路由,由此出现了各种不同的路由设计。在看过一些路由设计后,笔者对路由引发了一些思考...

  • 有标题的文章

    React Redux 路由设计 - - React

  • iOS组件化路由的设计方案,用于组件化各业务模块的解耦

    目录 简述 设计结构NSURLComponent介绍路由对象存储设计方案类图结构补充 使用方式 路由性能评测 未来...

  • BI报表

    一、路由设计 一级路由路径business_intelligent/二级路径:以运营总览为例 二、Store设计 ...

  • HTML5技术分享angular开发应用实现

    组件异步路由 angular实现 在开发Angular2应用时,像组件设计、路由设计以外,对于一个较大型的应用,我...

  • HTML5技术分享angular开发应用实现

    组件异步路由 angular实现 在开发Angular2应用时,像组件设计、路由设计以外,对于一个较大型的应用,我...

  • 路由汇总的方式

    路由汇总   路由汇总是一个非常重要的设计思想,通常在一个大型网络的设计过程中,必须时刻考虑网络及路由的可优化性,...

  • 用场景讲故事

    从场景入手,开始设计,开始讲故事。 用户买路由后, 是新安装宽带? 是替换老路由? 是在原有路由下,新加路由扩大覆...

网友评论

      本文标题:DTRouter 路由设计

      本文链接:https://www.haomeiwen.com/subject/xtndnttx.html