淺談領域模型
|0x00 領域模型是什麼
領域模型是什麼?一句話:“經濟基礎決定上層建築”中的“經濟基礎”,是幫助理解複雜業務領域問題的基石。
有人說:“領域模型是一個商業概念,同行業的企業,一定有內在的共性,是幫助系統分析人員認識現實業務的工具。”領域,即邊界的意思,有了清晰的邊界,協作才有了利益的基礎;模型,即知識體系,深入理解了業務知識,開發才不會走過多的彎路。一般意義上的領域模型是面向軟體工程領域的,而現實意義的領域模型則包含了商業模式等廣義上的概念。
很多人一上來理解領域驅動設計(DDD),基本都是一頭霧水,因為模型設計的初衷並不是圍繞效能、架構、分層等軟體概念展開的,而是從邊界、內聚等抽象概念開始講起。理解領域模型,並不是通過技術的思維來學習,而是通過不斷地實踐過程來訓練自我的思維意識,進而徹底形成結構化與物件導向的思維方法論。
領域模型並不能直接帶來收益,只是輔助我們去理解正在做的事情。
引用百度的說法,“領域模型是對領域內的概念類或現實世界中物件的視覺化表示。又稱概念模型、領域物件模型、分析物件模型。它專注於分析問題領域本身,發掘重要的業務領域概念,並建立業務領域概念之間的關係。”總結一下,就是“準確描述問題,清晰描述方案”。
如果說軟體開發的本質,是從“問題空間”到“解決方案空間”的轉化,那麼“領域模型”,就是“解決方案空間”的架構,通過抽象的模型,為系統帶來統一的認知。
|0x01 領取模型怎麼設計
設計領域模型之前,首先要確定“問題空間”,即對需求進行分析和拆解。值得注意的是,領域模型通常是針對比較大的系統設計而言,如果是日常功能迭代中的小需求,那麼只需要根據已經設計好的模型原則,來做對應的開發即可。
需求分析階段要做的就是確定系統要實現的核心功能是什麼,用UML來表達設計意圖是非常好的工具。UML通過動靜結合的圖示,便可以比較清楚的闡述系統的核心職責與過程。
- 類圖:靜態,展示了模型中存在的類、類的內部結構以及它們與其他類的關係等;
- 狀態機:動態,對一個單獨物件的行為建模,指明物件在它的整個生命週期裡,響應不同事件時,執行相關事件的順序;
- 時序圖:動態,描述物件之間傳送訊息的時間順序顯示多個物件之間的動態協作。
接下來,就是業務建模階段了。在大多數講領域驅動的書籍裡,都會將領域劃分為:領域,子域和限界上下文。領域是一個模型所包含的全部事情;子域是指模型的某個細分部分,根據重要性可以劃分為核心、支撐和通用;限界上下文是一個業務邊界,邊界內的術語都有其特定的涵義,例如銀行系統和電商系統中顧客就不是同一個意思。這種劃分方式通常是非常靈活的,跟設計者的個人經驗有比較大的關係。
將系統拆分完成後,就需要確定子域/上下文之間的關係,以及相互之間的資訊如何進行流轉,例如:
- 模型概念
- 模型屬性和屬性值
- 模型之間的關係
最後,就是通過某些具體的方法論,分析具體的模型設計了。設計的方法論也有很多種,例如在用例分析方法中,就是儘可能的收集用例素材,通過例圖,以圖形化的方式將系統描述成用例、參與者(使用者)及其之間的關係;在DODAF中,是採用標準方法,表述“EA的資料和關係型別”的指引,解決複雜系統結構化問題的指引。在四色建模法中,用藍色表示命令,用紅色表示實體,用綠色表示領域事件,用黃色表示補充資訊,相關的實體便可以整理到同一個領域中。建模方式有很多種,不論是已有的方法論,或者是通過日常的業務經驗積累來設計,只要能將模型描述清楚,都是可用的。
做個總結,就是拋開技術視角,用純業務的視角來建立模型。但確定的一點是,領域模型的優先順序要高於軟體解決方案,先有領域建模的整體框架,然後才是將模型對映到軟體架構之中。
|0x02 領域模型的價值
建模是一個團隊性的複雜工作,經過長時間的摸索,有幾個特點還是可以總結出來:
- 建模的時候,不要立刻開始設計具體的模型,而是先對業務進行分析和拆解;很多時候,業務人員也不一定非常熟悉業務,前期調研的過程是必不可少的。
- 為了避免產生歧義,在建模的過程中最好使用統一的術語與工具,例如UML。
- 學會適應變化,模型本身是會發生變化的,變化的頻率取決於業務發展的速度,當下的形態都是某種意義上的中間態。
一個好的軟體系統,需要同時在滿足業務需求和系統底層架構之前做權衡,產品運營往往不具備技術背景,因此在“做不做”與“怎樣做”之間,往往會爆發激烈的衝突。更多的時候,是對同樣的概念,雙方都有不同的理解,這種GAP不一定是“大到天邊”的那種差異,而是針對某些具體的細節發生了誤解,但這種細節往往非常致命。這時候,通過模型來反應實際的業務情況,相當於說明書的作用,來與需求方溝通,就會有效的多。
因而,從全域性的角度看,領域模型會帶來如下的價值:
- 統一語言:溝通更加順暢,分歧易於解決;
- 知識沉澱:通過對業務領域的熟悉過程,能夠以模型的方式沉澱下來,對於自己提升與團隊傳承均有幫助;
- 保持清晰:在需求溝通時,能夠快速明確哪些需求是合理的,哪些是違反業務規則的,可以讓業務跑的更快的同時,保持系統結構的清晰。
|0xFF 數字化轉型
看完前面的內容,大多數人會有一種疑問,即領域模型適用在哪裡?大多數的網際網路場景下,用了領域模型,反而會讓業務更復雜。其實自Eric Evans在2003年出版《領域驅動設計:軟體核心複雜性應對之道》之後,領域模型的概念才深入人心,那會網際網路發展的並不充分。而隨著近幾年越來越多的企業意識到數字化的重要性,如何用資料去驅動特定行業的發展,比如製造業,慢慢的成為了一種潮流。在這種潮流裡,革新傳統行業的大概率不是從傳統行業走出來的人,而是依賴於掌握了數字化技術的人,技術人怎樣快速去了解和深入一個陌生的行業呢?領域模型自然就派上了用場。
例如在資訊時代常見的生產力工具ERP和MES,能夠解決資訊化的很多問題,但是對於生產流轉的過程掌握,就不那麼適用了,尤其是5G之後很多裝置也具備了數字化的特徵。用以“資料流”為主要特點的新管理系統,去適應和替代原有的生產系統,就顯得很有必要。但過去的“資料流”依賴於Hadoop體系及維度模型,這套組織方式套用到過去的管理系統中,會產生很多的不適應性,因而通過領域模型的方式,去抹平技術上的種種差異,為傳統VS網際網路行業的人達成共識,共同推動系統改造,就創造了基礎。
相關文章
- 3NF淺談BI領域的資料模型設計模型
- 淺談DDD(領域驅動設計)
- 淺談 DDD 領域驅動設計
- 淺淺淺談JavaScript作用域JavaScript
- 周立功布局BLE領域-Nordic空中升級淺談
- 淺談JavaScript作用域JavaScript
- 淺談人工智慧在流媒體領域的應用人工智慧
- 淺談雙親委派模型模型
- 談DDD與貧血領域模型:再次為失血模型辯護 -Codecentric AG部落格模型
- 運用領域模型——DDD模型
- 淺談Java記憶體模型Java記憶體模型
- 在DDD中建立領域模型模型
- 淺談工業網際網路,從應用領域到解決方案
- 淺談JS作用域、this及閉包JS
- 淺談Javascript中的作用域鏈JavaScript
- 再談領域驅動設計
- 淺談Netty的執行緒模型Netty執行緒模型
- 淺談話題模型:LSA、PLSA、LDA模型LDA
- 領域模型驅動開發(1)模型
- 領域驅動模型DDD(二)——領域事件的訂閱/釋出實踐模型事件
- 淺談人工智慧在銀行領域的應用及未來發展趨勢人工智慧
- DDD-領域驅動設計簡談
- 帶領大家淺談如何學習大資料大資料
- RocketMQ系列2:領域模型和技術概念MQ模型
- 自動生成特定領域模型和圖表模型
- 領域模型的核心本質是什麼?模型
- 淺談 JVM GC 的安全點與安全區域JVMGC
- 戲說領域驅動設計(十)——雜談
- 第41篇 領域驅動設計詳談
- 聊一聊領域驅動與貧血模型模型
- 領域驅動模型DDD(一)——服務拆分策略模型
- 使用函式式語言來建立領域模型函式模型
- 淺淺談ReduxRedux
- 如何進行高質量的DDD領域建模?什麼是領域模型?如何捕捉?尺寸如何? - Manning模型
- NLP領域預訓練模型的現狀及分析模型
- 領域模型的雙時態設計Bi-temporal模型
- 千“垂”百鍊:垂直領域與語言模型(1)模型
- 什麼是數字廣告領域的 OCPM 模型?模型