レイヤードアーキテクチャは、アプリケーションを層に分割することで、設計の明確さ、保守性、再利用性を向上させる手法です。しかし、アプリケーションが成長するにつれて、コードが複雑になり、リファクタリングが必要になることがあります。この教材では、レイヤードアーキテクチャを用いたリファクタリングの手法を具体的なサンプルコードを使って学びます。
アプリケーションが成長するにつれて、以下のような問題が発生することがあります。
これらの問題を解決するためには、コードをリファクタリングし、よりクリーンで理解しやすい構造にすることが重要です。
このセクションでは、簡単なタスク管理アプリケーションを例にとります。このアプリケーションは、タスクを追加し、リスト表示する機能を持っています。初めはシンプルな構造ですが、リファクタリングを通じて改善していきます。
以下は、初期の簡単なタスク管理アプリケーションのコードです。
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()
最初のリファクタリング手法は、単一責任の原則を適用することです。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
クラスが新たに作成され、タスクの表示に特化しました。このようにすることで、各クラスの役割が明確になり、後の変更が容易になります。次に、タスクの表示の方法を柔軟にするために、依存性の注入を適用します。これにより、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
メソッドを追加し、タスクの取得を行います。これにより、タスクの管理と表示の間に明確なインターフェースが設けられ、依存性が減少します。リファクタリングを通じて、コードの可読性、保守性が向上しました。レイヤードアーキテクチャを適用することで、アプリケーションの構造を明確にし、将来的な変更や拡張を容易にすることができます。今後は、さらに複雑な機能を追加する際にも、このアーキテクチャの原則を適用していくことが重要です。