クリーンアーキテクチャは、ソフトウェアの設計において重要な概念です。
その中で、エンティティは最も中心的な位置を占めています。
この記事では、エンティティの役割と実装方法について、具体的な Python コードを交えて解説します。
エンティティとは
クリーンアーキテクチャにおいて、エンティティは以下のような特徴を持ちます。
- ビジネスルールをカプセル化する
- システムの中で最も変更されにくい部分
- 外部の要素(データベースやUIなど)に依存しない
エンティティは、アプリケーションの核となるビジネスロジックを表現します。
例えば、銀行システムにおける「口座」や、ECサイトにおける「商品」などがエンティティに該当します。
Python でのエンティティの実装例
では、具体的な Python コードを見てみましょう。
ECサイトの「商品」エンティティを例に実装してみます。
product.py
from dataclasses import dataclass from decimal import Decimal from typing import Optional @dataclass class Product: id: str name: str price: Decimal stock: int description: Optional[str] = None def is_available(self) -> bool: return self.stock > 0 def apply_discount(self, discount_percent: float) -> None: if not 0 <= discount_percent <= 100: raise ValueError("Discount percent must be between 0 and 100") self.price = self.price * Decimal(1 - discount_percent / 100) def restock(self, quantity: int) -> None: if quantity < 0: raise ValueError("Restock quantity must be positive") self.stock += quantity
このコードでは、`Product` クラスが商品エンティティを表現しています。
エンティティの特徴
ビジネスルールのカプセル化
is_available()
メソッドは、商品が購入可能かどうかを判断するビジネスルールを表現しています。apply_discount()
メソッドは、割引を適用する際のルールを含んでいます。restock()
メソッドは、在庫補充のルールを定義しています。
変更されにくい部分
商品の基本的な属性(ID、名前、価格、在庫数、説明)は、システムの他の部分が変更されても、大きく変わることはありません。
外部要素への非依存
このエンティティは、データベースやUIなどの外部要素に依存していません。
純粋にビジネスロジックのみを含んでいます。
使用例
この `Product` エンティティは以下のように使用できます。
main.py
from product import Product from decimal import Decimal # ガター内の緑色のボタンを押すとスクリプトを実行します。 if __name__ == '__main__': # 商品の作成 book = Product("1", "Python Programming", Decimal("29.99"), 100, "Learn Python programming") # 商品が購入可能かチェック print(book.is_available()) # True # 割引の適用 book.apply_discount(10) print(book.price) # Decimal('26.99') # 在庫の追加 book.restock(50) print(book.stock) # 150 # 在庫切れの商品 out_of_stock_item = Product("2", "Sold Out Item", Decimal("9.99"), 0) print(out_of_stock_item.is_available()) # False
エンティティの重要性
エンティティは以下の理由で重要です。
- ビジネスロジックの中心: アプリケーションの核となるロジックを表現し、ビジネスルールを守ります。
- テスト容易性: 外部依存がないため、単体テストが容易です。
- 再利用性: ビジネスロジックが分離されているため、異なるインターフェースやデータベースと組み合わせて再利用できます。
- 保守性: ビジネスルールの変更が必要な場合、エンティティのみを修正すれば良いため、保守が容易です。
まとめ
クリーンアーキテクチャにおけるエンティティは、アプリケーションの中心的な役割を果たします。
ビジネスルールをカプセル化し、外部要素に依存しない設計により、柔軟で保守性の高いシステムを構築することができます。
Python での実装例を通じて、エンティティの具体的な姿を見ることができました。
これらの原則を理解し、適切に実装することで、より堅牢で柔軟なソフトウェア設計が可能になります。