天天看點

關于軟體的任務到底是什麼的思考

閱讀本文需要有DDD,DCI的知識背景。 首先,我覺得軟體是用來被使用者使用的,也就是說軟體是用來幫使用者完成一些事情的。從下面的用例圖可以很好的了解使用者與軟體的關系:

關于軟體的任務到底是什麼的思考

上圖是超市裡的一個營業員處理一筆銷售的一個用例。從這個用例我們可以清楚的看到營業員和系統之間的一個互動。從中我們可以清晰的得出系統該做什麼:

makeNewSale

enterItem

makePayment

這三個操作可以了解為使用者希望軟體為她做的三件事請。最近我驚奇的發現,DDD和DCI的一個巨大差别,讓我不得不拿出來和大家确認。那就是:

1)DDD強調軟體不應該實作整個用例的互動過程,而應該隻建立一個排除軟體使用者的領域模型,該領域模型的目的不是要實作軟體軟體使用者與模型之間的互動過程,而是要捕捉和實作軟體使用者提出的需求;

2)DCI強調軟體應該實作整個用例的互動過程,在DCI的架構中,可能會有一個Person對象,然後扮演Cashier的角色參與到MakeNewSale或EnterItem等場景中去。

大家看到差別了嗎?DDD更多的是把軟體或者說把領域模型看成是一個“工具”,我們人類作為軟體使用者通過使用這個工具來做一些事請;而DCI則是在模拟軟體使用者與軟體之間的整個互動過程,也就是說在DCI的架構中,我們能在記憶體中看到一個Cashier在做事情,就像現實生活中一樣;而在DDD中,我們隻會在記憶體中看到一些“物”在互相作用幫助軟體使用者處理一些事情;簡單的說:DCI是在完全模拟現實,而DDD則隻側重于表達除人之外的一個客觀的“物模型”;

個人認為DDD的思想要比DCI好,因為雖然通過DDD思想建立出來的領域模型看起來是靜态的,但我認為這恰恰是軟體本質上該做的并且是隻需要做的事情,事實上,我們都認為電腦是工具,我們建立領域模型目的也是為了用它,把它看成為一個工具而已。如果軟體還要模拟人際互動的過程,那無疑會使軟體(領域模型)不具有客觀性。

其實很多時候想想,如果基于貧血模型的開發,那麼軟體隻是一個幫助人類記錄事實的工具,我們設計的對象沒有任何行為,隻是資料,就像資料庫中的資料一樣。事實上,資料庫裡存放的不是資料,而是事實的結果。比如資料庫中有一條應聘記錄,表示某個人在某個時候應聘過某個職位這個事實。是以,在貧血模型的開發模式下,我們的軟體僅僅隻是幫助我們記錄事實的結果;

而在DDD等倡導的充血模型的開發模式下,對象不僅僅隻是一個記錄事實結果的工具,而是一個個活生生的能夠擁有自己個體行為以及能夠和其他對象互動的互動行為的對象。此時,對象不僅可以記錄事實結果,而且可以表示事實發生的原因,即對象之間的互相互動協作,即這個事實結果是通過怎樣的事實産生的,其實從更高的層面上了解,對象之間互動是一種正在發生的事實。是以,基于DDD思想的對象不僅可以表示事實的結果,還能表示事實本身,即對象互動。但這個互動沒有包含軟體使用者與軟體之間的互動,而僅僅表示軟體領域模型中各個具有一定客觀性的對象之間的互動;

而在DCI的思想架構下,則認為軟體除了要記錄DDD所涉及的事實外,還應該表示出軟體使用者與軟體之間的整個互動事實;

那麼大家覺得哪個才是軟體需要實作的真谛呢?呵呵,就這麼多吧,話不多,但都是我深刻思考後的東西。希望大家也談談各自的看法。