iOS的移动开发,从此迈入移动开发高手系列

屏幕截图 2021-07-21 143618.png

一 设计模式

1 协议,抽象类,具体类和范畴
通常,用圆角矩形表示类实体,在上部用粗体标出名字,下步是操作的名字。如果你看本书的电子版,你会看到协议的标题栏的背景为粉色,而其他类实体的标题栏背景为浅蓝色。抽象的名字用斜体表示。如图,各种类实体例子

image.png

左边具有抽象操作的协议;中间具有抽象操作的抽象类,右边为具体类。带有具体操作、具体属性和实例变量。

业务组件化或者叫模块化,在移动端应用架构中的一种主流方式之一,现在的iOS相关的框架Bifrost都是移动团队多年来的沉淀,对架构的设计的实践。也是让我们多实践和思考分析。补充:Bifrost也叫雷神里的彩虹桥

业务模块——组件化

以前传统的app强调分层。系统划分为基础层,网络层,UI层等等。现在分层已经做不到处理一些复杂的系统了,随着系统变得越来越复杂,容易造成App 内各子系统之间耦合严重, 边界越来越模糊,经常发生你中有我我中有你的情况。这对代码质量,功能扩展,以及开发效率都会造成很大的影响。此时,一般会将各个子系统划分独立模块,这时候架构逻辑会清楚很多,通过技术手段,消除中介者对业务模块依赖,即形成了业务模块化架构设计,如图下:


image.png

过业务模块化架构,一般可以达到明确模块职责及边界,提升代码质量,减少复杂依赖,优化编译速度,提升开发效率等效果。很多文章都有相关的知识点,就不细说了

业务常见的模块化的方案
业务模块化设计通过对各业务模块的解耦改造,避免循环双向依赖,达到提升开发效率和质量的目的。但业务需求的依赖是无法消除的,所以模块化方案首先要解决的是如何在无代码依赖的情况下实现跨模块通信的问题,无论是基于 NSInvocation 还是基于 peformSelector 方法, 都可以很很容易做到这一点。但不能为了解耦而解耦,提升质量与效率才是我们的目的。直接基于 hardcode 字符串 + 反射的代码明显会极大损害开发
目前的常见的模块间通讯方案这几种:
1 基于路由 URL 的 UI 页面统跳管理。
2 基于反射的远程接口调用封装。
3 基于面向协议思想的服务注册方案。
4 基于通知的广播方案。

路由URL统跳方案
大量应用于前端页面。通过把一个 URL 与一个页面绑定,需要时通过 URL 可以方便的打开相应页面。

image.png

有些场景会比这个复杂,页面需要更多的参数URL协议天然支持:


image.png

复杂类型参数,可提供额外的字典参数complexParams,把复杂参数放在字典即可;

image.png

URL 本身是一种跨多端的通用协议。使用路由URL统跳方案的优势是动态性及多端统一 (H5, iOS,Android,Weex/RN); 缺点是能处理的交互场景偏简单。一般更适用于简单 UI 页面跳转。一些复杂操作和数据传输,可以通过此方式实现,但都不是很效率。
目前天猫和蘑菇街都有使用路由 URL 作为自己的页面统跳方案,达到解耦的目的。

反射的远程调用与封装

当无法import某个头文件但是还是需要调用其方法的时候,就会想到用基于反射来实现了

image.png

可是这种方式存在大量的 hardcode 字符串。无法触发代码自动补全,容易出现拼写错误,并且这类错误只能在运行时触发相关方法后才能发现。无论是开发效率还是开发质量都有较大的影响。

怎么优化呢?
一般移动最常见的远程调用就是向后端接口发网络请求。这类问题,我们很容易想到创建一个网络层,将这类“危险代码”封装到里面。上层业务调用时网络层接口时,不需要 hardcode 字符串,也不需要理解内部麻烦的逻辑。我们可以在模块通讯封装到一个(网络层)这些危险代码一般只存在某个文件夹里面,可以特别进行code review 和联调测试后期可以通过单元测试来保障质量。模块化方案中,我们可以称这类“转发层”为 Mediator (当然你也可以起个别的名字)。同时因为 performSelector 方法附带参数数量有限,也没有返回值,所以更适合使用 NSInvocation 来实现。


image.png

今天文章点就先在这里,哈哈 期不期待下回的章节的呢,告诉你,不关注偶,不可能。
下回继续从架构设计方面深入,

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容

  • 一、背景 业务组件化(或者叫模块化)作为移动端应用架构的主流方式之一,近年来一直是业界积极探索和实践的方向。有赞移...
    有赞技术团队阅读 2,627评论 2 9
  • 将一个工程分解成各个组件,然后按照某种方式任意组织成为一个拥有完整业务逻辑的工程。 大致讨论组件化的三种方案:ur...
    WMSmile阅读 2,576评论 0 3
  • 前言: 本文转自前同事casa的博文,这篇文章是基于runtime实现的iOS组件化方案,其实iOS组件化方案基本...
    monkey01阅读 1,657评论 1 2
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 124,740评论 2 7
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,044评论 0 4