DDD之通用語言
通用語言和界限上下文(Bounded Context,2)同時(shí)構(gòu)成了DDD的兩大支柱,并且它們是相輔相成的。通用語言是有邊界范圍的,就是在界限上下文之內(nèi),通用語言所描述的語義是一致的,出了這個(gè)界限上下文語義就有可能改變了。
在開發(fā)過程中,最大的鴻溝之一便存在于領(lǐng)域?qū)<液烷_發(fā)者之間。通常來說,領(lǐng)域?qū)<覍㈥P(guān)注點(diǎn)放在交付業(yè)務(wù)價(jià)值上,而開發(fā)者則將注意力放在技術(shù)實(shí)現(xiàn)上。當(dāng)然,并不是說開發(fā)者的動(dòng)機(jī)是錯(cuò)誤的,而是說開發(fā)者的眼光被自然而然地吸引到了實(shí)現(xiàn)層面上。即便讓領(lǐng)域?qū)<液烷_發(fā)者一同工作,他們之間的協(xié)作也只是表面的,這時(shí)在所開發(fā)的軟件中便產(chǎn)生了一種映射:將業(yè)務(wù)人員所想的映射到開發(fā)者所理解的。這樣一來,軟件便不能完全反映出領(lǐng)域?qū)<业乃季S模型。隨著時(shí)間的推移,這種鴻溝將增加軟件的開發(fā)成本。而隨著開發(fā)者轉(zhuǎn)到其他項(xiàng)目或者離職,本應(yīng)該駐留在軟件中的領(lǐng)域知識(shí)也就丟失了。另一個(gè)問題發(fā)生在當(dāng)多個(gè)領(lǐng)域?qū)<抑g存在分歧的時(shí)候。這是很有可能發(fā)生的,因?yàn)槊總€(gè)專家只是熟悉某個(gè)或者某些特定的領(lǐng)域。另外,在某個(gè)領(lǐng)域里找不到真正的專家也是可能的,此時(shí),有人可能對(duì)該領(lǐng)域有所了解,但是他更像一個(gè)業(yè)務(wù)分析員。這些問題將導(dǎo)致相互矛盾的軟件模型。更糟的是,軟件的技術(shù)實(shí)現(xiàn)可能錯(cuò)誤地改變軟件的業(yè)務(wù)規(guī)則。
我們已經(jīng)能夠理解軟件開發(fā)的最大問題之一便是業(yè)務(wù)人員和技術(shù)人員需要某種翻譯才能交流。使領(lǐng)域?qū)<液烷_發(fā)者在一起工作,這樣開發(fā)出來的軟件能夠準(zhǔn)確地傳達(dá)業(yè)務(wù)規(guī)則。當(dāng)然,對(duì)于領(lǐng)域?qū)<液烷_發(fā)者來說,這并不表示單單地包容對(duì)方,而是將他們組成一個(gè)密切協(xié)作的團(tuán)隊(duì)。“準(zhǔn)確傳達(dá)業(yè)務(wù)規(guī)則”的意思是說,此時(shí)的軟件就像如果領(lǐng)域?qū)<沂蔷幋a人員時(shí)所開發(fā)出來的一樣。使用通用語言后在領(lǐng)域?qū)<摇㈤_發(fā)者和軟件本身之間不存在“翻譯”,意思是當(dāng)大家都使用相同的語言進(jìn)行交流時(shí),每人都能聽懂他人所說。
領(lǐng)域?qū)<覍⒑烷_發(fā)人員一起創(chuàng)建一套適用于領(lǐng)域建模的通用語言。通用語言必須在全隊(duì)范圍之內(nèi)達(dá)成一致;所有成員都使用通用語言進(jìn)行交流,通用語言也是對(duì)軟件模型的直接反映。請(qǐng)注意,雖然團(tuán)隊(duì)中同時(shí)包含領(lǐng)域?qū)<液烷_發(fā)人員,但并不是“我們”和“他們”的關(guān)系,團(tuán)隊(duì)中只有“我們”的概念。通用語言也有助于促使原本存在分歧的領(lǐng)域?qū)<覀冞_(dá)成一致意見。此外,通過將領(lǐng)域知識(shí)傳達(dá)給所有的團(tuán)隊(duì)成員,包括開發(fā)人員,整個(gè)團(tuán)隊(duì)也將更具凝聚力。我們甚至可以認(rèn)為,這是每個(gè)公司都應(yīng)該有的對(duì)于知識(shí)型工作者的起碼訓(xùn)練。
通用語言是團(tuán)隊(duì)共享的語言。領(lǐng)域?qū)<液烷_發(fā)者使用相同的通用語言進(jìn)行交流。事實(shí)上,團(tuán)隊(duì)中每個(gè)人都使用相同的通用語言。不管你在團(tuán)隊(duì)中的角色如何,只要你是團(tuán)隊(duì)的一員,你都將使用通用語言。通用語言是團(tuán)隊(duì)自己創(chuàng)建的公用語言,團(tuán)隊(duì)中同時(shí)包含領(lǐng)域?qū)<液蛙浖_發(fā)人員。
如何提煉通用語言呢?
同時(shí)繪制物理模型圖和概念模型圖,并標(biāo)以名字和行為。雖然這些圖并不是正式的設(shè)計(jì)圖,但它們卻包含了軟件建模的某些方面。即使你的團(tuán)隊(duì)在使用統(tǒng)一建模語言(Unified Modeling Language, UML )來完成正式建模,也不要得意忘形,因?yàn)檫@樣可能反而不利于團(tuán)隊(duì)的討論,最終將阻礙通用語言的產(chǎn)生。
創(chuàng)建一個(gè)包含簡單定義的術(shù)語表。將你能想到的術(shù)語都羅列出來,包括好的和不好的,并注明好與不好的原因。在你給術(shù)語下定義時(shí),你在不經(jīng)意間就會(huì)創(chuàng)造出一些可重用的詞匯,因?yàn)榇藭r(shí)你使用的是領(lǐng)域中的通用語言。
如果你不喜歡術(shù)語表,可以采用其他類型的文檔,但記得將那些“不正式”的模型圖也包含進(jìn)去。同樣,這里最終的目的也是發(fā)現(xiàn)通用語言中的術(shù)語和詞組。
由于團(tuán)隊(duì)中有些人工作在術(shù)語表上,還有些人工作在文檔上,此時(shí)你需要找到團(tuán)隊(duì)的其他人員來檢查你的成果。分歧肯定是有的,你應(yīng)該對(duì)此有所準(zhǔn)備。
總結(jié):
這里的“通用”意思是“普遍的”,或者“到處都存在的”。通用語言在團(tuán)隊(duì)范圍內(nèi)使用,并且只表達(dá)一個(gè)單一的領(lǐng)域模型。·
“通用語言”并不表示全企業(yè)、全公司或者全球性的萬能的領(lǐng)域語言。
界限上下文和通用語言間存在一對(duì)一的關(guān)系。
界限上下文是一個(gè)相對(duì)較小的概念,通常比我們起初想象的要小。界限上下文剛好能夠容納下一個(gè)獨(dú)立的業(yè)務(wù)領(lǐng)域所使用的通用語言。
只有當(dāng)團(tuán)隊(duì)工作在一個(gè)獨(dú)立的界限上下文中時(shí),通用語言才是“通用”的。
雖然我們只工作在一個(gè)限界上下文中,但是通常我們還需要和其他限界上下文打交道,這時(shí)可以通過上下文映射對(duì)這些限界上下文進(jìn)行集成。每個(gè)界限上下文都有自己的通用語言,而有時(shí)語言間的術(shù)語可能有重疊的地方。
如果你試圖將某個(gè)通用語言運(yùn)用在整個(gè)企業(yè)范圍之內(nèi),或者更大的、夸企業(yè)的范圍內(nèi),你將失敗。
