Day21-模块化设计与路由机制实践

YVTU

一、模块化设计概念

模块化的核心目标是 解耦,将一个大型应用拆分为若干功能模块(Feature Module),如用户模块、支付模块、直播模块等,各模块可独立开发、编译、测试。

优势

  • 降低耦合,提高复用性
  • 提高团队并行开发效率
  • 支持增量构建、热修复、动态下发
  • 为组件化和插件化打下基础

二、iOS 模块化架构设计方案

1. 模块划分方式

按功能、业务域或技术层进行模块拆分:

  • 功能模块:登录模块、支付模块、IM模块等
  • 技术层模块:网络层(Network)、数据层(Storage)、工具库(Utils)

2. 模块组织结构(以 CocoaPods 为例)

1
2
3
4
5
6
7
8
9
10
11
App/
├── AppMain/
│ └── AppDelegate、路由注册入口等
├── Modules/
│ ├── Login/
│ │ ├── LoginModule.podspec
│ │ └── Source/
│ ├── Home/
│ │ └── HomeModule.podspec
│ └── ...
└── Pods/

3. 模块依赖管理工具

  • CocoaPods(最常用,支持本地开发)
  • Swift Package Manager(推荐新项目使用)
  • Carthage(已不太流行)

三、路由机制设计

模块之间不能直接引用,如何在不耦合的前提下跳转页面或调用服务?这就需要路由机制

常见路由框架

  • MGJRouter(轻量、面向 URL 的路由方案)
  • JLRoutes
  • 自研路由中心(支持对象参数、服务调用、路由拦截器)

路由实现核心思想

  1. 注册:每个模块在初始化时向全局路由中心注册自己的路由路径和对应 handler。
  2. 路由表:以 path 为 key,保存 handler。
  3. 调用:其他模块通过 URL 或 identifier 发起路由调用,传参。

四、实践方案示例(MGJRouter)

1. 路由注册(Login 模块中)

1
2
3
4
5
6
7
8
9
#import <MGJRouter/MGJRouter.h>

+ (void)load {
[MGJRouter registerURLPattern:@"myapp://login" toHandler:^(NSDictionary *routerParameters) {
UIViewController *vc = [[LoginViewController alloc] init];
UINavigationController *nav = routerParameters[MGJRouterParameterUserInfo][@"nav"];
[nav pushViewController:vc animated:YES];
}];
}

2. 发起路由调用(Home 模块)

1
2
[MGJRouter openURL:@"myapp://login"
withUserInfo:@{@"nav": self.navigationController}];

五、进阶实践:服务路由 + 解耦通信

1. 定义协议

1
2
3
@protocol UserService <NSObject>
- (BOOL)isLoggedIn;
@end

2. 注册服务实现

1
[Router registerService:@protocol(UserService) withImpl:[UserServiceImpl class]];

3. 获取服务调用

1
2
id<UserService> service = [Router serviceForProtocol:@protocol(UserService)];
BOOL loggedIn = [service isLoggedIn];

六、推荐实践建议

  • 路由机制与模块初始化解耦,可结合 AOP(例如 +loadRouterRegister 注册文件自动管理)
  • URL路由适合页面跳转,协议路由适合服务调用
  • 路由支持中间件拦截(如登录校验)
  • 模块间只暴露接口,禁止直接引用源文件

七、参考项目结构建议

1
2
3
4
5
6
7
8
9
10
11
Modules/
├── Login/
│ └── LoginModule/
│ ├── Interface/
│ │ └── LoginService.h
│ └── Impl/
│ └── LoginViewController.m
├── Router/
│ └── RouterCenter/
│ ├── MGJRouter 封装
│ └── 服务注册表