導入
ドメイン駆動設計(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)
コードの行ごとの解説
- Productクラス: 商品の情報を持つエンティティ。商品ID、名前、価格を属性として持つ。
- Orderクラス: 注文を表すエンティティ。注文IDを持ち、複数の商品のリストを管理する。
- add_productメソッド: 注文に商品を追加するメソッド。ここでは、商品のインスタンスを受け取る。
- total_priceメソッド: 注文内の全商品の価格を合計して返すメソッド。リスト内包表記を使用して効率的に計算。
練習問題編
以下に練習問題を用意しました。各問題に対する模範解答と解説も含めています。
- 問題1: Productクラスに、在庫数を管理するための属性を追加してください。
- 模範解答:
class Product: def __init__(self, product_id, name, price, stock): self.product_id = product_id self.name = name self.price = price self.stock = stock - 問題2: Orderクラスに、注文が完了したかどうかを示す属性を追加してください。
- 模範解答:
class Order: def __init__(self, order_id): self.order_id = order_id self.products = [] self.is_completed = False - 問題3: Orderクラスに、全商品を表示するメソッドを追加してください。
- 模範解答:
class Order: # 既存のコード... def display_products(self): for product in self.products: print(f'Product ID: {product.product_id}, Name: {product.name}, Price: {product.price}')
まとめ
- ドメイン駆動設計は、ビジネスロジックを明確に表現するための強力な手法である。
- エンティティやバリューオブジェクトを適切に設計することで、システムの柔軟性が向上する。
- 実際の業務において、ドメインモデルを理解し、適用する能力が求められる。