談到領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)逸月,簡簡單單的六個(gè)字,卻包含了兩個(gè)關(guān)鍵點(diǎn):一個(gè)是“領(lǐng)域”遍膜,另一個(gè)是“設(shè)計(jì)”碗硬∪肯妫“驅(qū)動(dòng)”一詞,則對(duì)兩個(gè)名詞(關(guān)鍵點(diǎn))的關(guān)系進(jìn)行了定義恩尾。左思右想弛说,“驅(qū)動(dòng)”一詞好像是二者間關(guān)系一個(gè)現(xiàn)在看來最為恰當(dāng)?shù)拿枋觯瑹o可替代——既不是領(lǐng)域強(qiáng)制性決定如何去設(shè)計(jì)翰意,又不是設(shè)計(jì)可以凌駕于領(lǐng)域之外的無關(guān)緊要木人,而是一種平行的,互為依托的關(guān)系冀偶。沒有設(shè)計(jì)的領(lǐng)域毫無意義醒第,而沒有領(lǐng)域的設(shè)計(jì)也只是紙上談兵。
似乎进鸠,對(duì)領(lǐng)域(模型)的設(shè)計(jì)稠曼,是對(duì)一件藝術(shù)品的仔細(xì)雕琢一般。
我開始學(xué)習(xí)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)客年,源動(dòng)力在于擼代碼時(shí)的絕望霞幅。
對(duì),就是絕望量瓜。
冗長而不知其意的名稱司恳,無窮無盡的 setter/getter。我仿佛一眼便看到了世界的盡頭榔至。就像現(xiàn)在你抵赢,不幸看到我這冗長、無聊唧取、不知所云的開頭一般铅鲤。
就問你,累不累枫弟?煩不煩邢享?絕不絕望?
絕望也要看下去淡诗。別問我為什么骇塘。從現(xiàn)在開始,在你的世界里韩容,沒有為什么款违。
好了,言歸正傳群凶。
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中插爹,最為關(guān)鍵的兩個(gè)核心點(diǎn),或者稱之為支柱的便是 <strong>限界上下文</strong> 和 <strong>通用語言</strong>。
一直很奇怪老外的語法形式赠尾,又間接對(duì)國內(nèi)整體翻譯水平產(chǎn)生了懷疑力穗。
在我看來,限界上下文倒不如稱為 <strong>語境</strong>(上下文是具象的气嫁,語境才是抽象的好不好当窗?)。
通用語言寸宵,就是在語境中能說得通崖面,說順溜,不會(huì)產(chǎn)生明顯歧義(怪我大中華文化博大精深咯)的一個(gè)詞梯影、一句話嘶朱。
看到這里,你應(yīng)該覺著這玩意兒時(shí)騙人的吧光酣。這樣想就對(duì)了疏遏,沒這樣想就試著想想。
其實(shí)救军,一開始我也是這么想的财异。一個(gè)詞、一句話唱遭、一段文戳寸,外加一個(gè)語境,就能搞出什么鬼設(shè)計(jì)來拷泽?
還真別說疫鹊,舉個(gè)簡單的例子,亮瞎你的 24K 純鈦合金 dog 眼:
試著設(shè)計(jì)一個(gè)我們常見的Class:User
public class User {
private String username;
public void setUsername(String username) {
this.username = username;
}
public String getUsername() {
return this.username;
}
}
試著用一個(gè) User 實(shí)例化對(duì)象調(diào)用他的 getUsername()方法:
public class Main {
public static void main(String[] args) {
User user = new User();
String username = user.getUsername();
}
}
傳統(tǒng)的調(diào)用方法大概就是這樣吧司致。
不論其他拆吆,請(qǐng)您給我順暢地用中文將 user.getUsername() 翻譯過來。
我的翻譯是這樣的:用戶(user)得到(get)Username(用戶名)脂矫。
so easy, <strong>用戶得到用戶名</strong>枣耀。
發(fā)現(xiàn)問題沒有?沒有庭再?回幼稚園重新回爐深造去捞奕。好吧,開個(gè)玩笑拄轻,重來一次颅围,還是上面的模式:將 User 替換成 You:
public class You {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
試著用一個(gè) You 實(shí)例化對(duì)象調(diào)用他的 getName()方法:
public class Main {
public static void main(String[] args) {
You you = new You();
String name = you.getName();
}
}
首先聲明,以上這個(gè)例子只在于說明問題恨搓。
就問你院促,發(fā)現(xiàn)問題沒?還沒發(fā)現(xiàn)?對(duì)不起一疯,不開玩笑的說,請(qǐng)您出門右轉(zhuǎn)夺姑,祖國的花兒幼稚園歡迎您墩邀!
慢走不送,下次也別再來了盏浙。
什么鬼嘛眉睹?<strong>你得到名字</strong>。
你需要得到你的名字嗎废膘?需要嗎竹海?需要嗎?需要嗎丐黄?
不需要斋配!
你的名字是你出生后父母給你起的,中間即使可能更名(換姓的請(qǐng)舉手)灌闺,但你從來都不需要去“得到你的姓名”艰争。除非你患上了“失憶癥”。但桂对,即使如此甩卓,你也應(yīng)該調(diào)用 AmnesicPatients#whoami()。
好蕉斜,話題繼續(xù)回到領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)上逾柿。說到底,領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)就是用來解決不合理:包名不合理宅此、類名不合理机错、屬性名不合理、方法名不合理父腕、方法位置不合理毡熏、調(diào)用不合理、程序奔潰不合理......
沒有包治各種不合理(起碼李家孩子和隔壁老王同姓這種不合理是真沒轍)侣诵,畢竟痢法,凡事都有妥協(xié)與余地,但總歸大部分不合理可以得到根治杜顺。況且财搁,一切都合理才是最大的不合理。
繼續(xù) User 這個(gè)例子躬络,這個(gè)是改進(jìn)版的:
public class User {
private String username;
public void setUsername(String username) {
this.username = username;
}
public String username() {
return this.username;
}
}
public class Main {
public static void main(String[] args) {
User user = new User();
user.username();
}
}
現(xiàn)在的調(diào)用是不是合理多了:<strong>用戶的用戶名</strong>
public class You {
private String name;
public void setName(String name) {
this.name = name;
}
public String name() {
return this.name;
}
}
public class Main {
public static void main(String[] args) {
You you = new You();
you.name();
}
}
<strong>你的名字</strong>
別問我“的”是哪兒來的尖奔, ‘.’ 即是“的”,“的”即是 ‘.’ 。
不要懷疑提茁,即使將現(xiàn)在的論調(diào)拿到過去舊的案例淹禾,舊案例的調(diào)用依舊不合理:用戶的得到用戶名(得到用戶名的用戶)、你的得到名字茴扁。
八格牙路铃岔。你的良心大大地壞了。
其實(shí)峭火,初識(shí) DDD(Domain Drive Design · 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì))覺得最難的也就是對(duì)什么“限界上下文”(語境)和“通用語言”(在某一語境中盡最大可能無歧義的詞毁习、句)了。所以......
上面討論的卖丸,其實(shí)基本都是屬于通用語言范疇纺且,至于語境(限界上下文),我真不知道該怎么描述稍浆,難道是载碌,見人說人話,見鬼說鬼話——同樣的人衅枫,在不同的環(huán)境下恐仑,會(huì)有不同的表現(xiàn)形式。一個(gè)同樣名稱的 Class为鳄,在不同的業(yè)務(wù)系統(tǒng)中就有可能描述了不同的兩種事物裳仆?
好吧,賤人賤智了孤钦!
《實(shí)現(xiàn)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》中歧斟,談到通用語言是,業(yè)務(wù)專家和開發(fā)者等一群對(duì)相關(guān)業(yè)務(wù)或技術(shù)熟悉的人偏形,進(jìn)行反復(fù)討論后静袖,互相補(bǔ)充后達(dá)成一致的產(chǎn)物。
所以說俊扭。队橙。。那啥萨惑,剛才出門右轉(zhuǎn)的朋友捐康,你可以學(xué)成歸來了。
PS:行文風(fēng)格有點(diǎn)騷(我這老臉)庸蔼,不喜輕噴解总!