有些人(包括Martin Fowler),質(zhì)疑貧血模型會導(dǎo)致人臉識別軟件開發(fā)偏離面向?qū)ο蟮能壍?。理由是,由于貧血對象的存在,人臉識別軟件開發(fā)好像以數(shù)據(jù)為中心的模式會卷土重來,Service層會變得更加面向過程。我同樣不贊成這個觀點。動態(tài)信息也具有豐富的對象化特征。只要換個角度來看待這個問題,就會發(fā)現(xiàn)這個疑惑是多余的。
我傾向于認(rèn)可貧血對象。實際上,以上所有關(guān)于信息和對象的討論,都是為了這種傾向而做的理論上的辯解。在軟件開發(fā)實踐中,有很多例子支持貧血對象的合理性。 在軟件開發(fā)實踐中,使用貧血對象有很多好處。第一個好處是,有利于信息交換。企業(yè)之間交換的信息往往都是靜態(tài)信息。相對來說,要進(jìn)行動態(tài)信息的交換有點不太現(xiàn)實,因為很少有兩家企業(yè)的行為是完全一樣的。例如,A保險公司在計算保費(fèi)時必須進(jìn)行分期處理,而B保險公司沒有這個要求,在這種情況下如何交換行為信息呢? 第二個好處是,清晰了對象的職責(zé)。
如果要在實體對象(貧血對象)中添加行為(動態(tài)信息),就必須考慮哪些行為是可以添加進(jìn)去的、哪些行為應(yīng)該另行處理。這種考慮的模糊性,給軟件開發(fā)實踐帶來了很多未知的風(fēng)險。 第三個好處是,實體對象(貧血對象)的實現(xiàn)更加靈活。我們可以用Schema來定義對象和對象之間的關(guān)系。一個XML實例就是一個實體對象。 第四個好處是,可以確保實體對象(貧血對象)只能在內(nèi)存中用于計算。這種做法簡化了計算模型,下一節(jié)我們會討論這個問題。
而添加了行為的對象,是無法做出這種保證的。在實踐中,我經(jīng)常遇見在行為中直接去訪問數(shù)據(jù)庫的做法。這種錯誤的做法,使單元測試也成為一件困難的事情。老實說,我曾經(jīng)認(rèn)真地思考過這個問題,我的解讀是,當(dāng)在實體對象中添加行為時,行為的實現(xiàn)者很難面向靜態(tài)信息模型(實體對象以及實體對象之間的靜態(tài)關(guān)系)來思考。
這也許就是所謂的“不識廬山真面目,只緣身在此山中”。我們只有站在動態(tài)模型(數(shù)學(xué)規(guī)律)的角度來看人臉識別軟件開發(fā),才能理解這樣一個道理——客戶信息軟件就是領(lǐng)域模型和基于領(lǐng)域模型的計算(計算模型)。 所以,在我看來,人臉識別軟件開發(fā)分為兩個部分:一個是靜態(tài)模型(貧血對象模型),一個是動態(tài)模型(行為對象模型)。 在這些年的軟件開發(fā)實踐中,我接觸過一些領(lǐng)域的標(biāo)準(zhǔn),例如,ACORD、IAA 等。