はじめに
Swiftで書かれたシンプルなTODOリストアプリケーションがありますが、このコードは非単一責任の原則に従っていません。この記事では、このプロジェクトをリファクタリングしてMVVMアーキテクチャと単一責任の原則に従うように変更するプロセスを紹介します。この問題を通じて、MVVMと単一責任の原則の基本を理解し、実際に適用する方法を学びます。
Swiftプロジェクトのリファクタリング: MVVMと単一責任の原則を学ぶ
問題: TODOリストアプリのリファクタリング
既存のプロジェクトは以下のコードで構成されています。このコードは単一責任の原則に従っていないため、リファクタリングが必要です。
import UIKit
class TodoViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!
var todos: [String] = []
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
loadTodos()
}
func loadTodos() {
// 仮に、データのロードロジック
todos = ["Task 1", "Task 2", "Task 3"]
}
// MARK: - Table view data source
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return todos.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TodoCell", for: indexPath)
cell.textLabel?.text = todos[indexPath.row]
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// タスクの完了ロジック
todos.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .automatic)
}
}解答方法
このプロジェクトをリファクタリングするには、以下の手順を実行します。
- モデルの作成:
Todoモデルを作成し、タスクの名前と完了状態を保持します。 - ViewModelの作成:
TodoViewModelクラスを作成し、タスクの追加、削除、およびロードのロジックを管理します。 - ビューコントローラのリファクタリング:
TodoViewControllerをリファクタリングして、TodoViewModelのインスタンスを使用してデータを操作します。
解答
以下は、リファクタリング後のプロジェクトのコードです。
1 モデルの作成
// File: Todo.swift
import Foundation
struct Todo {
var name: String
var isCompleted: Bool
}2 ViewModelの作成
// File: TodoViewModel.swift
import Foundation
class TodoViewModel {
private(set) var todos: [Todo] = []
func loadTodos() {
// 仮のデータロードロジック
todos = [Todo(name: "Task 1", isCompleted: false), Todo(name: "Task 2", isCompleted: false), Todo(name: "Task 3", isCompleted: false)]
}
func addTodo(_ todo: Todo) {
todos.append(todo)
}
func deleteTodo(at index: Int) {
todos.remove(at: index)
}
}3 ビューコントローラのリファクタリング
// File: TodoViewController.swift
import UIKit
class TodoViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
var viewModel = TodoViewModel()
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
viewModel.loadTodos()
}
}
extension TodoViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return viewModel.todos.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TodoCell", for: indexPath)
cell.textLabel?.text = viewModel.todos[indexPath.row].name
return cell
}
}
extension TodoViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
viewModel.deleteTodo(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .automatic)
}
}このリファクタリングを通じて、コードはMVVMアーキテクチャと単一責任の原則に従うようになりました。これにより、各クラスとファイルが1つの明確な責任を持つようになり、コードの整理と保守性が向上しました。
まとめ
この記事では、Swiftで書かれたシンプルなTODOリストアプリケーションのリファクタリングプロセスを通じて、MVVMアーキテクチャと単一責任の原則を学びました。これらの原則を理解し適用することで、よりクリーンで保守しやすいコードを書くことができます。


コメント