ヘキサゴナル アーキテクチャとドメイン駆動設計による保守可能な Python アプリケーションの構築
今日のペースの速いソフトウェア開発環境では、保守、適応、拡張が容易なアプリケーションを構築することが非常に重要です。ヘキサゴナル アーキテクチャ (ポートおよびアダプタとも呼ばれる) とドメイン駆動設計 (DDD) は、これらの課題に対処するための効果的な組み合わせです。ヘキサゴナル アーキテクチャは、懸念事項の明確な分離を促進し、コア ロジックを中断することなく、システムの一部の交換、テスト、または強化を容易にします。一方、DDD は、コードを現実世界のビジネス概念に合わせて調整することに重点を置き、システムの直観性と復元力を確保します。これらのアプローチを組み合わせることで、開発者は堅牢で回復力があり、要件の変化や将来の成長にシームレスに適応するように設計されたシステムを構築できます。
1. ヘキサゴナルアーキテクチャの紹介
ポートおよびアダプター パターンとしても知られる六角形アーキテクチャは、従来の層状アーキテクチャの堅固さと複雑さに対処するために、Alistair Cockburn によって導入されました。その主な目標は、アプリケーションのコア ロジック (ドメイン) を外部システムから独立させ、テスト、メンテナンス、適応性を容易にすることです。
ヘキサゴナル アーキテクチャの中核では、アプリケーションを 3 つの主要な層に分割します。
コア (ビジネス ロジック/ドメイン): ビジネス ルールとドメイン ロジックが存在するシステムの中心部。この層は独立しており、外部ライブラリやフレームワークに依存しません。
例: ローンの利息を計算するか、ビジネス ルールに対するユーザーのアクションを検証します。-
ポート (インターフェース): コアが外部とやり取りする方法の抽象的な定義 (インターフェースやプロトコルなど)。ポートは、ユースケースまたはアプリケーション固有の API を表します。 どのようにを指定することなく、何をする必要があるかを定義します。
例: リポジトリ ポートは、次のようなデータ ソースと対話するメソッドを定義します。- get(id: ID): Entity: 一意の識別子によってエンティティを取得します。
- insert(entity: Entity): void: 新しいエンティティを追加します。
- update(entity:Entity):void:既存のエンティティを更新します。
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
- アダプター (実装): ポートの具体的な実装。これらは、データベース、API、UI などの外部システムとの実際の対話を処理します。 例: PostgresRepository アダプターは、SQLAlchemy を使用して PostgreSQL のリポジトリ ポートを実装します。
# 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()
アーキテクチャは多くの場合、六角形として視覚化され、コアと対話する複数の方法を象徴しており、それぞれの側面が異なるアダプターまたはポートを表します。
2. ドメイン駆動設計 (DDD) の概要
ドメイン駆動設計 (DDD) は、ビジネス目標と、その目標を達成するために構築されるソフトウェアとの間の緊密な連携を重視するソフトウェア設計アプローチです。この方法論は、Eric Evans によって著書 ドメイン駆動設計: ソフトウェアの中心部の複雑さに取り組む で紹介されました。
DDD の核心は、ドメイン専門家の助けを借りてドメイン (ビジネス上の問題空間) を理解してモデル化し、その理解をソフトウェア システムに変換することに重点を置いています。 DDD はドメインの分離を促進し、システムのさまざまな部分が独立しており、明確で管理しやすい状態を維持します。
ドメイン駆動設計の主要な概念:
ドメイン: ソフトウェアが扱う特定の知識または活動の領域。たとえば、銀行アプリケーションでは、ドメインには口座、取引、顧客などの概念が含まれます。
ユビキタス言語: 開発者とドメイン専門家によって共同開発された共通言語。この共有語彙により、すべての関係者間での明確なコミュニケーションと一貫した理解が保証されます。
-
エンティティと値オブジェクト:
- エンティティ: 顧客や注文など、明確な ID とライフサイクルを持つオブジェクト。
- 値オブジェクト: 日付や金額などの一意の ID ではなく、属性によって定義される不変オブジェクト。
集計: データ変更の単一単位として扱われる関連エンティティと値オブジェクトのクラスター。各アグリゲートには、クラスター全体の整合性を保証するルート エンティティがあります。
リポジトリ: 集計を取得および保存するメカニズム。データ アクセスに対する抽象化レイヤーを提供します。
サービス: エンティティや値オブジェクトには本来は適合しないが、支払いの処理など、ドメインにとって不可欠な操作またはプロセス。
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 は、複雑なビジネス ルールの構築と管理に優れていますが、その可能性を十分に発揮し、他のコーディングの問題に対処するには、補完的なアーキテクチャ フレームワーク内で利用するのが最適です。したがって、次のセクションでは、ドメイン駆動設計をヘキサゴナル アーキテクチャと組み合わせて、その長所を強調し、ビジネス ロジックを超えた追加のコーディング問題を解決するための強固な基盤を提供します。
3. ヘキサゴナル アーキテクチャとドメイン駆動設計がどのように相互補完するか
なぜヘキサゴナルアーキテクチャとドメイン駆動設計なのか?
ドメイン駆動設計 (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 リポジトリにあります。
4. 結論
ヘキサゴナル アーキテクチャとドメイン駆動設計 (DDD) を Python アプリケーションに組み込むことで、保守可能で適応性があり、ビジネス目標と密接に連携したシステムの開発が促進されます。ヘキサゴナル アーキテクチャにより、コア ビジネス ロジックと外部システムが明確に分離され、柔軟性とテストの容易さが促進されます。 DDD はドメインを正確にモデリングすることを重視しており、その結果、ビジネス プロセスとルールを真に反映したソフトウェアが得られます。これらの方法論を統合することで、開発者は現在の要件を満たすだけでなく、将来のビジネス ニーズに合わせて進化する準備が整った堅牢なアプリケーションを作成できます。
この記事が気に入ったら連絡してください!
以上がヘキサゴナル アーキテクチャとドメイン駆動設計による保守可能な Python アプリケーションの構築の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

UvicornはどのようにしてHTTPリクエストを継続的に聞きますか? Uvicornは、ASGIに基づく軽量のWebサーバーです。そのコア機能の1つは、HTTPリクエストを聞いて続行することです...

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

Investing.comの反クラウリング戦略を理解する多くの人々は、Investing.com(https://cn.investing.com/news/latest-news)からのニュースデータをクロールしようとします。
