目錄
EventStorming:揭開領域的面紗
戰略領域驅動設計
定義邊界(有界上下文
無所不在的語言
戰術領域驅動設計
實體和值物件
實體
值物件
服務
網域服務
申請服務
基礎設施服務
服務分類
組成團隊:塔克曼的階段
成型
風雨飄搖
規範
表演
文檔:Diátaxis 模型
首頁 後端開發 php教程 了解領域並建立團隊:變革的基礎(II)

了解領域並建立團隊:變革的基礎(II)

Jan 19, 2025 pm 06:05 PM

著手一個複雜的專案需要全面的背景收集,同時利用領域專家的見解從全新的角度接近領域知識。這種方法使技術團隊與業務目標保持一致,並為整個產品生命週期中的明智決策建立了基礎路線圖。

與先前的團隊和目前應用程式使用者進行的初步知識收集會議被證明沒有成效。 儘管有固有風險,我們還是短暫考慮獨立進行。

EventStorming:揭開領域的面紗

身為技術主管,考慮到專案的複雜性和團隊對所有權的需求,我從一開始就倡導領域驅動的方法。這以領域為中心,促進了共同的理解(無處不在的語言),從而簡化了溝通並促進了應用程式當前狀態的映射。

我們使用 Miro 模板啟動了 EventStorming 會議,提供了有效聚焦的結構和圖例。 透過會前準備或初步解釋提前熟悉 EventStorming 概念是非常有益的。

Understanding the Domain and Building the Team: The Foundations of Change (II)

我們的結構化 EventStorming 流程包括:

  1. 探索領域事件(大局):與領域專家一起識別、按時間順序排列和驗證關鍵系統事件,突出顯示差距和依賴性。
  2. 細化和分析:添加解釋性註釋,記錄問題,深入分析每個事件,並找出關鍵決策點。
  3. 領域建模:識別聚合和邊界,定義參與者和角色,建立觸發命令,記錄策略和業務規則,以及識別內部/外部事件觸發器。
  4. 文件和驗證:組織和清理收集的信息,建立清晰的關係,與利害關係人驗證模型,並建立參考文件。

EventStorming 不僅提供了領域理解,還為戰略和戰術上應用領域驅動設計 (DDD) 原則奠定了基礎。

戰略領域驅動設計

關鍵的第一步涉及策略性地建構領域。 系統的複雜性和技術/業務協調的需要導致採用 DDD 原則。 上下文映射被證明是無價的,即使在我們等待重構的整體中也是如此。 我們確定了限界上下文,在具有共享核心的單一技術上下文中運行。 這種分析雖然沒有深入探討,但指導專案走向面向領域的架構,改善了技術開發和跨團隊協作。

定義邊界(有界上下文

辨識有界上下文澄清了系統間和外部系統的關係,簡化了複雜性,為未來的模組化奠定了基礎。 這些初始決策將指導整體結構分解為與定義的上下文一致的可管理元件。 這也有助於確定優先順序並確定需要簡化、解耦或消除的領域。 我們專注於實施用於外部系統互動的反腐敗層 (ACL),以保持系統完整性。

確定了五個關鍵背景:

  • 訂單分配
  • 標籤產生
  • 訂單準備
  • 電子商務整合
  • 大量訂單準備

這些決策促進了永續架構的發展,並使開發與業務需求保持一致。

Understanding the Domain and Building the Team: The Foundations of Change (II)

無所不在的語言

事實證明,建立強大的通用語言至關重要。 透過領域專家和開發人員之間的協作創建的共享語言的好處遠遠超過翻譯工作或誤解。 這種活躍的資源將技術團隊與領域專家聯繫起來,改善了溝通,減少了誤解,並確保程式碼中準確的領域表示。 這促進了高效、符合業務的技術解決方案。

戰術領域驅動設計

按照策略框架,我們實施了戰術 DDD 原則來建立程式碼,反映領域現實並確保長期永續性。

實體和值物件

理解實體和值物件之間的區別至關重要。

實體

實體擁有唯一、持久的身份,即使屬性改變也是如此。 例如:

  • 訂單
  • 產品
  • 承運人
  • 商店
  • 顧客

值物件

值對象缺乏個體身分;他們的價值定義了他們。 相同的屬性意味著等同。 它們是不可變的,非常適合封裝跨領域出現的概念。例如:

  • 產品參考
  • 產品Ean13
  • 訂單參考
  • 價格
  • 體重
  • 送貨號碼

這種方法創建了更易於理解和模組化的程式碼,並具有明確定義的職責。

範例值物件:

<?php
readonly class ProductEan13
{
    public string $value;

    public function __construct(string $value)
    {
        $pattern = '/^\d{13}$/';
        if (!preg_match($pattern, $value)) {
            throw new \Exception('Invalid product Ean13');
        }
        $this->value = $value;
    }
}
登入後複製
登入後複製

服務

服務依目的和實施模式進行分類。

網域服務

網域服務封裝了不適合實體或值的業務邏輯,嚴格在網域規則內運行,無需基礎設施依賴。

<?php
readonly class ProductEan13
{
    public string $value;

    public function __construct(string $value)
    {
        $pattern = '/^\d{13}$/';
        if (!preg_match($pattern, $value)) {
            throw new \Exception('Invalid product Ean13');
        }
        $this->value = $value;
    }
}
登入後複製
登入後複製
申請服務

應用服務協調域操作與外部交互,集中複雜的操作並將域和基礎設施分開。 其中包括用例、命令處理程序和事件處理程序。

Understanding the Domain and Building the Team: The Foundations of Change (II)

基礎設施服務

基礎設施服務處理外部元件互動(資料庫、檔案系統等),充當適配器來維護領域不可知論。

<?php
class CheapestCarrierGetter
{
    public function get(
        DeliveryOptionCarrierCollection $deliveryOptionCarriers,
        Weight $orderWeight,
        Country $country,
        PostalCode $postalCode,
        bool $isCashOnDelivery = false,
    ): Carrier {
        // Logic to get the cheapest carrier
    }
}
登入後複製
服務分類

服務依功能和相關設計模式分類:Transformers、Builders、Factories、Presenters、Notifiers、Validators 和 Clients。

這個最初的領域建模雖然不完整且迭代,但促進了團隊的參與和承諾。 預計將進一步完善和重組。

建議的 DDD 資源:

  • 「領域驅動設計:解決軟體核心的複雜性」作者:Eric Evans
  • Vaughn Vernon 的「實現領域驅動設計」
  • “PHP 領域驅動設計”,作者:Carlos Buenosvinos、Christian Soronellas 和 Keyvan Akbary

組成團隊:塔克曼的階段

採用 DDD 與團隊組成並行,遵循塔克曼的階段(形成、風暴、規範、執行)。

成型

初始團隊成員審查了項目,記錄了操作,並建立了技術和組織基礎(流程、標準、工具)。

風雨飄搖

微小的分歧導致了工作方式、溝通方法和決策過程的定義。

規範

建立了團隊協議、編碼標準、開發流程、WIP 限制、部署規則、技術債管理和 ADR。

表演

建立的框架實現了高效的產品開發,優先考慮有價值的舉措,並培育持續改進的文化。

文檔:Diátaxis 模型

使用 GitLab Pages 和 Jekyll 以及 Just the Docs 主題來管理文檔,遵循 Diátaxis 模型:教程、指南、解釋和參考。 使用事件目錄和 AsyncAPI 自動化文件已規劃但尚未完全實施。

以上是了解領域並建立團隊:變革的基礎(II)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話如何劫持工作,如何在PHP中減輕它? 會話如何劫持工作,如何在PHP中減輕它? Apr 06, 2025 am 12:02 AM

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

PHP 8.1中的枚舉(枚舉)是什麼? PHP 8.1中的枚舉(枚舉)是什麼? Apr 03, 2025 am 12:05 AM

PHP8.1中的枚舉功能通過定義命名常量增強了代碼的清晰度和類型安全性。 1)枚舉可以是整數、字符串或對象,提高了代碼可讀性和類型安全性。 2)枚舉基於類,支持面向對象特性,如遍歷和反射。 3)枚舉可用於比較和賦值,確保類型安全。 4)枚舉支持添加方法,實現複雜邏輯。 5)嚴格類型檢查和錯誤處理可避免常見錯誤。 6)枚舉減少魔法值,提升可維護性,但需注意性能優化。

描述紮實的原則及其如何應用於PHP的開發。 描述紮實的原則及其如何應用於PHP的開發。 Apr 03, 2025 am 12:04 AM

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是REST API設計原理? 什麼是REST API設計原理? Apr 04, 2025 am 12:01 AM

RESTAPI設計原則包括資源定義、URI設計、HTTP方法使用、狀態碼使用、版本控制和HATEOAS。 1.資源應使用名詞表示並保持層次結構。 2.HTTP方法應符合其語義,如GET用於獲取資源。 3.狀態碼應正確使用,如404表示資源不存在。 4.版本控制可通過URI或頭部實現。 5.HATEOAS通過響應中的鏈接引導客戶端操作。

您如何在PHP中有效處理異常(嘗試,捕捉,最後,投擲)? 您如何在PHP中有效處理異常(嘗試,捕捉,最後,投擲)? Apr 05, 2025 am 12:03 AM

在PHP中,異常處理通過try,catch,finally,和throw關鍵字實現。 1)try塊包圍可能拋出異常的代碼;2)catch塊處理異常;3)finally塊確保代碼始終執行;4)throw用於手動拋出異常。這些機制幫助提升代碼的健壯性和可維護性。

PHP中的匿名類是什麼?您何時可以使用它們? PHP中的匿名類是什麼?您何時可以使用它們? Apr 04, 2025 am 12:02 AM

匿名類在PHP中的主要作用是創建一次性使用的對象。 1.匿名類允許在代碼中直接定義沒有名字的類,適用於臨時需求。 2.它們可以繼承類或實現接口,增加靈活性。 3.使用時需注意性能和代碼可讀性,避免重複定義相同的匿名類。

See all articles