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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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