Python上級

上級 Pythonで学ぶドメイン駆動設計|練習問題編

導入

ドメイン駆動設計(DDD)は、システムの複雑さを管理するための強力なアプローチです。実務では、特にビジネスロジックが複雑なアプリケーションにおいて、その効果を発揮します。ここでは、ドメインモデルを構築する際に直面する具体的なシチュエーションに焦点を当て、実務での適用例を通じて理解を深めます。

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

重要な概念の整理

ドメイン駆動設計の中心には、ドメインモデルがあります。これはビジネスのルールやプロセスを反映したモデルであり、以下の要素が含まれます:

  • エンティティ: 一意の識別子を持ち、ライフサイクルを通じて状態が変わるオブジェクト。
  • バリューオブジェクト: 同一性を持たず、属性のみで比較されるオブジェクト。
  • アグリゲート: 関連するエンティティとバリューオブジェクトをまとめた集合。
  • リポジトリ: エンティティの永続化を管理するインターフェース。

これらの要素を適切に設計することで、ビジネスロジックを明確に表現し、変更に強いシステムを構築できます。

コード例(Python)


class Product:
    def __init__(self, product_id, name, price):
        self.product_id = product_id
        self.name = name
        self.price = price

class Order:
    def __init__(self, order_id):
        self.order_id = order_id
        self.products = []

    def add_product(self, product):
        self.products.append(product)

    def total_price(self):
        return sum(product.price for product in self.products)

コードの行ごとの解説

  1. Productクラス: 商品の情報を持つエンティティ。商品ID、名前、価格を属性として持つ。
  2. Orderクラス: 注文を表すエンティティ。注文IDを持ち、複数の商品のリストを管理する。
  3. add_productメソッド: 注文に商品を追加するメソッド。ここでは、商品のインスタンスを受け取る。
  4. total_priceメソッド: 注文内の全商品の価格を合計して返すメソッド。リスト内包表記を使用して効率的に計算。

練習問題編

以下に練習問題を用意しました。各問題に対する模範解答と解説も含めています。

  1. 問題1: Productクラスに、在庫数を管理するための属性を追加してください。
  2. 模範解答:
    
    class Product:
        def __init__(self, product_id, name, price, stock):
            self.product_id = product_id
            self.name = name
            self.price = price
            self.stock = stock
    
  3. 問題2: Orderクラスに、注文が完了したかどうかを示す属性を追加してください。
  4. 模範解答:
    
    class Order:
        def __init__(self, order_id):
            self.order_id = order_id
            self.products = []
            self.is_completed = False
    
  5. 問題3: Orderクラスに、全商品を表示するメソッドを追加してください。
  6. 模範解答:
    
    class Order:
        # 既存のコード...
        
        def display_products(self):
            for product in self.products:
                print(f'Product ID: {product.product_id}, Name: {product.name}, Price: {product.price}')
    

まとめ

  • ドメイン駆動設計は、ビジネスロジックを明確に表現するための強力な手法である。
  • エンティティやバリューオブジェクトを適切に設計することで、システムの柔軟性が向上する。
  • 実際の業務において、ドメインモデルを理解し、適用する能力が求められる。