Skip to content

qhd/CleanArchitectureDemo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 

Repository files navigation

iOS Clean Architecture Demo

项目结构

CleanArchitectureDemo/
├── Application/
│   └── DIContainer.swift              # 依赖注入
│
├── Core/                               # 共享层(所有 Feature 可用)
│   └── Network/
│       └── NetworkError.swift         # 通用网络错误
│
├── Features/                           # 功能模块
│   └── Users/                          # 用户模块(完整独立)
│       ├── Domain/                     # 业务层
│       │   ├── User.swift
│       │   ├── UserRepositoryProtocol.swift
│       │   ├── FetchUsersUseCase.swift
│       │   └── SearchUsersUseCase.swift
│       ├── Data/                       # 数据层
│       │   ├── UserDTO.swift
│       │   ├── UserRepository.swift
│       │   ├── UserRemoteDataSource.swift
│       │   └── UserLocalDataSource.swift
│       └── Presentation/               # 表现层
│           ├── UsersViewModel.swift
│           ├── UsersViewController.swift
│           └── UserCell.swift
│
├── AppDelegate.swift
└── SceneDelegate.swift

调用流程图

┌─────────────────────────────────────────────────────────────────────────────┐
│                              用户操作                                        │
│                                 │                                           │
│                                 ▼                                           │
│  ┌─────────────────────────────────────────────────────────────────────┐   │
│  │                     Presentation Layer                               │   │
│  │  ┌──────────────────────┐      ┌──────────────────────┐             │   │
│  │  │  UsersViewController │─────▶│    UsersViewModel    │             │   │
│  │  │                      │      │                      │             │   │
│  │  │  • 显示 UI           │◀─────│  • 处理 UI 逻辑       │             │   │
│  │  │  • 响应用户操作       │ 状态  │  • 调用 UseCase      │             │   │
│  │  │  • 绑定 ViewModel    │ 更新  │  • 转换数据格式       │             │   │
│  │  └──────────────────────┘      └──────────┬───────────┘             │   │
│  └───────────────────────────────────────────┼─────────────────────────┘   │
│                                              │                              │
│                                              │ 调用                         │
│                                              ▼                              │
│  ┌─────────────────────────────────────────────────────────────────────┐   │
│  │                       Domain Layer                                   │   │
│  │  ┌──────────────────────┐      ┌──────────────────────┐             │   │
│  │  │   FetchUsersUseCase  │      │       User           │             │   │
│  │  │                      │      │      (Entity)        │             │   │
│  │  │  • 执行业务逻辑       │─────▶│                      │             │   │
│  │  │  • 调用 Repository   │ 返回  │  • id, name, email   │             │   │
│  │  │                      │      │  • 业务属性/方法      │             │   │
│  │  └──────────┬───────────┘      └──────────────────────┘             │   │
│  │             │                                                        │   │
│  │             │ 依赖协议                  ┌──────────────────────┐     │   │
│  │             │◀─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─│ UserRepositoryProtocol│     │   │
│  │             │         依赖倒置          │       (接口)          │     │   │
│  └─────────────┼──────────────────────────┴──────────────────────┴─────┘   │
│                │                                     ▲                      │
│                │ 调用接口                             │ 实现                 │
│                ▼                                     │                      │
│  ┌─────────────────────────────────────────────────────────────────────┐   │
│  │                        Data Layer                                    │   │
│  │  ┌──────────────────────┐                                           │   │
│  │  │    UserRepository    │──────────────────────┐                    │   │
│  │  │      (实现协议)       │                      │                    │   │
│  │  │                      │                      │                    │   │
│  │  │  • 协调数据源         │                      │                    │   │
│  │  │  • 缓存策略          │                      │                    │   │
│  │  │  • DTO → Entity 转换 │                      │                    │   │
│  │  └──────────┬───────────┘                      │                    │   │
│  │             │                                  │                    │   │
│  │             ▼                                  ▼                    │   │
│  │  ┌──────────────────────┐      ┌──────────────────────┐            │   │
│  │  │ UserRemoteDataSource │      │ UserLocalDataSource  │            │   │
│  │  │                      │      │                      │            │   │
│  │  │  • 网络请求 API       │      │  • UserDefaults 缓存  │            │   │
│  │  │  • 返回 UserDTO      │      │  • 返回 UserDTO      │            │   │
│  │  └──────────┬───────────┘      └──────────────────────┘            │   │
│  └─────────────┼───────────────────────────────────────────────────────┘   │
│                │                                                            │
│                ▼                                                            │
│        ┌───────────────┐                                                   │
│        │   网络 / API   │                                                   │
│        │ JSONPlaceholder│                                                   │
│        └───────────────┘                                                   │
└─────────────────────────────────────────────────────────────────────────────┘

简化调用链

User Tap ──▶ ViewController ──▶ ViewModel ──▶ UseCase ──▶ Repository ──▶ DataSource ──▶ API
                  ◀── State ───────◀── Entity ────◀── Entity ───◀── DTO ─────◀── JSON ──┘

依赖方向 vs 数据流向

┌─────────────────────────────────────────────────────────┐
│                                                         │
│   依赖方向(编译时)          数据流向(运行时)           │
│                                                         │
│   Presentation                Presentation              │
│        │                           ▲                    │
│        ▼                           │                    │
│     Domain    ◀─ ─ ┐          Domain                    │
│        │           │               ▲                    │
│        ▼           │               │                    │
│      Data ─ ─ ─ ─ ─┘            Data                    │
│                                    ▲                    │
│   (外层依赖内层)                   │                    │
│   (内层不知道外层)           External API               │
│                                                         │
└─────────────────────────────────────────────────────────┘

各层职责

职责 包含内容
Presentation UI 展示和用户交互 ViewController, ViewModel, View
Domain 核心业务逻辑 Entity, UseCase, Repository Protocol
Data 数据获取和存储 Repository 实现, DataSource, DTO
Core 跨模块共享代码 网络错误、工具类、扩展

关键设计原则

  • 依赖倒置: Domain 层定义 Protocol,Data 层实现
  • 单一职责: 每个 UseCase 只做一件事
  • 关注点分离: Entity/DTO/ViewData 各司其职
  • Feature-based 组织: 按功能模块而非层级组织代码

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages