在當今快節奏的軟體開發環境中,建立易於維護、適應和擴展的應用程式至關重要。六角形架構(也稱為連接埠和適配器)和領域驅動設計(DDD)是應對這些挑戰的有效組合。六邊形架構促進了關注點的清晰分離,使得在不破壞核心邏輯的情況下更容易替換、測試或增強系統的各個部分。同時,DDD 專注於使您的程式碼與現實世界的業務概念保持一致,確保您的系統既直觀又具有彈性。這些方法共同使開發人員能夠建立強大、有彈性的系統,並且旨在無縫適應不斷變化的需求和未來的成長。
1. 六角形架構簡介
六邊形架構,也稱為連接埠和適配器模式,由Alistair Cockburn引入,以解決傳統分層架構的剛性和複雜性。其主要目標是使應用程式的核心邏輯(域)獨立於外部系統,從而更容易測試、維護和適應性。
六邊形架構的核心將應用程式分為三個主要層:
核心(業務邏輯/域):系統的核心,業務規則和域邏輯所在。該層是獨立的,不依賴外部函式庫或框架。
範例:計算貸款利息或依照業務規則驗證使用者的操作。-
連接埠(介面):核心與外界互動方式的抽象定義(例如介面或協定)。連接埠代表用例或特定於應用程式的 API。他們定義了需要做什麼,但沒有指定如何。
範例: 儲存庫連接埠定義與資料來源互動的方法,例如:- get(id: ID): 實體:透過唯一識別碼檢索實體。
- 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 Adapter 使用 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 促進了領域的解耦,確保系統的不同部分保持獨立、清晰、易於管理。
領域驅動設計的關鍵概念:
領域: 軟體涉及的知識或活動的特定領域。例如,在銀行應用程式中,網域包括帳戶、交易和客戶等概念。
通用語言:由開發人員和領域專家協作開發的通用語言。這種共享詞彙確保所有利害關係人之間的清晰溝通和一致理解。
-
實體與值物件:
- 實體:具有獨特身分和生命週期的對象,例如客戶或訂單。
- 值對象: 不可變的對象,由其屬性定義,而不是由唯一識別(如日期或貨幣金額)定義。
聚合: 相關實體和值物件的群集被視為資料變更的單一單元。每個聚合都有一個根實體,保證整個叢集的完整性。
儲存庫:檢索與儲存聚合的機制,提供資料存取的抽象層。
服務:自然不適合實體或值物件但對網域至關重要的操作或流程,例如處理付款。
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 擅長建立和管理複雜的業務規則,但為了充分發揮其潛力並解決其他編碼問題,最好在互補的架構框架中使用它。因此,在接下來的部分中,領域驅動設計將與六邊形架構相結合,以突出其優勢,並為解決業務邏輯之外的其他編碼問題提供堅實的基礎,並附有詳細的示例。
3. 六角形架構與領域驅動設計如何相輔相成
為什麼採用六角形架構和領域驅動設計?
領域驅動設計 (DDD) 和六邊形架構透過強調清晰的邊界並使軟體與業務需求保持一致來相輔相成。 DDD 專注於對核心域進行建模並隔離業務邏輯,而六邊形架構則透過連接埠和適配器確保該邏輯獨立於外部系統。他們解決了不同但互補的問題:
-
以六角形建築為框架:
- 六邊形架構定義了整個系統的組織方式以及不同部分(例如網域、基礎設施、使用者介面)如何互動。
- 它提供了域邏輯可以獨立於外部問題運作的環境,不受基礎設施細節的影響。
-
領域驅動設計作為核心邏輯:
- DDD 豐富了六角架構定義的核心領域,確保業務邏輯不僅被封裝,而且反映了現實世界的業務需求。
- 它專注於如何有效地設計和實現領域層,確保其保持有意義和適應性。
它們共同實現了可擴展、可測試和靈活的系統,其中領域仍然是中心焦點,不受基礎設施或技術變化的影響。這種協同作用確保了強大的設計,可以輕鬆適應不斷變化的業務需求。
以下部分提供了一個實際範例,說明領域驅動設計 (DDD) 和六邊形架構如何協同工作來創建健全、可維護和適應性強的軟體系統。
實際例子
該專案應用六邊形架構和領域驅動設計(DDD)來創建可擴展和可維護的系統,為應用程式開發提供現代且強大的基礎。它使用 Python 構建,使用 FastAPI 作為 Web 框架,並使用 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中文網其他相關文章!

本文解釋瞭如何使用美麗的湯庫來解析html。 它詳細介紹了常見方法,例如find(),find_all(),select()和get_text(),以用於數據提取,處理不同的HTML結構和錯誤以及替代方案(SEL)

Python的statistics模塊提供強大的數據統計分析功能,幫助我們快速理解數據整體特徵,例如生物統計學和商業分析等領域。無需逐個查看數據點,只需查看均值或方差等統計量,即可發現原始數據中可能被忽略的趨勢和特徵,並更輕鬆、有效地比較大型數據集。 本教程將介紹如何計算平均值和衡量數據集的離散程度。除非另有說明,本模塊中的所有函數都支持使用mean()函數計算平均值,而非簡單的求和平均。 也可使用浮點數。 import random import statistics from fracti

Python 對象的序列化和反序列化是任何非平凡程序的關鍵方面。如果您將某些內容保存到 Python 文件中,如果您讀取配置文件,或者如果您響應 HTTP 請求,您都會進行對象序列化和反序列化。 從某種意義上說,序列化和反序列化是世界上最無聊的事情。誰會在乎所有這些格式和協議?您想持久化或流式傳輸一些 Python 對象,並在以後完整地取回它們。 這是一種在概念層面上看待世界的好方法。但是,在實際層面上,您選擇的序列化方案、格式或協議可能會決定程序運行的速度、安全性、維護狀態的自由度以及與其他系

本文比較了Tensorflow和Pytorch的深度學習。 它詳細介紹了所涉及的步驟:數據準備,模型構建,培訓,評估和部署。 框架之間的關鍵差異,特別是關於計算刻度的

Linux終端中查看Python版本時遇到權限問題的解決方法當你在Linux終端中嘗試查看Python的版本時,輸入python...

本文討論了諸如Numpy,Pandas,Matplotlib,Scikit-Learn,Tensorflow,Tensorflow,Django,Blask和請求等流行的Python庫,並詳細介紹了它們在科學計算,數據分析,可視化,機器學習,網絡開發和H中的用途

該教程建立在先前對美麗湯的介紹基礎上,重點是簡單的樹導航之外的DOM操縱。 我們將探索有效的搜索方法和技術,以修改HTML結構。 一種常見的DOM搜索方法是EX

本文指導Python開發人員構建命令行界面(CLIS)。 它使用Typer,Click和ArgParse等庫詳細介紹,強調輸入/輸出處理,並促進用戶友好的設計模式,以提高CLI可用性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。