十五分钟了解什么是组件化开发?
2018-03-12 本文已影响141人
蚂蚁牙齿不黑
1. 什么是组件化? ( 1分钟)
组件化没有官方严格的定义,因为这三个字已经是一个很直白的单词了,平时工作闲暇的时候总会造一些轮子,这些轮子就可以叫作一个组件,如果在一个项目中,也可能会按照功能需求进行划分组件,所以没有严格的界限,不如把它定义为一段完整的代码集合,呵呵。。。
2.怎么实现组件化开发?( 3分钟)
在了解了组件只是代码集合之后,下一步理所当然就是想知道各个组件之间如何无耦合的进行通讯,可以说方式有很多,在ios 的生态环境里我可以列出3种方法,1.通知 2.runtime 3.设计中间件,这三种方法只有第3种是所有编程语言中都可以通用的思路,所以下面会进行介绍,runtime这种方式可能影响苹果审核,自行研究一下,通知这种消息模式就是一种天然的解耦方法,不知道的可以私信问,太简单了
3.图解中间件设计 ( 4分钟)
image.png
image.png
从图二可以看出各个模块之间没有直接的关联了,但是他们都依赖中间件,
4.中间件设计原理 ( 7分钟)
中间件会在堆控件维护一个注册服务表,哈希表结构,在ios 中的实现就是一个字典,在这个字典中会存储一段自定义字符串为key(这个自定义字符串也叫接口)然后保存一段代码块(这算代码也叫服务),这段代码块在iOS中的实现形式就是block
这里举一个场景来描述刚才说的话,两个组件报表模块和单据模块,在报表模块提供了一个报表查询功能,然后在单据的模块内部去调用这个不属于自己的功能
| 接口 | 服务 | 服务提供方 |
|---|---|---|
| "jz://report/queryData" | 报表查询功能 | 报表模块 |
- 报表模块先向全局字典中注册报表查询服务("jz://report/queryData") 这段代码写在报表模块中
[MGJRouter registerURLPattern:@"jz://report/queryData" toHandler:^(NSDictionary *routerParameters) {
NSLog(@"%@",routerParameters);
NSDictionary *userInfo = routerParameters[MGJRouterParameterUserInfo];
void (^completion)(id result) = routerParameters[MGJRouterParameterCompletion];
NSArray *reportData = @[];
if (completion) {
completion(reportData);
}
}];
- 单据模块调用报表查询服务 这段代码写在单据模块中
NSArray *queryStr = @[@{@"StartValue":@"",@"Operator":@"like",@"DestValue":@"2017-10-09 15:55:40",@"EndValue":@"",@"Id":@"f59ff536-07dc-451c-b0ea-45aea40f5cf8"}];
NSString *reportTplId = @"hfddff536-07dc-451c-b0ea-4581511dfd454";
NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
[userInfo setObject:queryStr forKey:@"key_queryStr"];
[userInfo setObject:reportTplId forKey:@"key_reportTplId"];
[MGJRouter openURL:@"jz://report/queryData" withUserInfo:userInfo completion:^(id result) {
NSLog(@"报表组件回调结果:%@",result);
}];
看到这里还有不明白的欢迎留言。