Python上級

上級 Pythonで学ぶドメイン駆動設計|ケーススタディ編

導入

ドメイン駆動設計(DDD)は、ソフトウェア開発においてビジネスの複雑さを効果的に管理する手法として注目されています。本記事では、架空のプロジェクトを通じて、Pythonを用いたDDDの具体的な適用方法を探ります。プロジェクトのテーマは「オンライン書店」で、ユーザーが書籍を購入する際のシステムを設計します。

教科書レベルの解説(ドメイン駆動設計)

重要な概念の整理

ドメイン駆動設計は、ビジネスのドメイン(領域)を深く理解し、それをソフトウェアの設計に反映させるアプローチです。以下の概念が特に重要です:

  • エンティティ:一意の識別子を持ち、ライフサイクルを通じて変化するオブジェクト。
  • 値オブジェクト:属性によって識別され、変更不可のオブジェクト。
  • アグリゲート:エンティティと値オブジェクトを組み合わせた集合体で、一貫性を保つ単位。
  • リポジトリ:アグリゲートの保存と取得を管理するパターン。

コード例(Python)


class Book:
    def __init__(self, title, author, price):
        self.title = title
        self.author = author
        self.price = price

class Order:
    def __init__(self):
        self.books = []
    
    def add_book(self, book):
        self.books.append(book)
    
    def total_price(self):
        return sum(book.price for book in self.books)

class BookRepository:
    def __init__(self):
        self.books = {}
    
    def add(self, book):
        self.books[book.title] = book
    
    def get(self, title):
        return self.books.get(title)

コードの行ごとの解説

  1. Bookクラス:書籍の属性(タイトル、著者、価格)を持つエンティティ。
  2. Orderクラス:書籍のリストを管理し、合計価格を計算するメソッドを持つアグリゲート。
  3. BookRepositoryクラス:書籍を保存・取得するためのリポジトリ。書籍のタイトルをキーにして管理。

ケーススタディ編

オンライン書店のプロジェクトでは、ユーザーが書籍をカートに追加し、最終的に購入する流れを考えます。初期の設計では、すべてのビジネスロジックがOrderクラスに集約されていました。しかし、書籍の在庫管理や価格の変更が加わるにつれ、Orderクラスが肥大化し、保守が難しくなりました。この状況を改善するために、以下のポイントを考慮しました:

  • 書籍の在庫管理を別のクラス(Inventory)に分離し、責任を明確化。
  • 価格変更が頻繁に発生するため、Priceクラスを導入し、値オブジェクトとして管理。

このように、ドメイン駆動設計を適用することで、システムの拡張性と保守性が向上しました。

まとめ

  • ドメイン駆動設計は、ビジネスの複雑さを管理するための強力な手法。
  • エンティティ、値オブジェクト、アグリゲートを明確に定義することで、システムの構造が整理される。
  • ケーススタディを通じて、実際の業務での適用方法とその改善点を理解できる。