十五分钟了解什么是组件化开发?

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);
    }];

看到这里还有不明白的欢迎留言。

你可能感兴趣的:(十五分钟了解什么是组件化开发?)