域模型向左走(充血),向右走(貧血)
在文章的開始,我先舉一個例子
美國M4謝爾曼坦克 VS德國的虎式坦克(相關資料如下http://mil.eastday.com/m/20070515/u1a2833237.html)
5:1 在五一期間,電視節目中的二戰武器大對決吸引了我,其中當美國大兵說他們在用5輛坦克的代價來換德國人的一輛虎式(I)型坦 克時,我們可以得出一個結論。蒙哥馬利和艾森豪威爾是在用二三十人的生命去換德軍的一輛坦克(而因為德軍坦克裝甲厚重,里面的架駛員得以逃生)。這是怎么一種自殺式的進攻呀!也許這么高的傷亡率在最終的勝利面前可能無所謂,但對于士兵([拯救大兵瑞恩])卻不完全是這么一回事了。而這里公司的CEO,或高層無疑也可以被視為這兩位偉人的化身。為了開發進度和用戶,他們可以強迫思維活越的程序員喪失創造力,因為他們需要的是能生成代碼的工人(相當于打仗的美國大兵)。而培養這些大兵的軍事訓練所(軟件培訓中心)也就成為源源不斷制造這種產品的工廠了。
這里不妨把OO域模型比做是虎式坦克,它在代碼結構,功能擴展(等同于火力),可維護性,可讀性 健壯性安全性(裝甲)等方面都是非常有優勢的。但同時也出現了問題那就是機動性(太重太耗油,等同于學習成本),以及生產數量(等同于開發速度)成了這個優秀設計思想的制約因素。因為具我了解OO設計會造成開發前期進度上的相對滯后,甚至搭一個框架所用的時間就已經讓公司高級無法接受了。而同時一般公司又不愿意為這部分時間成功埋單, 因此程序員就想盡一切辦法(甚至生產垃圾代碼)來跟上開發進度。雖然有開源框架,代碼生成工具等來幫助提升代碼的質量和開發速度,但本質上這個項目它已經成了一輛 "謝爾曼坦克",它無法全面享受到OO所能提供的優勢,而這里又不得不回頭用重構等方法來改善代碼質量了。(有些項目甚至連回頭的機會都沒有)
最終的結果是美國人說他們的坦克生產出20輛的時候,德軍那邊只有1輛下線。正是這種數量上的優勢最終鎖定了美軍的在坦克戰上的勝局。
這個例子告訴我們這樣一個殘酷的事實,好的設計雖然能生產出好的軟件,但因為資源(時間,資金,人力等)要求過高。造成了一般企業或公司不想承擔。而這時貧血模型這類開發方式乘虛而入,用它們所標謗的優勢和開發方式排演著一臺又一臺的鬧劇。
有些成功是激勵,而有些只是興奮劑甚至是毒藥。
因為今天我在這里所表達的觀點會招致相當多的人跳出來與我爭論,而不可避免的就是要拿出一堆成功的案例說這里用貧血模型實現的如何如何的好,項目進展如何如何等。
而我要說的就是當我們為采用貧血域模型而使項目“成功”完成而沾沾自喜時,我們已經在離經叛道的路上越走越遠了。
做為一名程序員,到底是為誰去開發去編程。(A公司,B:為自己,C:為了民族軟件產業的振興D:為了共產主義理想等等。)
當我們處在利益中心時,左側是項目經理,技術經理,產品經理為首的公司方代表。 右側是用戶,客戶以及其它受眾。它們都想為了各自的利益一天到晚的在你身邊咆哮,要求你開發或修改這樣或那樣的代碼。表面上我們是項目的主宰,因為如果你沒完成工作,項目就不可以完成。但當我們進入設計開發階段后我們會因為資源的不夠使用而不得不做這樣或那樣式調整和妥協,最終大多數代碼都只是一味模式的照搬。這時就談不上什么將來產品要如何健壯如何好了。因為能對付過眼前摧命的各方勢力就已經讓我們精疲力盡了。從這方面講我們已從“主宰”變成了“挨宰”。這時的我們已變成了稱鉈,要不停的調整自已在稱桿上的位置以適應這些催命的人了種種要求。也許不少人這時拾起貧血模型這個稻草,起碼它會幫助我們節省設計和開發上的時間,項目最終可能也取得了成功。但當我們過上一段時間再回過頭看這些代碼,真不知道大家會做何敢想。
貧血模型(Fat Serviece)服務層成了一個框(此處存在筆誤已在回復中修正,敬請諒解!),什么都往進裝(越來越臃腫)。本該是域模型中該有的邏輯,這時全被一股腦塞進了Business Logic。當業務邏輯復雜到一定程度時,就會有一些歸屬不明確的函數或屬性出來了。這些不明確的代碼相信有相當一部分要放在domain model中會更合理。但因為已經貧血了,所以Business Logic成了它們的避護所。我給這些屬性或方法比做“難民”,有些難民可以還活在你的項目中,有些可能在使用一段時間后就死去了(系統不再使用,但未及時清理)。而如果這時公司又找來一個新人去接管這些代碼時,樂子可就大了。這就好比讓一個后媽去教育一個孩子,如盡心還好(會繼續有好的清楚的邏輯)在SERVICE中,而緩和這種矛盾。但多數程序員都不愿做后媽。因此這些方法就會像是沒有母親的孩子一樣如游魂野鬼一樣在你的項目中游蕩。
最后,學習成本的降低只能會造出更好與你相同的程序員甚至新人。因為貧血模型沒有充血模型那么復雜,實現起來很簡單,這就勢必造成一個事實,就是一個新入行幾個月的人很快也會用這個架構去搞程序開發。這種自貶身價的結果最終可能導致的情況就是當某天工作結束時,你會發現你身邊的同時有可能就是一只pig or cow。
好了,文章寫完了,我已經開始準備挨罵了,不過無所謂,希望大家勇躍拍磚!