1. 程式人生 > >DDD -- 領域驅動設計 -- 面向物件(OOA/OOD)的缺陷

DDD -- 領域驅動設計 -- 面向物件(OOA/OOD)的缺陷

OOA/OOD/OOP中,尤其是OOD/OOP,大家都不陌生,用了很多年。並且大部分人,都是從OOP開始,到了一定階段,會再去接觸OOD, 之後是OOA。

這樣用久了,自然而然會覺得“面向物件”是天經地義的,不太會去想面向物件有什麼問題所在。

而DDD裡面,就很明確的指出了面向物件的2個問題,並給出了相應的解決答案。

有興趣朋友可以關注公眾號“架構之道與術”, 獲取最新文章。
或掃描如下二維碼:
這裡寫圖片描述

問題1:面向物件擅長表達“結構”,不擅長表達“行為”

在面向物件裡面,我們把系統裡面所有東西都表達成物件 + 物件之間的關係,這樣清晰的表達出了系統的“結構”。

但是對於“行為”,也就是“流程”,通常被掩蓋了。比如一個業務流程,它牽扯到好幾個物件,那這個流程,反映在程式碼裡面,就是物件與物件之間的引用和互相呼叫關係,這實際是一種“隱性表達”。雖然你可以畫“互動圖”,但這種互動圖只能停留在設計層面,在程式碼層面,沒有對應物。

所以DDD裡面引入了“領域服務”,單獨把重要的“行為”抽出來進行“顯性”表達。

問題2:面向物件不擅長表達“業務規則”

業務規則,說到底也是種“行為”,而在程式碼裡面,我們通常把業務規則表達成了物件的某個方法。

隨著業務規則的複雜,這個方法也變得越來越難理解。所以設計模式裡面有Strategy模式,對這種場景進行建模。

但設計模式主要偏重從技術角度去談這個問題,DDD呢,把這個特意強調了出來。強調在業務分析的時候,就把“業務規則顯性化”,為此引入了Specification模式。

總結

所以說,DDD其實是面向物件方法論的一個昇華。

相關推薦

DDD -- 領域驅動設計 -- 面向物件OOA/OOD缺陷

OOA/OOD/OOP中,尤其是OOD/OOP,大家都不陌生,用了很多年。並且大部分人,都是從OOP開始,到了一定階段,會再去接觸OOD, 之後是OOA。 這樣用久了,自然而然會覺得“面向物件”是天經地義的,不太會去想面向物件有什麼問題所在。 而DDD裡面,

C#進階系列——DDD領域驅動設計初探領域服務

前言:之前一直在搭建專案架構的程式碼,有點偏離我們的主題(DDD)了,這篇我們繼續來聊聊DDD裡面另一個比較重要的知識點:領域服務。關於領域服務的使用,書中也介紹得比較晦澀,在此就根據博主自己的理解談談這個知識點的使用。 DDD領域驅動設計初探系列文章: 一、領域服務的引入 在《領域驅動設計:軟體核

C#進階系列——DDD領域驅動設計初探:WCF搭建

前言:前面三篇分享了下DDD裡面的兩個主要特性:聚合和倉儲。領域層的搭建基本完成,當然還涉及到領域事件和領域服務的部分,後面再專案搭建的過程中慢慢引入,博主的思路是先將整個架構走通,然後一步一步來新增相關元素,使架構慢慢變得豐滿。這篇打算分享下應用層的搭建。根據DDD的設計原則,應用層不包含任何領域邏輯,它主

C#進階系列——DDD領域驅動設計初探:AutoMapper使用

前言:前篇搭建了下WCF的程式碼,就提到了DTO的概念,對於為什麼要有這麼一個DTO的物件,上章可能對於這點不太詳盡,在此不厭其煩再來提提它的作用: 從安全上面考慮,領域Model都帶有領域業務,讓Client端引用Domain Model就意味著Client端可以繞過應用層直接完成業務邏輯的呼叫,這樣

C#進階系列——DDD領域驅動設計初探:倉儲Repository

前言:上篇介紹了下倉儲的程式碼架構示例以及簡單分析了倉儲了使用優勢。本章還是繼續來完善下倉儲的設計。上章說了,倉儲的最主要作用的分離領域層和具體的技術架構,使得領域層更加專注領域邏輯。那麼涉及到具體的實現的時候我們應該怎麼做呢,本章就來說說倉儲裡面具體細節方便的知識。 DDD領域驅動設計初探系列文章:

C#進階系列——DDD領域驅動設計初探:倉儲Repository

前言:上篇介紹了DDD設計Demo裡面的聚合劃分以及實體和聚合根的設計,這章繼續來說說DDD裡面最具爭議的話題之一的倉儲Repository,為什麼Repository會有這麼大的爭議,博主認為主要原因無非以下兩點:一是Repository的真實意圖沒有理解清楚,導致設計的紊亂,隨著專案的橫向和縱向擴充套件,

C#進階系列——DDD領域驅動設計初探:Web層的搭建

前言:好久沒更新部落格了,每天被該死的業務纏身,今天正好一個模組完成了,繼續來完善我們的程式碼。之前的六篇完成了領域層、應用層、以及基礎結構層的部分程式碼,這篇打算搭建下UI層的程式碼。 DDD領域驅動設計初探系列文章: 一、UI層介紹 在DDD裡面,UI層的設計也分為BS和CS,本篇還是以Web為

C#進階系列——DDD領域驅動設計初探:聚合

前言:又有差不多半個月沒寫點什麼了,感覺這樣很對不起自己似的。今天看到一篇博文裡面寫道:越是忙人越有時間寫部落格。呵呵,似乎有點道理,博主為了證明自己也是忙人,這不就來學習下DDD這麼一個聽上去高大上的東西。前面介紹了下MEF和AOP的相關知識,後面打算分享Automapper、倉儲模式、WCF等東西的,可是

DDD領域驅動設計(Domain Driven Design)

摘要 本文將介紹領域驅動設計(Domain Driven Design)的官方參考架構,該架構分成了Interfaces、Applications和Domain三層以及包含各類基礎設施的 Infrastructure。本文會對架構中一些重要元件和問題進行討論,

EF Code first 和 DDD (領域驅動設計研究)系列一

發的 tex bsp cti 設計 ron 映射 developer devel 在上個公司工作時,開發公司產品的過程中,接觸到了EF Code first. 當時,整個產品的架構都是Lead developer設計建立的,自己也不是特別理解,就趕鴨子上架跟著一起開發了。

領域驅動設計學習筆記一 事件匯流排

何為領域驅動設計?2004年著名建模專家Eric Evans發表了他最具影響力的書籍:《Domain-Driven Design: Tackling Complexity in the Heart of Software》(中文譯名:領域驅動設計:軟體核心複雜性應對之道),書中提出了領域驅動設計(簡稱 DD

DDD領域驅動設計

去除一切花俏的建模技巧,我覺得最重要的方向就是去努力分析問題和事物的本質,針對這個本質進行領域建模。這個領域建模,最主要的還是鍛鍊的人的事物抽象能力。10個人,建出來的領域模型都不同。本質原因就是大家對同一個問題的理解不同,對事物的本質的理解不同。雖然最終都能解決當前的問題,但是對適應未來需求變化的能力卻

淺談我對DDD領域驅動設計的理解

從遇到問題開始 當人們要做一個軟體系統時,一般總是因為遇到了什麼問題,然後希望通過一個軟體系統來解決。 比如,我是一家企業,然後我覺得我現線上下銷售自己的產品還不夠,我希望能夠在線上也能銷售自己的產品。所以,自然而然就想到要做一個普通電商系統,用於實現線上銷售自己企業產品的目的。 再比如,我是一家網際網

(DDD)領域驅動設計——認識領域驅動

什麼是領域Domain? 理解DDD,首先要理解領域。 通俗的說,領域就是業務;就是合格的產品經理的需求文件所表達的內容;狹義的說就是你的Business Layer裡所有的程式碼以及產生的影響等等; 嚴謹的定義是: 一個有邊界的業務面,其中包含業務概念,業務行

DDD領域驅動設計基本理論知識總結

原文地址:http://www.cnblogs.com/netfocus/archive/2011/10/10/2204949.html 領域驅動設計之領域模型 加一個導航,關於如何設計聚合的詳細思考,見這篇文章。 2004年Eric Evans 發表Domain

領域驅動設計系列文章3——有選擇性的使用領域驅動設計

lock 進行 業務邏輯 不能 答案 bre index 技術分享 文檔 本系列的第一篇博文拋磚引玉,大談領域驅動設計的優勢,這裏筆者還是希望以客觀的態度,談談領域驅動設計的缺點及其不適合使用的場景,以讓讀者可以有選擇性的使用領域驅動設計。 我們知道,

DDD領域驅動設計:倉儲

# 1 前置閱讀 在閱讀本文章之前,你可以先閱讀: * 什麼是DDD * DDD的實體、值物件、聚合根的基類和介面:設計與實現 # 2 什麼是倉儲? 倉儲封裝了基礎設施來提供查詢和持久化聚合操作。 它們集中提供常見的資料訪問功能,從而提供更好的可維護性,並將用於訪問資料庫的基礎結構或技術與領域模型層分離。

DDD領域驅動設計領域事件

# 1 前置閱讀 在閱讀本文章之前,你可以先閱讀: * DDD領域驅動設計是什麼 * DDD領域驅動設計:實體、值物件、聚合根 * DDD領域驅動設計:倉儲 * MediatR一個優秀的.NET中介者框架 # 2 什麼是領域事件? 領域事件是在領域中發生的事,你希望同一個領域(程序)的其他部分了解它。 通知

領域驅動設計實踐——驗證

  領域模型設計為複雜問題的解決提供了一套方法,但其理論往往非常抽象,本系列文單旨在提供一些最佳實踐。您需要首先認識到,軟體的設計過程主觀性很強,我希望能夠提供一個設計思想讓您在入門中有一個感性的認識,莫要陷入到“教條主義”中。 領域驅動設計:強調的是戰略,是巨集觀的,它為複雜業務的解決提供了指導思想。在實

面向物件程式設計其實很簡單——Python 面向物件初級篇

概述 面向過程:根據業務邏輯從上到下寫壘程式碼 函式式:將某功能程式碼封裝到函式中,日後便無需重複編寫,僅呼叫函式即可 面向物件:對函式進行分類和封裝,讓開發“更快更好更強...” 面向過程程式設計最易被初學者接受,其往往用一長段程式碼來實現指定功能,開發過