3. 模块化与 MVVM 设计模式

大家好,我是 K 哥。一名独立开发者,同时也是 Swift 开发框架【Aquarius】的作者,悦记和爱寻车 app 的开发者。
Aquarius 开发框架旨在帮助独立开发者和中小型团队,完成 iOS App 的快速实现与迭代。使用框架开发将给你带来简单、高效、易维护的编程体验。
引言
在 iOS 开发中,面对日益复杂的业务需求和团队协作挑战,如何构建可维护、可扩展的架构?Aquarius 框架通过'模块化 + MVVM + 洋葱开发法'的铁三角模式,为独立开发者和中小团队提供了一套完整的解决方案。
模块化开发
项目工程结构的两种类型
我们在开发时,根据项目的复杂程度,工程结构一般建议采用集成化和模块化两种方式。
集成化:所有功能均在主工程中完成
模块化:将功能进行拆分、梳理,并将不同功能规划到不同的模块中。主工程由各个模块整合后,形成项目的整体工程结构。
无论是集成化开发还是模块化开发,本身并没有优劣之分,需要根据实际情况决定。
K 哥整理了一个表格来展现两种方式的不同之处:
不同类型适合哪种项目
一般,功能较少或几人完成的项目建议采用集成化开发方式。
当功能较少或 1~3 人便可完成时,需要的是更加简单、灵活、能够快速推进项目进度的方案,所以集成化相对较适合。
当功能较多或需要多人完成时,需要的是更统一的项目结构、更清晰的功能规划、更合理的人员分配。所以模块化相对较适合。
集成化工程结构
集成化的开发方式相对较简单,但是从工程结构角度看一样需要具备清晰、易懂等要求。
K 哥在这里也提出一个工程结构的方案,大家可以参考。如下图所示:

thirdparty:存放三方源码
Cell:存放 Cell
Controller:存放 Controller
Model:存放 Model
Module:对外提供的接口
Service:服务层代码
Store:存储层代码
View:存放 View
Supports:存放静态变量。例如:通知 ID、绑定 ID、三方服务的 Key 等
ViewModel:存放 ViewModel
当然,这些只是最简单的工程结构。不同公司或者不同的开发者都有自己的工程结构方案。如果你还没有的话,可以参考 K 哥提供的这个方案。
模块化开发
模块化概念
模块化不是一个新的概念了,但是在 iOS 的项目开发中,尤其是在中小型团队和独立开发者中,受到成本、团队协作效率等因素的限制,往往应用较少。
但是,我们知道,每个项目几乎都是按照螺旋曲线不断向上的方式去迭代的。这也就意味着,每个 app 的功能会随着版本的迭代,不断的增加。
这时,就需要考虑功能迭代、团队协作以及如何释放团队潜力等诸多问题。
模块化正式解决这些问题的不二之选。
模块化开发在中大型项目中的意义
首先,模块化在版本迭代过程中起到了平衡各模块的功能布局以及清晰的展现未来产品的发展方向的作用。
其次,模块化可以使多个团队共同维护同一个 app 有了可实现的方案。不同团队维护自己负责的模块,最后主工程只是起到了整合、发布的作用。
最后,不同团队都有自己不同的目标,彼此也是竞争关系,这就大大的调动了人员的积极性,团队更多的潜力被释放出来,有助于 app 向着良性的方向发展。
iOS 的项目如何实现模块化开发
那么 iOS 的项目如何实现模块化呢?
这里 K 哥提出一个方案,大家可以借鉴。
如果有更好的方式,也可以评论区咱们一起探讨。
通过 workspace 来管理你的项目
你需要在 xcode 中建立 workspace 来管理你的项目。
点击 File-New-Workspace。如下图所示:

选择保存路径之后,点击 Save。如下图所示:

创建 Framework
点击保存之后,Xcode 将打开新的窗体。
同样,点击上方的 File-New-Project
点击 iOS,在 Framework & Library 分栏中选择 Framework。如下图所示:

点击 Next,在弹出的窗体中,输入必要信息。并点击 Next。如下图所示:

在弹出的窗体中一定要选择你创建的 Workspace。然后点击 Create。如下图所示:

选择静态库
创建好 Framework 之后,
Framework 创建好之后,我们需要点击 TARGETS,点击 Framework,在右侧窗口中选择 Build Settings,找到 Linking - General,找到 Mach- O Type,将 Dynamic Library 调整为 Static Library。如下图所示:

好了,现在你已经创建好了你的第一个模块。
接下来,你可以根据你的实际需求创建多个你自己的模块。
Xcode 的模块化方案非常的简单。有了模块化之后,当 APP 的不同模块由不同团队负责。或者你是一名独立开发者,你的 APP 今后需要交给多个人维护时,不同的团队,或不同的人,只需要拿到他们自己负责的模块源码即可,那么你的项目工程将变得无比整洁与安全。
MVVM 设计模式
MVVM 设计模式也是一个老话题了。之所以 Aquarius 开发框架采用这种设计模式,是因为框架本身建议大家在开发时更多的使用 ViewModel 来减轻 Controller 层的压力。这对项目开发过程中的多人协作与代码易维护性具有至关重要的作用。
MVVM 解决什么问题
我们知道,大家都习惯将代码写在 Controller 中,随着功能的不断迭代,代码势必会不断增加。也就是说 Controller 层的代码就会越来越多。这对代码的 Review 造成了极大的复杂性。
所以,我们就需要通过 MVVM 设计模式的 ViewModel 来缓解 Controller 的压力。
另外,即使没有 ViewModel 层,我们也应该将逻辑处理部分的代码与 Controller 层分离。这样,后期的工程代码才能易于维护。
Aquarius 开发框架对 MVVM 设计模式的支持
大家都知道,要想实现 MVVM 设计模式,其实是非常简单的,我们只需要创建一个 ViewModel 文件即可。
但是,随着文件的创建,我们势必需要关注 MVVM 设计模式中,各层之间如何来解耦的问题。
传统的方式,可以通过 Delegate 实现。
Aquarius 开发框架提供了更多的解耦方式,你可以通过通知、数据绑定等多种方式实现解耦。
Aquarius 开发框架提供了:
AViewController,它是 Controller 层的基类
AViewModel,它是 ViewModel 层的基类
AView,它是 View 层的基类
AViewController,提供了埋点管理、导航条管理、分层管理(洋葱开发法)、主题管理、日志管理、热更新管理。
AViewModel,提供了分层管理(洋葱开发法)、Delegate 管理、通知管理、数据绑定管理、日志管理、热更新管理。
AView,提供了键盘管理、分层管理(洋葱开发法)、Delegate 管理、通知管理、数据绑定管理、日志管理、热更新管理。
请不要着急,本篇文章,我们只简单介绍 Aquarius 开发框架各层基类提供的能力,在后续的文章中,我们会逐个介绍各个功能如何使用。
如何基于 MVVM 设计模式开发项目
通过以上的介绍,我们可以了解到,创建一个有效的界面,至少需要包含 3 个类文件,他们分别是 Controller(继承 AViewController)、View(继承 AView)和 ViewModel(继承 AViewModel)
代码示例如下:
TestVM.swift
TestView.swift
TestVC.swift
这时一个最简单的基于 Aquarius 开发框架实现 MVVM 设计模式的代码结构。
任何复杂的 app 界面,和处理逻辑,都是基于此扩展出来的。
开发铁三角
一个开发项目的成功,需要从方法 - 架构 - 模式三个方面来探讨。
先进的方法+稳固的架构+成熟的模式就可以形成开发铁三角。从而才能保证项目内外兼修。
构建应用的稳固基石
在复杂的应用开发中,单一的技术或模式往往力有未逮。Aquarius 开发框架以 “洋葱开发法”为纲领,“模块化”为骨架,“MVVM”为神经的铁三角模型,从宏观到微观,全方位保障代码的质量、可维护性和开发效率。
1. 宏观纲领:洋葱开发法
定位:核心方法论与架构哲学。
作用:它规定了整个应用的代码结构像一颗洋葱,层次清晰。领域模型位于最内层,不受任何外层(如 UI、数据库)变化的影响。这是保证应用核心业务逻辑纯粹和稳定的顶层设计。
类比:建筑的整体设计蓝图,规定了承重墙、管线走向等根本结构。
2. 中观骨架:模块化开发
定位:项目组织模式与工程架构。
作用:在“洋葱”的每一层中,我们使用模块化将系统拆分为独立的业务模块或功能单元(如“用户模块”、“支付模块”)。每个模块都可以内部采用洋葱分层,并对外暴露清晰的接口。这解决了团队协作、代码复用和部署复杂度的问题。
类比:将大楼划分为不同的功能区域(住宅区、商业区、车库),每个区域可以独立施工和管理。
3. 微观神经:MVVM 设计模式
定位:前端交互模式与表示层架构。
作用:在表示层,当我们具体开发一个 UI 界面时,采用 MVVM 模式。它负责协调视图的展示、用户的交互和底层数据(可能来自洋葱的领域层)的同步。它完美地解决了视图与业务逻辑的耦合问题。
类比:每个房间内的智能家居系统,它负责接收指令(用户操作)、控制设备(更新视图)并反馈状态(数据绑定),但不管墙壁是如何建造的(模块化)或大楼的地基在哪(洋葱核心)。
铁三角的协同工作流
首先,运用 MVVM 设计模式进行顶层设计,划分出领域层、应用层、基础设施层和表示层。
接着,运用模块化将整个系统按功能垂直切割。每个模块都是一个小的“洋葱”,内部包含自己的层次。
最后,在 MVVM 各层中,运用洋葱开发法来精细化管理数据流向和用户交互。ViewModel 会调用洋葱应用层的服务来获取数据,Model 可能就是洋葱领域层的实体或数据传输对象。
总结
“以‘模块化’分而治之,用‘MVVM’精雕细琢,所有这一切,都在‘洋葱开发法’规定的秩序下和谐统一。”
立即体验 Aquarius:
第一步:探索资源
⭐ Star & Fork 框架源码: GitHub - JZXStudio/Aquarius - 支持项目发展
⭐ Star & Fork 悦记源码: GitHub - JZXStudio/yuenote - 完整案例,深入了解框架使用方式
第二步:体验效果
第三步:沟通交流
💬 提交 Issue: GitHub Issues - 反馈问题或建议
💌 联系与反馈: studio_jzx@163.com - 直接交流开发心得
评论