<一覧に戻る

レイヤードアーキテクチャのリファクタリング手法

レイヤードアーキテクチャは、アプリケーションを層に分割することで、設計の明確さ、保守性、再利用性を向上させる手法です。しかし、アプリケーションが成長するにつれて、コードが複雑になり、リファクタリングが必要になることがあります。この教材では、レイヤードアーキテクチャを用いたリファクタリングの手法を具体的なサンプルコードを使って学びます。

1. リファクタリングの必要性

アプリケーションが成長するにつれて、以下のような問題が発生することがあります。

  • コードの重複
  • 複雑な依存関係
  • テストの困難さ

これらの問題を解決するためには、コードをリファクタリングし、よりクリーンで理解しやすい構造にすることが重要です。

2. サンプルアプリケーションの概要

このセクションでは、簡単なタスク管理アプリケーションを例にとります。このアプリケーションは、タスクを追加し、リスト表示する機能を持っています。初めはシンプルな構造ですが、リファクタリングを通じて改善していきます。

初期コード

以下は、初期の簡単なタスク管理アプリケーションのコードです。

class Task:
    def __init__(self, title, completed=False):
        self.title = title
        self.completed = completed

class TaskManager:
    def __init__(self):
        self.tasks = []

    def add_task(self, title):
        task = Task(title)
        self.tasks.append(task)

    def list_tasks(self):
        for idx, task in enumerate(self.tasks):
            status = "✓" if task.completed else "✗"
            print(f"{idx + 1}: {task.title} [{status}]")

# 利用例
task_manager = TaskManager()
task_manager.add_task("Learn Python")
task_manager.add_task("Build a web app")
task_manager.list_tasks()

3. リファクタリング手法

3.1. 単一責任の原則の適用

最初のリファクタリング手法は、単一責任の原則を適用することです。TaskManager クラスは、タスクの管理と表示の両方を担当していますので、これを分離します。

リファクタリング後のコード

class Task:
    def __init__(self, title, completed=False):
        self.title = title
        self.completed = completed

class TaskManager:
    def __init__(self):
        self.tasks = []

    def add_task(self, title):
        task = Task(title)
        self.tasks.append(task)

class TaskView:
    @staticmethod
    def display_tasks(tasks):
        for idx, task in enumerate(tasks):
            status = "✓" if task.completed else "✗"
            print(f"{idx + 1}: {task.title} [{status}]")

# 利用例
task_manager = TaskManager()
task_manager.add_task("Learn Python")
task_manager.add_task("Build a web app")
TaskView.display_tasks(task_manager.tasks)

解説

  • TaskManager クラスは、タスクの追加に専念するようにリファクタリングされました。
  • TaskView クラスが新たに作成され、タスクの表示に特化しました。このようにすることで、各クラスの役割が明確になり、後の変更が容易になります。

3.2. 依存性の注入

次に、タスクの表示の方法を柔軟にするために、依存性の注入を適用します。これにより、TaskManager が特定の TaskView に依存しなくなります。

リファクタリング後のコード

class Task:
    def __init__(self, title, completed=False):
        self.title = title
        self.completed = completed

class TaskManager:
    def __init__(self):
        self.tasks = []

    def add_task(self, title):
        task = Task(title)
        self.tasks.append(task)

    def get_tasks(self):
        return self.tasks

class TaskView:
    @staticmethod
    def display_tasks(tasks):
        for idx, task in enumerate(tasks):
            status = "✓" if task.completed else "✗"
            print(f"{idx + 1}: {task.title} [{status}]")

# 利用例
task_manager = TaskManager()
task_manager.add_task("Learn Python")
task_manager.add_task("Build a web app")
task_view = TaskView()
task_view.display_tasks(task_manager.get_tasks())

解説

  • TaskManager クラスに get_tasks メソッドを追加し、タスクの取得を行います。これにより、タスクの管理と表示の間に明確なインターフェースが設けられ、依存性が減少します。

4. まとめ

リファクタリングを通じて、コードの可読性、保守性が向上しました。レイヤードアーキテクチャを適用することで、アプリケーションの構造を明確にし、将来的な変更や拡張を容易にすることができます。今後は、さらに複雑な機能を追加する際にも、このアーキテクチャの原則を適用していくことが重要です。

出力結果: