Swiftで学ぶClean Architecture
Clean Architecture(クリーンアーキテクチャ)は、Robert C. Martin(通称 Uncle Bob)が提唱した、ソフトウェアアーキテクチャの一つです。Clean Architectureは、ソフトウェアシステムをレイヤーで分割し、各レイヤーがどのような役割を持ち、どのようにコードを構造化するかを明確にすることで、システムの保守性、テスト可能性、柔軟性を高めることを目的としています。
本記事では、Swiftを用いてClean Architectureを実践するための手順を説明します。具体的には、以下の3つのレイヤーを用意し、それぞれの責務を明確にします。
- Domain Layer(ドメイン層)
- Data Layer(データ層)
- Presentation Layer(プレゼンテーション層)
Domain Layer
Domain Layerは、アプリケーションのビジネスロジックを表現するレイヤーです。このレイヤーには、以下の要素が含まれます。
Entities(エンティティ)
Use Cases(ユースケース)
Repositories(リポジトリ)
エンティティは、ビジネスロジックにおける重要なオブジェクトを表現するためのクラスや構造体です。ユースケースは、アプリケーションのビジネスルールを表現するためのクラスや構造体です。リポジトリは、データ層とのインターフェースを提供するためのプロトコルです。
以下は、エンティティの例です。
// MARK: - Entity
struct User {
let id: Int
let name: String
let email: String
let age: Int?
}
Data Layer
Data Layerは、データの永続化やネットワーク通信など、外部のリソースとのやりとりを担当するレイヤーです。このレイヤーには、以下の要素が含まれます。
Repositories(リポジトリ)
Data Sources(データソース)
リポジトリは、Domain Layerとのインターフェースを提供するためのプロトコルです。データソースは、リポジトリが実際にデータを取得するための実装です。
以下は、リポジトリの例です。
// MARK: - Repository
protocol UserRepository {
func fetchAllUsers() -> [User]
}
class UserRepositoryImpl: UserRepository {
func fetchAllUsers() -> [User] {
// データベースやAPIからユーザー情報を取得する処理
let user1 = User(id: 1, name: "John", email: "hoge@o.vom", age: 23)
let user2 = User(id: 2, name: "Jane", email: "hage@o.vom", age: 22)
return [user1, user2]
}
}
Presentation Layer
Presentation Layerは、ユーザーインターフェースを担当するレイヤーです。このレイヤーには、以下の要素が含まれます。
View Models(ビューモデル)
Views(ビュー)
ビューモデルは、ビジネスロジックを表現するためのクラスや構造体です。ビューは、ユーザーインターフェースを表現するためのクラスや構造体です。
以下は、ビューモデルの例です。
// MARK: - View Model
class UserListViewModel {
private let userRepository: UserRepository
init(userRepository: UserRepository) {
self.userRepository = userRepository
}
func fetchAllUsers() -> [User] {
return userRepository.fetchAllUsers()
}
}
ビューモデルは、ユースケースに応じてデータを取得し、ビューに表示するためのインターフェースを提供します。
最後に、ビューの例を示します。
// MARK: - View
class UserListViewController: UIViewController {
private var viewModel: UserListViewModel!
override func viewDidLoad() {
super.viewDidLoad()
let userRepository = UserRepositoryImpl()
viewModel = UserListViewModel(userRepository: userRepository)
let users = viewModel.fetchAllUsers()
print("ユーザ情報: \(users)")
// ユーザ情報: [CleanArchitectureSample.User(id: 1, name: "John", email: "hoge@o.vom", age: Optional(23)), CleanArchitectureSample.User(id: 2, name: "Jane", email: "hage@o.vom", age: Optional(22))]
}
}
ビューは、ビューモデルを介してデータを取得し、処理を行います。
以上が、Swiftを用いたClean Architectureの実践手順です。各レイヤーの役割を明確にし、それぞれの責務を分離することで、システムの保守性、テスト可能性、柔軟性を高めることができます。