DDD理论学习系列(1)-- 通用语言
1.引言
在開始之前,我想我們有必要先了解以下DDD的主要參與者。因為畢竟語言是人說的嗎,就像我們面向?qū)ο缶幊桃粯?#xff0c;那通用語言面向的是?
DDD的主要參與者:領(lǐng)域?qū)<?#43;開發(fā)人員
領(lǐng)域?qū)<?#xff1a;精通業(yè)務(wù)的任何人。
開發(fā)人員:開發(fā)+測試。
領(lǐng)域?qū)<疑瞄L某個領(lǐng)域的知識,專注于交付的業(yè)務(wù)價值。
開發(fā)人員則注重于技術(shù)實現(xiàn)。
開發(fā)人員總是想著類、接口、方法、設(shè)計模式、架構(gòu)等。以面向?qū)ο蟮木幊趟枷脒M行思考,思考如何進行抽象、封裝、繼承、多態(tài)等。而領(lǐng)域?qū)<覍浖械目蚣堋⒊志没?、?shù)據(jù)庫等沒有概念,而這也就導(dǎo)致了他們之間交流的困難性。
那怎么解決交流障礙這個問題呢?
2. 通用語言
拋開DDD而言,單從字面意思來理解,我們首先肯定先聯(lián)想到作為世界使用最多的語言--英語。
英語之所以能成為通用語言,我想無非是以下幾方面:
-
簡單易學(xué)
-
使用率高
-
國際通用
那DDD中通用語言又是怎樣呢?
首先它也同樣要擁有【簡單】的特性,這樣才便于理解和傳播。
其次,它也要有【通用】、【使用率高】的特性,因為只有在軟件開發(fā)的過程中,團隊范圍內(nèi)所有的參與人員廣泛使用,才能準確傳遞業(yè)務(wù)規(guī)則。
通用語言是團隊交流的基礎(chǔ)上建立起來的,代碼則是基于通用語言來進行業(yè)務(wù)表達的。
3. 舉個例子
項目經(jīng)理安排了一項任務(wù)給我:
圣杰這個補丁處理下【可銷控制】這個需求。
聽后,真是一臉懵逼,【可銷控制】是什么鬼?
這明顯是專業(yè)術(shù)語,我不懂的專業(yè)術(shù)語。
按照DDD對通用語言的定義,【可銷控制】就不算通用語言。
因為只有領(lǐng)域?qū)<抑浪暮x,開發(fā)人員一臉茫然。
但通用語言是領(lǐng)域?qū)<液烷_發(fā)人員一起創(chuàng)建的,所以我們開個需求會議,來梳理下專業(yè)術(shù)語背后的含義。
可銷控制的應(yīng)用場景是:
在ERP中,在做單時對銷售員負責(zé)的客戶進行范圍控制。比如,A客戶是銷售員小李發(fā)展過來的,小李希望僅能自己負責(zé)對A客戶的業(yè)務(wù)。
這么一解釋,是不是明白不少了。但是不是還有幾點疑惑?
-
可銷范圍如何配置?
-
做什么單據(jù)時進行可銷范圍控制?
-
如何進行可銷控制?
-
可銷控制需不需要參數(shù)控制?
經(jīng)過討論,得出以下結(jié)論:
-
提供專門的【銷售員-客戶可銷控制】界面進行銷售員-客戶映射數(shù)據(jù)配置。
-
做銷售訂單單據(jù)時進行可銷范圍控制
-
在錄入銷售員后,做單員在選擇客戶列表時,客戶列表中僅顯示可銷范圍配置的客戶數(shù)據(jù)。
-
提供【銷售員-客戶可銷范圍控制】系統(tǒng)參數(shù),勾選后才進行可銷范圍控制。
好了,這下需求理解個七八九了。
原來可銷控制就是銷售員-客戶銷售范圍控制。
咱們用一句話來精簡下這個需求:
可銷控制是指銷售員所負責(zé)客戶的范圍控制,當(dāng)勾選了【銷售員-客戶可銷控制】參數(shù)后,在做銷售訂單錄入客戶數(shù)據(jù)時,客戶列表僅能選擇到在【可銷控制】列表中為該銷售員配置的客戶。
經(jīng)過這么一說明,我們是不是已經(jīng)理清了【可銷控制】這個需求點。
那這種通過團隊交流達成共識的能夠簡單清晰準確傳遞業(yè)務(wù)規(guī)則的語言(可以是文字、圖片等)即可稱為通用語言。
4. 通用語言的價值
就像上面所說的那樣,通用語言的最大價值是解決了交流障礙問題,使領(lǐng)域?qū)<液烷_發(fā)人員能夠協(xié)同合作,從而能夠確保業(yè)務(wù)需求的正確表達。
另外,基于通用語言,開發(fā)人員能夠開發(fā)出可讀性更好的代碼,從而將業(yè)務(wù)需求準確轉(zhuǎn)化為代碼設(shè)計。達到DDD的目標代碼即設(shè)計,設(shè)計即代碼。通俗的講,也就是開發(fā)人員寫的代碼領(lǐng)域?qū)<乙材芸炊?/p>
5.通用語言的代碼表達
既然開發(fā)人員也要基于通用語言進行代碼開發(fā),那代碼如何體現(xiàn)通用語言呢?
在《實現(xiàn)領(lǐng)域驅(qū)動設(shè)計》書中有一個簡單的例子(P238),我們一起來看一下:
-
系統(tǒng)必須對User進行認證,并且只有當(dāng)Tenant(租戶)處于激活狀態(tài)時才能對User進行認證。
上面這個用例就是基于通用語言的用例,簡單清楚的說明了業(yè)務(wù)規(guī)則。
我們先看第一種代碼實現(xiàn):
這段代碼完全不能反應(yīng)通用語言,主要存在以下問題:
這段代碼先查找user,再對user進行密碼匹配來完成認證。其中user.IsAuthentic(password);表示的是“用戶是否被認證”的意思,而沒有表達出“認證”這個過程,即“對用戶進行認證”。
未體現(xiàn)“檢查Tenant是否處于激活狀態(tài)”這個前提條件。
知道問題后,我們可以講代碼略做改動:
bool?anthentic?=?false; Tenant?tenant?=?_tenantRepository.FindTenantById(tenantId);//檢查租戶是否激活if(tenant!=null&&tenant.IsActive){ User?user?=?_userRepository.FindUserByTenantIdAndUserName(tenantId,?userName);if(user!=null) {authentic?=?tenant.Authenticate(user,?password);//租戶對用戶進行認證} }return?authentic;以上代碼雖然也不是最終結(jié)果,但至少對通用語言進行了體現(xiàn)。通讀代碼,就能明白業(yè)務(wù)用例,體現(xiàn)代碼即設(shè)計這一思想。
本文轉(zhuǎn)自 yuanzhitang 51CTO博客,原文鏈接:http://blog.51cto.com/yuanzhitang/1946893,如需轉(zhuǎn)載請自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的DDD理论学习系列(1)-- 通用语言的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tomcat源码分析 - 1
- 下一篇: Linux 定期删除3天以前的日志文件