专栏首页進无尽的文章架构 - iOS架构设计之模块间的解耦尝试

架构 - 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协议(统一资源定位器)定位每个可访问的页面(资源)。


本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://www.jianshu.com/u/aef519a9dde7复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 聊聊iOS开发之MVVM的架构设计

    而MVVM这种新的代码组织方式就可以解决这些问题,本文就MVVM的架构设计做个简单的个人总结。

    進无尽
  • iOS开发之浅谈MVVM的架构设计与团队协作

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正。本篇博客的内容沿袭以往博客的风格,也是以干货为主。 由于...

    lizelu
  • 模块化与解耦(转)

    本文主要讲述了在iOS开发过程中,模块化工程架构的一种组织方式,本文主要讲述基于cocoapods来做模块化的方案,详细讲述了iOS开发怎么进行模块划分的内容,...

    VV木公子
  • 论文精读|6th | CNN网络的解耦设计 | CVPR 2018 | 一种新的高性能学习架构 | 附全文下载

    这是一篇CVPR 2018的Spotlight论文,提出了一种可以大幅提高性能、收敛能力、鲁棒性的解耦算子,构成解耦网络。该方法受到了CNN类网...

    用户7623498
  • iOS-组件化(OC篇)

    网上关于组件化的理论很多而且已经比较成熟,理论方面请参看这篇集合文章iOS组件化。

    编程怪才-凌雨画
  • 微信 Android 模块化架构重构实践(下)

    重构整体架构不是一件容易事,通常也不太可能让整个团队停下来只做重构。本文是微信 Android 模块化架构重构实践的下篇,主要分享模块化架构重构的一点点经验。

    微信终端开发团队
  • 今日头条:iOS 架构设计杂谈

    IT大咖说
  • 有赞移动 iOS 组件化(模块化)架构设计实践

    业务组件化(或者叫模块化)作为移动端应用架构的主流方式之一,近年来一直是业界积极探索和实践的方向。有赞移动团队自 16 年起也在不断尝试各种组件化方案,在有赞微...

    有赞coder
  • iOS组件化设计与开发

    首先我觉得”组件”在这里不太合适,因为按我理解组件是指比较小的功能块,这些组件不需要多少组件间通信,没什么依赖,也就不需要做什么其他处理,面向对象就能搞定。而这...

    進无尽
  • 程序员过关斩将--论系统设计的高可扩展性

    说到系统设计的三高,每一高都是一个很庞大的话题,甚至可以用一本书甚至N本书来详细阐述。其中高可扩展性是系统架构的众多目标之一。归根结底,系统的架构要为最终的业务...

    架构师修行之路
  • 从既有系统到微服务架构

    微服务近年来可谓炙手可热,合理的使用微服务架构可以解耦系统、提供更好的软件伸缩性以及提高组织的敏捷性。然而现实中较少有项目一开始就会选择使用微服务架构,绝大多数...

    纯洁的微笑
  • 从既有系统到微服务架构

    微服务近年来可谓炙手可热,合理的使用微服务架构可以解耦系统、提供更好的软件伸缩性以及提高组织的敏捷性。然而现实中较少有项目一开始就会选择使用微服务架构,绝大多数...

    后端技术探索
  • 解读 iOS 组件化与路由的本质

    虽然 iOS 组件化与路由的话题在业界谈了很久,但是貌似很多人都对其有所误解,甚至没搞明白“组件”、“模块”、“路由”、“解耦”的含义。

    波儿菜
  • 深度解析——短视频SDK的前世今生

    2016 年中国移动短视频用户数为 1.5 亿,今年预计会达到 2.4 亿,增长率高达 58.2%,可见短视频的热度在一直提升;近几年,短视频的生产模式在不断演...

    BestSDK
  • 短视频SDK架构设计,短视频APP开发目标首选

    短视频 SDK 实践中主要做的一些事情,这其中最重要的就是短视频 SDK 的架构设计,包括架构设计理念、架构图、整体数据流程、模块架构设计等。今天小编就简单介绍...

    球446527153
  • 微服务架构:搭建网站扫码登录的功能设计

    微信扫码登录大家都是应用比较多的登录方式了,现在大的购物网站像京东、淘宝等都支持使用APP扫码登录网站了。今天就用APP扫码登录网站的实例来举例说明微服务架构的...

    搜云库技术团队

扫码关注腾讯云开发者

领取腾讯云代金券