検索
ホームページバックエンド開発Python チュートリアルヘキサゴナル アーキテクチャとドメイン駆動設計による保守可能な 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()

アーキテクチャは多くの場合、六角形として視覚化され、コアと対話する複数の方法を象徴しており、それぞれの側面が異なるアダプターまたはポートを表します。

Building Maintainable Python Applications with Hexagonal Architecture and Domain-Driven Design

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 サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Pythonの学習:2時間の毎日の研究で十分ですか?Pythonの学習:2時間の毎日の研究で十分ですか?Apr 18, 2025 am 12:22 AM

Pythonを1日2時間学ぶだけで十分ですか?それはあなたの目標と学習方法に依存します。 1)明確な学習計画を策定し、2)適切な学習リソースと方法を選択します。3)実践的な実践とレビューとレビューと統合を練習および統合し、統合すると、この期間中にPythonの基本的な知識と高度な機能を徐々に習得できます。

Web開発用のPython:主要なアプリケーションWeb開発用のPython:主要なアプリケーションApr 18, 2025 am 12:20 AM

Web開発におけるPythonの主要なアプリケーションには、DjangoおよびFlaskフレームワークの使用、API開発、データ分析と視覚化、機械学習とAI、およびパフォーマンスの最適化が含まれます。 1。DjangoandFlask Framework:Djangoは、複雑な用途の迅速な発展に適しており、Flaskは小規模または高度にカスタマイズされたプロジェクトに適しています。 2。API開発:フラスコまたはdjangorestFrameworkを使用して、Restfulapiを構築します。 3。データ分析と視覚化:Pythonを使用してデータを処理し、Webインターフェイスを介して表示します。 4。機械学習とAI:Pythonは、インテリジェントWebアプリケーションを構築するために使用されます。 5。パフォーマンスの最適化:非同期プログラミング、キャッシュ、コードを通じて最適化

Python vs. C:パフォーマンスと効率の探索Python vs. C:パフォーマンスと効率の探索Apr 18, 2025 am 12:20 AM

Pythonは開発効率でCよりも優れていますが、Cは実行パフォーマンスが高くなっています。 1。Pythonの簡潔な構文とリッチライブラリは、開発効率を向上させます。 2.Cのコンピレーションタイプの特性とハードウェア制御により、実行パフォーマンスが向上します。選択を行うときは、プロジェクトのニーズに基づいて開発速度と実行効率を比較検討する必要があります。

Python in Action:実世界の例Python in Action:実世界の例Apr 18, 2025 am 12:18 AM

Pythonの実際のアプリケーションには、データ分析、Web開発、人工知能、自動化が含まれます。 1)データ分析では、PythonはPandasとMatplotlibを使用してデータを処理および視覚化します。 2)Web開発では、DjangoおよびFlask FrameworksがWebアプリケーションの作成を簡素化します。 3)人工知能の分野では、TensorflowとPytorchがモデルの構築と訓練に使用されます。 4)自動化に関しては、ファイルのコピーなどのタスクにPythonスクリプトを使用できます。

Pythonの主な用途:包括的な概要Pythonの主な用途:包括的な概要Apr 18, 2025 am 12:18 AM

Pythonは、データサイエンス、Web開発、自動化スクリプトフィールドで広く使用されています。 1)データサイエンスでは、PythonはNumpyやPandasなどのライブラリを介してデータ処理と分析を簡素化します。 2)Web開発では、DjangoおよびFlask Frameworksにより、開発者はアプリケーションを迅速に構築できます。 3)自動化されたスクリプトでは、Pythonのシンプルさと標準ライブラリが理想的になります。

Pythonの主な目的:柔軟性と使いやすさPythonの主な目的:柔軟性と使いやすさApr 17, 2025 am 12:14 AM

Pythonの柔軟性は、マルチパラダイムサポートと動的タイプシステムに反映されていますが、使いやすさはシンプルな構文とリッチ標準ライブラリに由来しています。 1。柔軟性:オブジェクト指向、機能的および手続き的プログラミングをサポートし、動的タイプシステムは開発効率を向上させます。 2。使いやすさ:文法は自然言語に近く、標準的なライブラリは幅広い機能をカバーし、開発プロセスを簡素化します。

Python:汎用性の高いプログラミングの力Python:汎用性の高いプログラミングの力Apr 17, 2025 am 12:09 AM

Pythonは、初心者から上級開発者までのすべてのニーズに適した、そのシンプルさとパワーに非常に好まれています。その汎用性は、次のことに反映されています。1)学習と使用が簡単、シンプルな構文。 2)Numpy、Pandasなどの豊富なライブラリとフレームワーク。 3)さまざまなオペレーティングシステムで実行できるクロスプラットフォームサポート。 4)作業効率を向上させるためのスクリプトおよび自動化タスクに適しています。

1日2時間でPythonを学ぶ:実用的なガイド1日2時間でPythonを学ぶ:実用的なガイドApr 17, 2025 am 12:05 AM

はい、1日2時間でPythonを学びます。 1.合理的な学習計画を作成します。2。適切な学習リソースを選択します。3。実践を通じて学んだ知識を統合します。これらの手順は、短時間でPythonをマスターするのに役立ちます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター