自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

你真的正確實(shí)現(xiàn)了領(lǐng)域模型嗎?

開發(fā) 前端
Eric Evans認(rèn)為,領(lǐng)域模型本身并不是某種特殊的圖,而是這種圖所要傳達(dá)的知識,并且這還特指針對領(lǐng)域?qū)<翌^腦中的知識的一種嚴(yán)格的組織且有選擇的抽象。

你的代碼真的正確實(shí)現(xiàn)領(lǐng)域模型了嗎?這個題目從領(lǐng)域驅(qū)動設(shè)計實(shí)踐者的角度來看,多少有些模糊不清了。代碼?領(lǐng)域模型?根據(jù)Eric Evans的《Domain-Driven Design》一書,代碼本身不也是一種領(lǐng)域模型嗎?在開始本篇正題之前,有必要先對相關(guān)概念做簡單梳理。

Eric Evans認(rèn)為,領(lǐng)域模型本身并不是某種特殊的圖,而是這種圖所要傳達(dá)的知識,并且這還特指針對領(lǐng)域?qū)<翌^腦中的知識的一種嚴(yán)格的組織且有選擇的抽象。

根據(jù)這種理解,領(lǐng)域模型可以被自由地表示為圖、文字甚至是代碼!也就是說,領(lǐng)域模型和代碼在Evans看來本質(zhì)上是同一種東西。

盡管如此,本文還是使用“領(lǐng)域模型”作為一個與“代碼”相對的概念,這是為什么呢?

這是因?yàn)?,這種理解常常更符合開發(fā)人員的認(rèn)知。從大多數(shù)開發(fā)人員的角度來看,“模型”這個概念,不管是否是面向“領(lǐng)域”的,常常區(qū)別于代碼并且以圖的形式存在(比如,典型的UML圖)。實(shí)際上,這兩種觀點(diǎn)并不沖突。筆者在這里將前者Evans對領(lǐng)域模型的理解稱為一種“廣義的領(lǐng)域模型”,將后者特指圖形式的領(lǐng)域模型稱為一種“狹義的領(lǐng)域模型”。廣義的與狹義的領(lǐng)域模型的關(guān)系如下圖所示。

圖片

細(xì)心的讀者將會發(fā)現(xiàn),上圖還傳遞了另外兩個觀點(diǎn)。

第一:圖形式的領(lǐng)域模型通常對應(yīng)于設(shè)計階段,而代碼形式的領(lǐng)域模型則通常對應(yīng)于實(shí)現(xiàn)階段。這種觀點(diǎn)其實(shí)與張逸老師的《我對領(lǐng)域模型的理解》一文不謀而合。他認(rèn)為,設(shè)計對領(lǐng)域模型的反映,就是設(shè)計模型;代碼對領(lǐng)域模型的表達(dá),就是實(shí)現(xiàn)模型。在設(shè)計階段,軟件設(shè)計人員需要基于對領(lǐng)域的理解建立對領(lǐng)域問題的解決方案;在實(shí)現(xiàn)階段,開發(fā)人員則根據(jù)設(shè)計模型進(jìn)行編碼實(shí)現(xiàn),使領(lǐng)域模型躍然于代碼上。當(dāng)然,在設(shè)計與實(shí)現(xiàn)之前還需要有分析階段,領(lǐng)域?qū)<遗c開發(fā)團(tuán)隊(duì)圍繞領(lǐng)域梳理對業(yè)務(wù)知識的理解。不過,分析階段關(guān)注的又是另外一些問題了,本文主要討論設(shè)計與實(shí)現(xiàn)階段及其軟件制品之間的關(guān)系。

第二:狹義的領(lǐng)域模型與代碼,同時作為廣義的領(lǐng)域模型的特定表現(xiàn)形式,二者之間需要有明確的對應(yīng)關(guān)系。也就是說,代碼應(yīng)該忠實(shí)地反映領(lǐng)域模型,(狹義的)領(lǐng)域模型也應(yīng)該及時地表現(xiàn)出代碼的變化。正是領(lǐng)域模型與代碼實(shí)現(xiàn)之間的緊密聯(lián)系才使模型變得有用,并確保我們所作出的深層次的設(shè)計能夠最終轉(zhuǎn)化為可運(yùn)行的軟件。當(dāng)然,如果團(tuán)隊(duì)本身能力很強(qiáng),完全只使用代碼來表示領(lǐng)域模型,那就可以從根本上避免代碼與領(lǐng)域模型不一致的問題。

言歸正傳,那么,所謂的領(lǐng)域模型和代碼之間“明確的對應(yīng)關(guān)系”具體指的是什么呢?筆者認(rèn)為,這具體包含三個方面的對應(yīng)關(guān)系:

術(shù)語方面,也就是說代碼中使用的領(lǐng)域術(shù)語應(yīng)與(狹義的)領(lǐng)域模型中的一致,這與Evans強(qiáng)調(diào)的在代碼中貫徹使用通用語言(Ubiquitous Language)是一致的。

領(lǐng)域概念的分解,也就是說結(jié)構(gòu)方面的設(shè)計,包括領(lǐng)域?qū)ο蠹捌潢P(guān)系,在代碼與領(lǐng)域模型中應(yīng)是一致的。比如,UML類圖與代碼結(jié)構(gòu)之間應(yīng)該存在明確的對應(yīng)。

領(lǐng)域概念之間的交互,也就是說行為方面的設(shè)計,包括領(lǐng)域?qū)ο笾g的動作,在代碼與領(lǐng)域模型中應(yīng)是一致的。比如,UML時序圖與代碼行為之間應(yīng)該存在明確的對應(yīng)。

為了實(shí)現(xiàn)設(shè)計階段的領(lǐng)域模型與實(shí)現(xiàn)階段的代碼之間的一致,從模型驅(qū)動工程(Model-Driven Engineering)的角度來看讀者可以應(yīng)用以下幾種策略。

1、從模型到代碼的轉(zhuǎn)換

從模型到代碼的轉(zhuǎn)換(Model-to-Code Transformation)是模型驅(qū)動工程的一種典型技術(shù),尤其活躍于2010年前后。將這種技術(shù)應(yīng)用于領(lǐng)域驅(qū)動設(shè)計,可以幫助從領(lǐng)域模型自動化地生成代碼,從而減少開發(fā)人員手動編寫代碼的工作量,一定程度上能夠降低由于開發(fā)人員的疏忽造成的與領(lǐng)域模型的不一致。另一方面,由于其自動化的代碼生成過程,該技術(shù)還被期望能夠提高軟件開發(fā)效率。

領(lǐng)域驅(qū)動設(shè)計社區(qū)推崇的「模型到代碼轉(zhuǎn)換策略的工具」包括SCULPTOR (http://sculptorgenerator.org/), LEMMA(https://github.com/SeelabFhdo/lemma)等。

然而,從模型到代碼的轉(zhuǎn)換方法存在兩個固有問題。

其一,由于模型本身相比于代碼總是不夠具體的,因此從模型到代碼的轉(zhuǎn)換通常只能生成代碼框架,其代碼實(shí)現(xiàn)細(xì)節(jié)仍需由開發(fā)人員手動實(shí)現(xiàn)。這一過程仍然可能造成代碼與領(lǐng)域模型的偏離。

其二,在開發(fā)人員基于生成的代碼框架實(shí)現(xiàn)代碼細(xì)節(jié)時,領(lǐng)域模型本身可能也在演化,那么,演化后的領(lǐng)域模型所生成的代碼應(yīng)該如何與開發(fā)人員正在修改的代碼進(jìn)行合并呢?二者之間的合并沖突問題又應(yīng)該如何解決?

2、代碼到模型的轉(zhuǎn)換

從代碼到模型的轉(zhuǎn)換(Code-to-Model Transformation),是從模型到代碼轉(zhuǎn)換的逆向過程,可以被認(rèn)為是模型驅(qū)動的逆向工程(Model-Driven Reverse Engineering)的典型技術(shù)。

將這種技術(shù)應(yīng)用于領(lǐng)域驅(qū)動設(shè)計,可以幫助從代碼中恢復(fù)出可視化的領(lǐng)域模型,所恢復(fù)的領(lǐng)域模型本身代表了“在代碼中被實(shí)現(xiàn)的領(lǐng)域模型”,同時它也是對代碼進(jìn)行的一種抽象與可視化。利用恢復(fù)得到的圖形式的領(lǐng)域模型,開發(fā)人員能夠進(jìn)一步對比設(shè)計的領(lǐng)域模型與實(shí)現(xiàn)的領(lǐng)域模型,從而快速發(fā)現(xiàn)和報告兩者之間的分歧。

更進(jìn)一步地,還可以在設(shè)計的領(lǐng)域模型與實(shí)現(xiàn)的領(lǐng)域模型之間進(jìn)行反射建模(Reflexion Modeling),即通過可視化的映射模型表現(xiàn)出實(shí)現(xiàn)的領(lǐng)域模型相比于設(shè)計階段的差異(包括新增、刪除與修改元素),從而更直觀地幫助開發(fā)人員識別代碼是否偏離了領(lǐng)域模型。

此外,抽象與可視化后的代碼視圖還可以幫助開發(fā)人員進(jìn)行知識消化(Knowledge Crunching),減少該過程對代碼實(shí)現(xiàn)細(xì)節(jié)的依賴,從而降低該過程的認(rèn)知復(fù)雜度。該策略的具體實(shí)施方法可以參考筆者最近在軟件學(xué)報上發(fā)表的《一種面向領(lǐng)域驅(qū)動設(shè)計的逆向建模支持方法》一文(http://www.jos.org.cn/jos/article/abstract/6278?st=search)。

3、模型組合

模型組合(Model Composition)基于關(guān)注點(diǎn)分離的思想將軟件系統(tǒng)劃分為模型單元并通過合成處理技術(shù)來組裝這些單元以解決系統(tǒng)的復(fù)雜性。

將這種技術(shù)應(yīng)用于領(lǐng)域驅(qū)動設(shè)計,可以通過組合領(lǐng)域模型元素(及其代碼)得到開發(fā)人員預(yù)期的領(lǐng)域模型與代碼,從而降低開發(fā)人員手動實(shí)現(xiàn)代碼的工作量,減小代碼偏離領(lǐng)域模型。

這種策略,在筆者看來與目前大行其道的低代碼類似,其本質(zhì)上都通過組件化以及模型驅(qū)動工程等思想來減少開發(fā)人員的代碼編寫。目前,根據(jù)最新的學(xué)術(shù)文獻(xiàn)綜述(https://www.sciencedirect.com/science/article/pii/S0950584920300689),這種策略仍存在許多挑戰(zhàn),比如如何自動化地匹配要組合的模型元素,缺少工業(yè)規(guī)模的解決方案等。

4、模型與代碼的可追溯性管理

模型驅(qū)動工程被廣泛地用于多個軟件制品之間的可追溯性管理,比如設(shè)計文檔、源代碼以及測試用例等。將這種技術(shù)應(yīng)用于領(lǐng)域驅(qū)動設(shè)計,可以在領(lǐng)域模型和代碼之間建立鏈接,并通過跟蹤這些鏈接可視化地展示與維護(hù)領(lǐng)域模型和代碼之間的一致性。

此外,如果輔以自動化的模型轉(zhuǎn)換技術(shù)(比如從模型到代碼轉(zhuǎn)換),利用這種機(jī)制還可以自動化地維護(hù)領(lǐng)域模型和代碼之間的鏈接。也就是說,當(dāng)源模型(比如領(lǐng)域模型)被修改時,這種修改可以被自動化地傳播到目標(biāo)模型(比如代碼)上。

缺乏適當(dāng)?shù)目勺匪菪孕畔⒌拇鎯?、處理與查詢技術(shù)被學(xué)術(shù)界(https://www.sciencedirect.com/science/article/pii/S0950584912001346)認(rèn)為是這種策略目前存在的局限性。筆者尚未看到這種策略在領(lǐng)域驅(qū)動設(shè)計社區(qū)的應(yīng)用。

更重要的是,以上基于模型驅(qū)動工程的方法實(shí)際上都還依賴于某種領(lǐng)域特定語言(Domain Specific Language)。

比如,要想實(shí)現(xiàn)自動化的模型到代碼的轉(zhuǎn)換,期望的領(lǐng)域特定語言需要回答三個問題,即如何表示領(lǐng)域模型,如何表示代碼,以及如何建立領(lǐng)域模型元素到代碼元素之間的映射。

比如,如何在圖形式的領(lǐng)域模型中表示聚合?如何在代碼中表示聚合?如何在這兩種形式的聚合之間建立關(guān)聯(lián)?

既然如此,使用這些領(lǐng)域特定語言就很可能會對開發(fā)團(tuán)隊(duì)的建模語言與編程語言等做出一定限制,要想在工業(yè)界落地這些模型驅(qū)動工程方法仍然有很多問題值得被討論。筆者在此列出的一二三不過是班門弄斧罷了。

本文作者是南京大學(xué)鐘陳星博士,目前正從事領(lǐng)域驅(qū)動設(shè)計與微服務(wù)相關(guān)的學(xué)術(shù)研究。此研究對于領(lǐng)域驅(qū)動設(shè)計的工程實(shí)踐而言,具有較高價值。作為國內(nèi)目前唯一開展領(lǐng)域驅(qū)動設(shè)計方向?qū)W術(shù)研究的團(tuán)隊(duì),鐘博士在南京大學(xué)張賀教授的指導(dǎo)下,研讀了大量領(lǐng)域驅(qū)動設(shè)計的書籍與論文,對這一領(lǐng)域具有頗深造詣。感謝鐘博士的信任,邀請我加入該項(xiàng)目,使我能附驥參與此項(xiàng)研究,以貢獻(xiàn)我在工程實(shí)踐方面的一隅之見。

責(zé)任編輯:武曉燕 來源: 逸言
相關(guān)推薦

2019-10-18 09:50:47

網(wǎng)絡(luò)分層模型網(wǎng)絡(luò)協(xié)議

2019-09-15 10:38:28

網(wǎng)絡(luò)分層模型

2010-03-04 15:12:33

Python算法

2009-12-29 18:09:00

Silverlight

2010-03-04 11:12:02

Python AOP

2010-02-25 10:10:29

WCF使用Header

2009-12-03 11:11:57

PHP網(wǎng)站優(yōu)化

2010-02-24 10:07:48

WCF跨越邊界

2018-11-20 09:37:19

Java內(nèi)存模型

2010-08-16 14:07:44

盒模型marginpadding

2009-12-11 17:52:21

PHP獲取博客數(shù)據(jù)

2010-03-03 17:10:57

Python操作Sql

2010-02-26 11:22:16

LitwareHR使用

2010-02-24 13:48:44

MSMQ使用WCF

2010-02-24 10:41:28

WCF服務(wù)保護(hù)

2009-12-07 18:42:55

PHP與Javascr

2010-06-09 09:34:11

2009-12-04 12:51:27

PHP functio

2009-12-09 16:49:09

PHP顯示文章發(fā)布時間

2010-02-25 13:48:23

WCF動態(tài)創(chuàng)建代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號