架构 - iOS架构设计之模块间的解耦尝试

前言

工程大了以后,就需要分拆,不管是组件化还是插件化,还是什么,解耦是第一步,而且是各个维度的解耦。

模块解耦合的方式

【1】Runtime 运行时调用

    Class targetClass = NSClassFromString(@"TestViewController");
    id instance = [[targetClass alloc]init];
    //属性赋值
    SEL sel = NSSelectorFromString(@"setImageName:");
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    [instance performSelector:sel withObject:@"测试参数"];
    #pragma clang diagnostic pop
    [self.navigationController pushViewController:instance animated:YES];

    /*
     Runtime 这样的机制增加了程序的灵活性,可以通过给一个方法传递sel参数,
    让这个方法动态的执行某一个方法,我们也可以通过配置文件制定需要执行的方法,
    程序读取配置文件之后把方法的字符串翻译成sel变量然后给相应的对象发送这个消息。
     */

【2】接口隔离,机制与策略分离,面向接口调用

虽然说公共模块可以通过架构设计来避免耦合业务,但是业务模块之间还是会有耦合,而且这种情况是最多的,比如页面跳转啊,数据传递啊,这些情况前面的方法已经不够用了。那如何解耦不同业务模块之间的代码调用呢?

那就是面向接口调用,我们知道只要直接引用代码,就会有依赖,比如:

// A 模块
- (void)getSomeDataFromB {
    B.getSomeData();
}

// B 模块
- (void)getSomeData {
    return self.data;
}
那么我们可以实现一个 getSomeDataFromB 的接口,让 A 只依赖这个接口,而 B 来实现这个接口,这样就实现了 A 与 B 的解耦。

// 接口
@protocol BService <NSObject>
- (void)getSomeData;
@end

// A 模块, 只依赖接口
- (void)getSomeDataFromB {
    id  b = findService(@protocol(BService));
    b.getSomeData;
}

// B 模块,实现BService接口
@interface B : NSObject <BService>

- (void)getSomeData {
    return self.data;
}

@end

    这样就可以实现了即满足了模块之间调用,也实现了解耦

协议与实现做成了一个机制与策略分离 所谓机制即是抽象出来的规则,比如: f(x)=x^2 x属于R 所谓策略即是在具体场景中的应用,比如当x=2的时候: f(2)=4 x=2

【3】中间件的路由通信解耦

A :推荐CTMediator 方式的组件化解耦 可以看我这篇文章:iOS组件化设计与开发

B:URL路由式组件化解耦 还有一种手段就是通过定义一套协议来实现模块间的通信,比如app里面的任何页面,或者任何操作都是通过一个URL来唤起的话,这样是不是就把各个复杂的业务之间解耦了呢,通信都使用URL.

为何如此URL(统一资源定位符)?

  回到最开始我们描述的问题中第一点: 模块发现。其实也就是模块这种资源的定位问题,
  这个和URL设计的初衷是不谋而合的。URL整套的设计思路就是在整体的互联网中解决信息孤岛,
  让各个信息孤岛之间能够进行资源发现和资源调用而设计。而我们目前所要处理的模块间通信问题,
  其实是这个宏大问题域的一个子集。因而选用URL协议,是一个非常顺理成章的事情。

可以方便地在页面之间构建高内聚和低耦合开发模式。他的核心思想是将每个页面视为一种资源,并通过标准URL协议(统一资源定位器)定位每个可访问的页面(资源)。


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏知晓程序

电商/票务类小程序必读,如何用小程序推送消息?

通常,服务方向用户推送的消息都带有通知性质,文案也相对固定。服务方将这类固定的文案制作成模板,这些文案就可以快速重复使用。

1212
来自专栏地方网络工作室的专栏

打造前端MAC工作站(五)让我们熟悉一下 MAC 命令行吧!

打造前端MAC工作站(五)让我们熟悉一下 MAC 命令行吧! 前言 对于初次基础mac或者linux的朋友来说,接收和使用命令行是一个比较困难的事情。但是,正如...

25310
来自专栏月色的自留地

七牛对象存储的使用

3954
来自专栏杂烩

GitHug备忘 原

作为开源代码库以及版本控制系统,Github拥有140多万开发者用户。随着越来越多的应用程序转移到了云上,Github已经成为了管理软件开发以及发现已有代码的首...

635
来自专栏华章科技

硬盘数据恢复的神器有哪些?

在一切工作进行之前,请先判断硬盘是否有损坏,以及缺损类型,而往往硬盘出现问题主要集中下以下两个方面:

1212
来自专栏Web 开发

ubuntu学习手札——vmware中安装ubuntu

我的系统是XP SP3 + VMWARE WORKSTATION + UBUNTU 8.04桌面版

1032
来自专栏小文博客

今天是1024程序员节 请对身边可爱的程序员们好一点

1584
来自专栏「3306 Pai」社区

nginx+php-fpm故障排查

小明初到一家公司做运维的工作,刚来的第一天就开始部署LNMP(Linux+Nginx+MySQL+PHP)环境,结果出现了问题。 他来向我请教。

4121
来自专栏QQ空间开发团队的专栏

TPatch动态补丁系统(iOS)

对于每一个开发,从写Hello World开始,到使用各种语言,可能都会遇到各种BUG。有的BUG能快速解决,比如Web侧的,发个JS或者Html即可。但是在终...

2.5K1
来自专栏IMWeb前端团队

关于javascript错误捕获

``` javascript的出错我们应该都很熟悉,例如`xxx undefined`,`SyntaxError`等。 我们team将出现错误的javas...

2197

扫码关注云+社区

领取腾讯云代金券