Swiftプロジェクトのリファクタリング: MVVMと単一責任の原則を学ぶ

AI

はじめに

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)
    }
}

解答方法

このプロジェクトをリファクタリングするには、以下の手順を実行します。

  1. モデルの作成: Todoモデルを作成し、タスクの名前と完了状態を保持します。
  2. ViewModelの作成: TodoViewModelクラスを作成し、タスクの追加、削除、およびロードのロジックを管理します。
  3. ビューコントローラのリファクタリング: 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アーキテクチャと単一責任の原則を学びました。これらの原則を理解し適用することで、よりクリーンで保守しやすいコードを書くことができます。

コメント

タイトルとURLをコピーしました