クリーンアーキテクチャは、ソフトウェアの設計において重要な概念です。
その中で、エンティティは最も中心的な位置を占めています。
この記事では、エンティティの役割と実装方法について、具体的な 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 での実装例を通じて、エンティティの具体的な姿を見ることができました。
これらの原則を理解し、適切に実装することで、より堅牢で柔軟なソフトウェア設計が可能になります。

