Python上級

上級 Pythonで学ぶクリーンアーキテクチャ|練習問題編

導入

クリーンアーキテクチャは、ソフトウェアの設計において、依存関係の管理やテストの容易さを重視するアプローチです。特に、複雑なビジネスロジックを持つシステムにおいて、その真価を発揮します。本記事では、実際の業務におけるシナリオを通じて、クリーンアーキテクチャの適用方法を探ります。

教科書レベルの解説(クリーンアーキテクチャ)

重要な概念の整理

クリーンアーキテクチャの中心的な考え方は、ビジネスロジックを他の関心事から分離することです。この分離により、変更が必要な際に影響範囲を最小限に抑えることが可能になります。具体的には、以下の層に分かれています:

  • エンティティ層: ビジネスルールを定義します。
  • ユースケース層: エンティティを利用してアプリケーションのビジネスロジックを実行します。
  • インターフェース層: 外部システムとの通信を管理します。
  • フレームワーク層: データベースやUIなど、外部の技術に依存します。

コード例(Python)


class User:
    def __init__(self, user_id, name):
        self.user_id = user_id
        self.name = name

class UserRepository:
    def __init__(self):
        self.users = {}

    def add_user(self, user):
        self.users[user.user_id] = user

    def get_user(self, user_id):
        return self.users.get(user_id)

class UserService:
    def __init__(self, user_repository):
        self.user_repository = user_repository

    def create_user(self, user_id, name):
        user = User(user_id, name)
        self.user_repository.add_user(user)

    def fetch_user(self, user_id):
        return self.user_repository.get_user(user_id)

# 使用例
repo = UserRepository()
service = UserService(repo)
service.create_user(1, 'Alice')
user = service.fetch_user(1)
print(user.name)  # Alice

コードの行ごとの解説

  1. Userクラス: ユーザーの基本情報を保持するエンティティ。
  2. UserRepositoryクラス: ユーザーの永続化を担当するリポジトリ。
  3. UserServiceクラス: ビジネスロジックを実行し、リポジトリとエンティティを連携させるサービス。
  4. 使用例: サービスを通じてユーザーを作成し、取得する流れを示しています。

練習問題編

以下の練習問題を通じて、クリーンアーキテクチャの理解を深めてください。

  1. 問題1: Userクラスにメールアドレスを追加してみてください。どのように変更を加えますか?
  2. 模範解答: Userクラスにメールアドレスの属性を追加し、コンストラクタで受け取るようにします。

  3. 問題2: UserServiceクラスにユーザーの削除機能を追加してください。
  4. 模範解答: UserServiceにdelete_userメソッドを追加し、UserRepositoryの削除メソッドを呼び出します。

  5. 問題3: UserRepositoryに全ユーザーを取得するメソッドを追加してください。
  6. 模範解答: UserRepositoryにget_all_usersメソッドを追加し、ユーザーのリストを返すようにします。

  7. 問題4: ユーザー情報を更新するメソッドをUserServiceに追加してください。
  8. 模範解答: UserServiceにupdate_userメソッドを追加し、UserRepositoryを通じてユーザー情報を更新します。

まとめ

  • クリーンアーキテクチャは、ビジネスロジックの分離を実現します。
  • 具体的なシナリオを通じて、実務に役立つ設計手法を習得できました。
  • 練習問題を解くことで、理解を深めることができます。