Heim Backend-Entwicklung Python-Tutorial Erstellen wartbarer Python-Anwendungen mit hexagonaler Architektur und domänengesteuertem Design

Erstellen wartbarer Python-Anwendungen mit hexagonaler Architektur und domänengesteuertem Design

Dec 10, 2024 am 01:53 AM

In der heutigen schnelllebigen Softwareentwicklungslandschaft ist die Entwicklung von Anwendungen, die einfach zu warten, anzupassen und zu skalieren sind, von entscheidender Bedeutung. Hexagonale Architektur (auch bekannt als Ports und Adapter) und Domain-Driven Design (DDD) sind eine wirksame Kombination zur Bewältigung dieser Herausforderungen. Die hexagonale Architektur fördert eine saubere Trennung von Belangen und macht es einfacher, Teile des Systems zu ersetzen, zu testen oder zu verbessern, ohne die Kernlogik zu stören. In der Zwischenzeit konzentriert sich DDD darauf, Ihren Code an realen Geschäftskonzepten auszurichten und sicherzustellen, dass Ihr System sowohl intuitiv als auch belastbar ist. Zusammengenommen ermöglichen diese Ansätze Entwicklern, Systeme zu entwickeln, die robust und belastbar sind und sich nahtlos an sich ändernde Anforderungen und zukünftiges Wachstum anpassen lassen.

1. Einführung in die sechseckige Architektur

Hexagonale Architektur, auch als Ports- und Adaptermuster bekannt, wurde von Alistair Cockburn eingeführt, um die Starrheit und Komplexität der traditionellen Schichtarchitektur anzugehen. Sein Hauptziel besteht darin, die Kernlogik (Domäne) der Anwendung unabhängig von externen Systemen zu machen und so einfachere Tests, Wartung und Anpassungsfähigkeit zu ermöglichen.

Im Kern unterteilt Hexagonal Architecture die Anwendung in drei Hauptschichten:

  • Kern (Geschäftslogik/Domäne): Das Herzstück des Systems, in dem sich Geschäftsregeln und Domänenlogik befinden. Diese Ebene ist unabhängig und nicht auf externe Bibliotheken oder Frameworks angewiesen.
    Beispiel: Berechnung der Zinsen für einen Kredit oder Validierung der Aktion eines Benutzers im Hinblick auf Geschäftsregeln.

  • Ports (Schnittstellen): Abstrakte Definitionen (z. B. Schnittstellen oder Protokolle) für die Art und Weise, wie der Kern mit der Außenwelt interagiert. Ports repräsentieren Anwendungsfälle oder anwendungsspezifische APIs. Sie definieren, was getan werden muss, ohne wie anzugeben.
    Beispiel: Repository-Port definiert Methoden zur Interaktion mit Datenquellen wie:

    • get(id: ID): Entität: Rufen Sie eine Entität anhand ihrer eindeutigen Kennung ab.
    • insert(entity: Entity): void: Eine neue Entität hinzufügen.
    • update(entity: Entity): void: Eine vorhandene Entität aktualisieren.
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
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
  • Adapter (Implementierungen): Konkrete Implementierungen der Ports. Sie kümmern sich um die eigentliche Interaktion mit externen Systemen wie Datenbanken, APIs oder UI. Beispiel: Der PostgresRepository-Adapter implementiert den Repository-Port für PostgreSQL mithilfe von SQLAlchemy.
# 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()
Nach dem Login kopieren

Die Architektur wird oft als Sechseck dargestellt, das mehrere Möglichkeiten der Interaktion mit dem Kern symbolisiert, wobei jede Seite einen anderen Adapter oder Port darstellt.

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

2. Einführung in Domain-Driven Design (DDD)

Domain-Driven Design (DDD) ist ein Software-Design-Ansatz, der eine enge Abstimmung zwischen Geschäftszielen und der Software, die zu deren Erreichung entwickelt wird, betont. Diese Methodik wurde von Eric Evans in seinem Buch Domain-Driven Design: Tackling Complexity in the Heart of Software.

eingeführt

Im Kern konzentriert sich DDD darauf, die Domäne (den Geschäftsproblembereich) mithilfe von Domänenexperten zu verstehen und zu modellieren und dieses Verständnis in das Softwaresystem zu übertragen. DDD fördert die Entkopplung von Domänen und stellt so sicher, dass verschiedene Teile des Systems unabhängig, klar und einfach zu verwalten bleiben.
Schlüsselkonzepte des domänengesteuerten Designs:

  • Domäne: Der spezifische Wissens- oder Aktivitätsbereich, den die Software anspricht. In einer Bankanwendung umfasst die Domäne beispielsweise Konzepte wie Konten, Transaktionen und Kunden.

  • Allgegenwärtige Sprache: Eine gemeinsame Sprache, die gemeinsam von Entwicklern und Fachexperten entwickelt wurde. Dieses gemeinsame Vokabular gewährleistet eine klare Kommunikation und ein einheitliches Verständnis aller Beteiligten.

  • Entitäten und Wertobjekte:

    • Entitäten:Objekte, die eine eindeutige Identität und einen bestimmten Lebenszyklus haben, z. B. ein Kunde oder eine Bestellung.
    • Wertobjekte: Unveränderliche Objekte, die durch ihre Attribute definiert werden und nicht durch eine eindeutige Identität, wie ein Datum oder einen Geldbetrag.
  • Aggregate: Cluster verwandter Entitäten und Wertobjekte, die bei Datenänderungen als eine einzige Einheit behandelt werden. Jedes Aggregat verfügt über eine Root-Entität, die die Integrität des gesamten Clusters gewährleistet.

  • Repositorys: Mechanismen zum Abrufen und Speichern von Aggregaten, die eine Abstraktionsebene über den Datenzugriff bereitstellen.

  • Dienste: Vorgänge oder Prozesse, die nicht von Natur aus in Entitäten oder Wertobjekte passen, aber für die Domäne wesentlich sind, wie z. B. die Verarbeitung einer Zahlung.

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
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

In diesem Abschnitt gebe ich kein detailliertes Beispiel für die Implementierung von Domain-Driven Design (DDD), da es sich um eine umfassende Methodik handelt, die sich hauptsächlich auf die Bewältigung komplexer Herausforderungen der Geschäftslogik konzentriert. DDD zeichnet sich durch die Strukturierung und Verwaltung komplexer Geschäftsregeln aus. Um jedoch sein Potenzial voll auszuschöpfen und andere Codierungsprobleme anzugehen, wird es am besten in einem ergänzenden Architekturrahmen eingesetzt. Daher wird im folgenden Abschnitt Domain-Driven Design mit Hexagonal Architecture kombiniert, um dessen Stärken hervorzuheben und eine solide Grundlage für die Lösung zusätzlicher Codierungsprobleme über die Geschäftslogik hinaus zu schaffen, begleitet von einem detaillierten Beispiel.

3. Wie sich hexagonale Architektur und domänengesteuertes Design gegenseitig ergänzen

Warum hexagonale Architektur und domänengesteuertes Design?

Domain-Driven Design (DDD) und Hexagonal Architecture ergänzen einander, indem sie klare Grenzen betonen und Software an den Geschäftsanforderungen ausrichten. DDD konzentriert sich auf die Modellierung der Kerndomäne und die Isolierung der Geschäftslogik, während die Hexagonal-Architektur durch Ports und Adapter sicherstellt, dass diese Logik unabhängig von externen Systemen bleibt. Sie gehen auf unterschiedliche, aber komplementäre Anliegen ein:

  • Hexagonale Architektur als Rahmen:

    • Hexagonale Architektur definiert, wie das Gesamtsystem organisiert ist und wie verschiedene Teile (z. B. Domäne, Infrastruktur, Benutzeroberflächen) interagieren.
    • Es stellt die Umgebung bereit, in der die Domänenlogik unabhängig von externen Bedenken funktionieren kann und Freiheit von Infrastrukturdetails bietet.
  • Domänengesteuertes Design als Kernlogik:

    • DDD bereichert die von der Hexagonal Architecture definierte Kerndomäne, indem es sicherstellt, dass die Geschäftslogik nicht nur gekapselt ist, sondern auch die realen Geschäftsanforderungen widerspiegelt.
    • Der Schwerpunkt liegt auf der effektiven Gestaltung und Implementierung der Domänenschicht, um sicherzustellen, dass sie sinnvoll und anpassungsfähig bleibt.

Zusammen ermöglichen sie skalierbare, testbare und flexible Systeme, bei denen die Domäne im Mittelpunkt bleibt und von Änderungen in der Infrastruktur oder Technologie isoliert ist. Diese Synergie gewährleistet ein robustes Design, das sich leicht an sich ändernde Geschäftsanforderungen anpassen lässt.
Der folgende Abschnitt bietet ein praktisches Beispiel dafür, wie Domain-Driven Design (DDD) und Hexagonal Architecture zusammenarbeiten, um robuste, wartbare und anpassungsfähige Softwaresysteme zu schaffen.

Praxisbeispiel

Dieses Projekt wendet Hexagonal Architecture und Domain-Driven Design (DDD) an, um skalierbare und wartbare Systeme zu erstellen und eine moderne und robuste Grundlage für die Anwendungsentwicklung zu schaffen. Es wurde mit Python erstellt und verwendet FastAPI als Web-Framework und DynamoDB als Datenbank.

Das Projekt ist wie folgt organisiert:

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
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Den Quellcode finden Sie in meinem GitHub-Repository.

4. Fazit

Die Integration von Hexagonal Architecture und Domain-Driven Design (DDD) in Python-Anwendungen fördert die Entwicklung von Systemen, die wartbar, anpassbar und eng an den Geschäftszielen ausgerichtet sind. Die hexagonale Architektur sorgt für eine klare Trennung zwischen der Kerngeschäftslogik und externen Systemen und fördert so Flexibilität und einfache Tests. DDD legt Wert auf die genaue Modellierung der Domäne, was zu einer Software führt, die Geschäftsprozesse und -regeln wirklich widerspiegelt. Durch die Integration dieser Methoden können Entwickler robuste Anwendungen erstellen, die nicht nur aktuelle Anforderungen erfüllen, sondern auch gut auf die Weiterentwicklung zukünftiger Geschäftsanforderungen vorbereitet sind.

Verbinden Sie mich, wenn Ihnen dieser Artikel gefallen hat!

Das obige ist der detaillierte Inhalt vonErstellen wartbarer Python-Anwendungen mit hexagonaler Architektur und domänengesteuertem Design. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

<🎜>: Bubble Gum Simulator Infinity - So erhalten und verwenden Sie Royal Keys
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusionssystem, erklärt
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Flüstern des Hexenbaum
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Java-Tutorial
1665
14
PHP-Tutorial
1270
29
C#-Tutorial
1249
24
Python vs. C: Anwendungen und Anwendungsfälle verglichen Python vs. C: Anwendungen und Anwendungsfälle verglichen Apr 12, 2025 am 12:01 AM

Python eignet sich für Datenwissenschafts-, Webentwicklungs- und Automatisierungsaufgaben, während C für Systemprogrammierung, Spieleentwicklung und eingebettete Systeme geeignet ist. Python ist bekannt für seine Einfachheit und sein starkes Ökosystem, während C für seine hohen Leistung und die zugrunde liegenden Kontrollfunktionen bekannt ist.

Python: Spiele, GUIs und mehr Python: Spiele, GUIs und mehr Apr 13, 2025 am 12:14 AM

Python zeichnet sich in Gaming und GUI -Entwicklung aus. 1) Spielentwicklung verwendet Pygame, die Zeichnungen, Audio- und andere Funktionen bereitstellt, die für die Erstellung von 2D -Spielen geeignet sind. 2) Die GUI -Entwicklung kann Tkinter oder Pyqt auswählen. Tkinter ist einfach und einfach zu bedienen. PYQT hat reichhaltige Funktionen und ist für die berufliche Entwicklung geeignet.

Python vs. C: Lernkurven und Benutzerfreundlichkeit Python vs. C: Lernkurven und Benutzerfreundlichkeit Apr 19, 2025 am 12:20 AM

Python ist leichter zu lernen und zu verwenden, während C leistungsfähiger, aber komplexer ist. 1. Python -Syntax ist prägnant und für Anfänger geeignet. Durch die dynamische Tippen und die automatische Speicherverwaltung können Sie die Verwendung einfach zu verwenden, kann jedoch zur Laufzeitfehler führen. 2.C bietet Steuerung und erweiterte Funktionen auf niedrigem Niveau, geeignet für Hochleistungsanwendungen, hat jedoch einen hohen Lernschwellenwert und erfordert manuellem Speicher und Typensicherheitsmanagement.

Python und Zeit: Machen Sie das Beste aus Ihrer Studienzeit Python und Zeit: Machen Sie das Beste aus Ihrer Studienzeit Apr 14, 2025 am 12:02 AM

Um die Effizienz des Lernens von Python in einer begrenzten Zeit zu maximieren, können Sie Pythons DateTime-, Zeit- und Zeitplanmodule verwenden. 1. Das DateTime -Modul wird verwendet, um die Lernzeit aufzuzeichnen und zu planen. 2. Das Zeitmodul hilft, die Studie zu setzen und Zeit zu ruhen. 3. Das Zeitplanmodul arrangiert automatisch wöchentliche Lernaufgaben.

Python vs. C: Erforschung von Leistung und Effizienz erforschen Python vs. C: Erforschung von Leistung und Effizienz erforschen Apr 18, 2025 am 12:20 AM

Python ist in der Entwicklungseffizienz besser als C, aber C ist in der Ausführungsleistung höher. 1. Pythons prägnante Syntax und reiche Bibliotheken verbessern die Entwicklungseffizienz. 2. Die Kompilierungsmerkmale von Compilation und die Hardwarekontrolle verbessern die Ausführungsleistung. Bei einer Auswahl müssen Sie die Entwicklungsgeschwindigkeit und die Ausführungseffizienz basierend auf den Projektanforderungen abwägen.

Python: Automatisierung, Skript- und Aufgabenverwaltung Python: Automatisierung, Skript- und Aufgabenverwaltung Apr 16, 2025 am 12:14 AM

Python zeichnet sich in Automatisierung, Skript und Aufgabenverwaltung aus. 1) Automatisierung: Die Sicherungssicherung wird durch Standardbibliotheken wie OS und Shutil realisiert. 2) Skriptschreiben: Verwenden Sie die PSUTIL -Bibliothek, um die Systemressourcen zu überwachen. 3) Aufgabenverwaltung: Verwenden Sie die Zeitplanbibliothek, um Aufgaben zu planen. Die Benutzerfreundlichkeit von Python und die Unterstützung der reichhaltigen Bibliothek machen es zum bevorzugten Werkzeug in diesen Bereichen.

Welches ist Teil der Python Standard Library: Listen oder Arrays? Welches ist Teil der Python Standard Library: Listen oder Arrays? Apr 27, 2025 am 12:03 AM

PythonlistsarePartThestandardlibrary, whilearraysarenot.listarebuilt-in, vielseitig und UNDUSEDFORSPORINGECollections, während dieArrayRay-thearrayModulei und loses und loses und losesaluseduetolimitedFunctionality.

Python lernen: Ist 2 Stunden tägliches Studium ausreichend? Python lernen: Ist 2 Stunden tägliches Studium ausreichend? Apr 18, 2025 am 12:22 AM

Ist es genug, um Python für zwei Stunden am Tag zu lernen? Es hängt von Ihren Zielen und Lernmethoden ab. 1) Entwickeln Sie einen klaren Lernplan, 2) Wählen Sie geeignete Lernressourcen und -methoden aus, 3) praktizieren und prüfen und konsolidieren Sie praktische Praxis und Überprüfung und konsolidieren Sie und Sie können die Grundkenntnisse und die erweiterten Funktionen von Python während dieser Zeit nach und nach beherrschen.

See all articles