ホームページ >バックエンド開発 >Python チュートリアル >ヘキサゴナル アーキテクチャとドメイン駆動設計による保守可能な Python アプリケーションの構築
今日のペースの速いソフトウェア開発環境では、保守、適応、拡張が容易なアプリケーションを構築することが非常に重要です。ヘキサゴナル アーキテクチャ (ポートおよびアダプタとも呼ばれる) とドメイン駆動設計 (DDD) は、これらの課題に対処するための効果的な組み合わせです。ヘキサゴナル アーキテクチャは、懸念事項の明確な分離を促進し、コア ロジックを中断することなく、システムの一部の交換、テスト、または強化を容易にします。一方、DDD は、コードを現実世界のビジネス概念に合わせて調整することに重点を置き、システムの直観性と復元力を確保します。これらのアプローチを組み合わせることで、開発者は堅牢で回復力があり、要件の変化や将来の成長にシームレスに適応するように設計されたシステムを構築できます。
ポートおよびアダプター パターンとしても知られる六角形アーキテクチャは、従来の層状アーキテクチャの堅固さと複雑さに対処するために、Alistair Cockburn によって導入されました。その主な目標は、アプリケーションのコア ロジック (ドメイン) を外部システムから独立させ、テスト、メンテナンス、適応性を容易にすることです。
ヘキサゴナル アーキテクチャの中核では、アプリケーションを 3 つの主要な層に分割します。
コア (ビジネス ロジック/ドメイン): ビジネス ルールとドメイン ロジックが存在するシステムの中心部。この層は独立しており、外部ライブラリやフレームワークに依存しません。
例: ローンの利息を計算するか、ビジネス ルールに対するユーザーのアクションを検証します。
ポート (インターフェース): コアが外部とやり取りする方法の抽象的な定義 (インターフェースやプロトコルなど)。ポートは、ユースケースまたはアプリケーション固有の API を表します。 どのようにを指定することなく、何をする必要があるかを定義します。
例: リポジトリ ポートは、次のようなデータ ソースと対話するメソッドを定義します。
src/ports/repository.py from abc import ABC, abstractmethod from typing import List from src.entities import Entity class Repository(ABC): @abstractmethod def get(self, id: str) -> Entity: pass @abstractmethod def insert(self, entity: Entity) -> None: pass @abstractmethod def update(self, entity: Entity) -> None: pass
# src/adapters/postgres_repository.py from sqlalchemy import create_engine, Column, String from sqlalchemy.orm import declarative_base, sessionmaker from src.entities import Entity from src.ports.repository import Repository Base = declarative_base() # Define the database table for Entity class EntityModel(Base): __tablename__ = "entities" id = Column(String, primary_key=True) name = Column(String, nullable=False) description = Column(String) class PostgresRepository(Repository): def __init__(self, db_url: str): """ Initialize the repository with the PostgreSQL connection URL. Example db_url: "postgresql+psycopg2://username:password@host:port/dbname" """ self.engine = create_engine(db_url) Base.metadata.create_all(self.engine) self.Session = sessionmaker(bind=self.engine) def get(self, id: str) -> Entity: session = self.Session() try: entity_model = session.query(EntityModel).filter_by(id=id).first() if not entity_model: raise ValueError(f"Entity with id {id} not found") return Entity(id=entity_model.id, name=entity_model.name, description=entity_model.description) finally: session.close() def insert(self, entity: Entity) -> None: session = self.Session() try: entity_model = EntityModel(id=entity.id, name=entity.name, description=entity.description) session.add(entity_model) session.commit() finally: session.close() def update(self, entity: Entity) -> None: session = self.Session() try: entity_model = session.query(EntityModel).filter_by(id=entity.id).first() if not entity_model: raise ValueError(f"Entity with id {entity.id} not found") entity_model.name = entity.name entity_model.description = entity.description session.commit() finally: session.close()
アーキテクチャは多くの場合、六角形として視覚化され、コアと対話する複数の方法を象徴しており、それぞれの側面が異なるアダプターまたはポートを表します。
ドメイン駆動設計 (DDD) は、ビジネス目標と、その目標を達成するために構築されるソフトウェアとの間の緊密な連携を重視するソフトウェア設計アプローチです。この方法論は、Eric Evans によって著書 ドメイン駆動設計: ソフトウェアの中心部の複雑さに取り組む で紹介されました。
DDD の核心は、ドメイン専門家の助けを借りてドメイン (ビジネス上の問題空間) を理解してモデル化し、その理解をソフトウェア システムに変換することに重点を置いています。 DDD はドメインの分離を促進し、システムのさまざまな部分が独立しており、明確で管理しやすい状態を維持します。
ドメイン駆動設計の主要な概念:
ドメイン: ソフトウェアが扱う特定の知識または活動の領域。たとえば、銀行アプリケーションでは、ドメインには口座、取引、顧客などの概念が含まれます。
ユビキタス言語: 開発者とドメイン専門家によって共同開発された共通言語。この共有語彙により、すべての関係者間での明確なコミュニケーションと一貫した理解が保証されます。
エンティティと値オブジェクト:
集計: データ変更の単一単位として扱われる関連エンティティと値オブジェクトのクラスター。各アグリゲートには、クラスター全体の整合性を保証するルート エンティティがあります。
リポジトリ: 集計を取得および保存するメカニズム。データ アクセスに対する抽象化レイヤーを提供します。
サービス: エンティティや値オブジェクトには本来は適合しないが、支払いの処理など、ドメインにとって不可欠な操作またはプロセス。
src/ports/repository.py from abc import ABC, abstractmethod from typing import List from src.entities import Entity class Repository(ABC): @abstractmethod def get(self, id: str) -> Entity: pass @abstractmethod def insert(self, entity: Entity) -> None: pass @abstractmethod def update(self, entity: Entity) -> None: pass
ドメイン駆動設計 (DDD) は、主に複雑なビジネス ロジックの課題に対処することに重点を置いた包括的な方法論であるため、このセクションでは、ドメイン駆動設計 (DDD) の実装の詳細な例は示しません。 DDD は、複雑なビジネス ルールの構築と管理に優れていますが、その可能性を十分に発揮し、他のコーディングの問題に対処するには、補完的なアーキテクチャ フレームワーク内で利用するのが最適です。したがって、次のセクションでは、ドメイン駆動設計をヘキサゴナル アーキテクチャと組み合わせて、その長所を強調し、ビジネス ロジックを超えた追加のコーディング問題を解決するための強固な基盤を提供します。
ドメイン駆動設計 (DDD) とヘキサゴナル アーキテクチャは、明確な境界を強調し、ソフトウェアをビジネス ニーズに合わせることで相互に補完します。 DDD は、コア ドメインのモデル化とビジネス ロジックの分離に重点を置いていますが、ヘキサゴナル アーキテクチャでは、このロジックがポートとアダプターを通じて外部システムから独立した状態を維持できるようにします。これらは、個別ではあるが補完的な懸念事項に対処します:
フレームワークとしての六角形アーキテクチャ:
コア ロジックとしてのドメイン駆動設計:
これらを組み合わせることで、ドメインが中心となり、インフラストラクチャやテクノロジーの変更から隔離された、スケーラブルでテスト可能な柔軟なシステムが実現します。この相乗効果により、進化するビジネス要件に簡単に適応できる堅牢な設計が保証されます。
次のセクションでは、ドメイン駆動設計 (DDD) とヘキサゴナル アーキテクチャがどのように連携して堅牢で保守性が高く、適応性のあるソフトウェア システムを作成するかを示す実践的な例を示します。
このプロジェクトは、ヘキサゴナル アーキテクチャとドメイン駆動設計 (DDD) を適用して、スケーラブルで保守可能なシステムを作成し、アプリケーション開発のための最新かつ堅牢な基盤を提供します。 Python で構築されており、Web フレームワークとして FastAPI を使用し、データベースとして DynamoDB を使用します。
プロジェクトは次のように構成されています:
src/ports/repository.py from abc import ABC, abstractmethod from typing import List from src.entities import Entity class Repository(ABC): @abstractmethod def get(self, id: str) -> Entity: pass @abstractmethod def insert(self, entity: Entity) -> None: pass @abstractmethod def update(self, entity: Entity) -> None: pass
ソース コードは私の GitHub リポジトリにあります。
ヘキサゴナル アーキテクチャとドメイン駆動設計 (DDD) を Python アプリケーションに組み込むことで、保守可能で適応性があり、ビジネス目標と密接に連携したシステムの開発が促進されます。ヘキサゴナル アーキテクチャにより、コア ビジネス ロジックと外部システムが明確に分離され、柔軟性とテストの容易さが促進されます。 DDD はドメインを正確にモデリングすることを重視しており、その結果、ビジネス プロセスとルールを真に反映したソフトウェアが得られます。これらの方法論を統合することで、開発者は現在の要件を満たすだけでなく、将来のビジネス ニーズに合わせて進化する準備が整った堅牢なアプリケーションを作成できます。
この記事が気に入ったら連絡してください!
以上がヘキサゴナル アーキテクチャとドメイン駆動設計による保守可能な Python アプリケーションの構築の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。