Eric Evans的《領域驅動設計——軟體核心複雜性應對之道》,被很多人捧得火熱。就像當年的Gof4的設計模式一樣。當年也是別人推薦我看設計模式。看完設計模式才稍微懂了一點物件導向,物件導向基本是現在設計優秀軟體的首選,當然還有soa,但是並不衝突。恐怕物件導向會是軟體業很長一段時間的寵兒。看完設計模式,才有了物件導向編程的意識。同樣是炒的很火的一本書。只因沒有太多時間看完整本,挑了一個quick版。不得不寫一些感觸,因為它對我我的觸動也同樣很重要。推薦從事軟體行業的朋友、同事看這本好書。
談領域驅動就不得不談物件導向。對象有三個基本特徵,封裝,繼承,多態。這可是非常了不起的三個特性,不僅是對象的專利哦,也是架構設計的特質。小到前端應用有html、css、javascript。這其實就是封裝職責,html展現控制項,css負責排版布局,javscript負責行為。把他們該負責的事情自己來完成,職責劃分清楚是很重要的。因為會牽涉到後期的維護問題和分工協調的大問題。我就曾經試圖用純javascript建立元素,後來發現是不對的,因為javascript它的職責是動態行為不是展現控制項。封裝的好,也有利於程式的可讀性。達到系統架構,領域模型分塊,也是將內聚性好的模型(用模型替代層的概念)分成一個大模型,不同模型的劃分就是一種封裝呀。繼承的特性就更多了,包括css和資料庫的關係映射都存在一個繼承關係,包括xml文檔也會用到繼承。多態在物件導向中可謂舉足輕重,乃是應付變化的原動力。多態可以想象成簡單的替換一個css檔案引用。為和不可呢。都是局部小變化帶動質變嘛。多態就是槓桿的支點。物件導向就講到這了,還有一些原則之類的,挺多的。
電腦從開始只能識別二進位,到現在都有智能了。其中改變的不僅是電腦本身,也有編程風格和習慣。用二進位編程,根本沒什麼模式可言。後來程式設計語言轉換成彙編,後來又有了c,c++,java,c#。c語言的出現帶來了面向過程,java的出現帶來了物件導向,還有一系列開發手段的變化。從這種變化可以探出裡面更深層次的思考。其實,這一系列開發工具或者語言的出現,都減輕了程式員開發系統的難度。c語言在編譯的基礎上減輕了編程的難度,於是人們才有空思考模組化,過程化整個開發過程,想到了重用。當然二進位或彙編也會有重用,但是那不是一個層級的概念。物件導向開始只是面向過程的一個文法糖。但是如果這個文法糖只是在c語言裡面,可能也帶不來程式員編程習慣的大改變,繼承,多態,封裝大大應用起來那也是物件導向的語言出現之後的事情了,包括物件導向的設計。因為java等一序列語言更簡單了,所以人們才有空去思考代碼如何更好的複用。隨著對象語言的不斷成熟,各種架構不斷湧現,編程開始變得簡單,更好的複用模式出現了,這便是設計模式。隨著web和winform程式的開發的簡化,領域驅動模型開發運用而生。
其實,面向過程是第一次飛躍。有了面向過程,程式員才考慮如何有效與電腦打交道。物件導向則是處理常式員如何更好的與外面世界(業務)和電腦打交道。領域驅動則更強調程式員與外部世界的接觸。整個過程是一步一步將程式員將從電腦裡面拉出來見世面的過程。
領域驅動強調說,外面的世界多精彩,出來見見世面吧,別窩在代碼裡面了。外面的世界才是你們更應該重視的,摒棄什麼介面、持久化、網路。現在純粹是想幹啥就幹啥,不必拘泥,所有的東西只按照領域變化來,重點是領域了,不是亂七八糟的介面、持久化、網路。程式員的心都已經入世了,正所謂心在哪裡時間就在哪裡,心在花花世界,能不對花花世界留戀和認識更多麼,總比整天悶著頭,不問世事要深諳世事了。所以,樂趣來了,好的軟體產品出現了。其實,程式員本可以自己走入花花世界,可是癟的太久了,已經習慣了,再癟會也沒啥,終於Eric Evans麼癟住,先入世了,帶著一幫子程式員打破戒律了。人們恍然大悟,原來就沒必要癟的嘛。現在痛快的玩吧。
以上都是瞎說,但是領域驅動建模,確實要我們把主要精力放於和我們系統密切相關的領域(其實就是這個世界了)。至於在領域裡面怎麼弄,是另一回事,所謂師傅領進門,修行靠自身了。