天天看點

混合開發:TDD、DDD和BDD交集的值

目錄

測試驅動開發(TDD)是一種開發軟體的過程,其中在編寫代碼之前先編寫測試。一旦完成,開發人員将努力編寫足夠的代碼以通過測試,然後開始重構。

混合開發:TDD、DDD和BDD交集的值

域驅動設計(DDD)是一種将實作與不斷發展的模型聯系在一起的開發方法。将項目的重點放在核心領域(知識領域),背後的邏輯上,并迫使技術和非技術方面之間進行協作以改進模型。

混合開發:TDD、DDD和BDD交集的值

行為驅動開發(BDD)是對TDD和DDD的改進,旨在通過縮小溝通差距,增進對客戶的了解并實作持續溝通來簡化開發。簡而言之,BDD是将業務需求與代碼結合在一起的一種方式,使您能夠從業務/最終使用者的角度了解系統的行為。

混合開發:TDD、DDD和BDD交集的值

Hybrid Practice混合實踐

混合開發:TDD、DDD和BDD交集的值

TDD

Test-driven development,即測試驅動開發。一種開發過程中應用方法。其思想為先根據需求抽象接口,先編寫測試用例,然後在開始編寫開發代碼。TDD的本意就是通過測試來推動整個開發的進行。

TDD說白了就是先寫一小段功能的測試代碼,測試失敗後再寫實作代碼,測試成功後接着疊代下一個功能。

TDD的優點:

  • 提高功能的可測性
  • 測試比較靈活
  • 測試用例覆寫率比較高

缺點:

  • 由于是單元測試代碼驗證,非技術人員看不懂代碼,比較難驗證功能是否貼合需求
  • 先寫單元測試代碼,測試用例需要經常調整,增加了開發人員的工作量和降低了開發效率

BDD

Behavior-driven development,即行為驅動開發。其目的是鼓勵軟體項目中的開發者、QA和非技術人員或商業參與者之間的協作。是從使用者的需求出發,強調系統行為。通過用自然語言書寫非程式員可讀的測試用例擴充了測試驅動開發方法,使用混合了領域中統一的語言的母語語言來描述他們的代碼的目的,讓開發者得以把精力集中在代碼應該怎麼寫,而不是技術細節上,而且也最大程度的減少了将代碼編寫者的技術語言與商業客戶、使用者、利益相關者、項目管理者等的領域語言之間來回翻譯的代價.

目前主流的BDD測試架構為

Cucumber

,支援多種程式設計語言。

cucumber支援的關鍵字:

feature | "功能" |
background | "背景" |
scenario | "場景", "劇本" |
scenario outline | "場景大綱", "劇本大綱" |
examples | "例子" |
given | "* ", "假如", "假設", "假定" |
when | "* ", "當" |
then | "* ", "那麼" |
and | "* ", "而且", "并且", "同時" |
but | "* ", "但是" |
given (code) | "假如", "假設", "假定" |
when (code) | "當" |
then (code) | "那麼" |
and (code) | "而且", "并且", "同時" |
but (code) | "但是" |           

程式設計是通過使用以上的關鍵字來描述應用的功能,使非開發人員能快速便捷的了解代碼的功能。

DDD

Domain-drive Design,領域驅動設計。其目的是以一種領域專家、設計人員、開發人員都能了解的通用語言作為互相交流的工具,在交流的過程中發現領域概念,然後将這些概念設計成一個領域模型,再有該模型驅動軟體設計和開發。

領域模型

  • 領域模型是是對具有某個邊界的領域的一個抽象,反映了領域内使用者需求的本質
  • 領域模型隻反映業務,和技術無關
  • 領域模型可以反映領域中的實體和過程
  • 領域模型確定業務邏輯都在一個模型中,有助于提高應用的維護性和可重用性
  • 領域模型可以讓開發人員相對平滑地将業務知識轉換為軟體架構
  • 領域模型貫穿軟體分析、設計,以及開發的整個過程
  • 建立正确的領域模型需要領域專家、設計、開發人員積極溝通共同努力,是大家對領域内的業務不斷深入,進而不斷細化和完善領域模型
  • 領域模型的表達方式有多種
  • 領域模型是整個軟體的核心,設計足夠精良且符合業務需求的領域模型能夠更快速的響應需求變化

領域驅動設計的分成架構

  • 使用者界面/表現層
  • 應用層
  • 領域層 - 表達業務概念,業務資訊和業務規則
  • 基礎設施層

業務對象的職責和政策:

  • 實體(Entities):具備唯一ID,能夠被持久化,具備業務邏輯,對應業務對象
  • 值對象(Value objects):不具有唯一ID,由對象的屬性描述,一般為記憶體中的臨時對象,可以用來傳遞參數或對實體進行補充描述。
  • 工廠(Factories):主要用來建立實體,目前架構實踐中一般采用IOC容器來實作工廠的功能
  • 倉庫(Repositories):用來管理實體的集合,封裝持久化架構
  • 服務(Services):為上層建築提供可操作的接口,負責對領域對象進行排程和封裝,同時可以對外提供各種形式的服務

DDD對建構企業級應用開發平台和大型核心業務系統的作用是相當大的,無論是在産品的穩定性、擴充性、可維護性、生命周期等方面都有良好的表現

參考

The Value at the Intersection of TDD, DDD, and BDD Hybrid Development: The Value at the Intersection of TDD, DDD, and BDD BDD vs TDD vs ATDD : Key Differences Differences between TDD, ATDD and BDD

繼續閱讀