商務邏輯層(Business Logic Layer)無疑是系統架構中體現核心價值的部分。它的關注點主要集中在商務規則的制定、商務程序的實現等與業務需求有關的系統設計,也即是說它是與系統所應對的領域(Domain)邏輯有關,很多時候,我們也將商務邏輯層稱為領域層。例如Martin Fowler在《Patterns of Enterprise Application Architecture》一書中,將整個架構分為三個主要的層:展示層、領域層和資料來源層。作為領域驅動設計的先驅Eric Evans,對商務邏輯層作了更細緻地劃分,細分為應用程式層與領域層,通過分層進一步將領域邏輯與領域邏輯的解決方案分離。
商務邏輯層在體系架構中的位置很關鍵,它處於資料訪問層與展示層中間,起到了資料交換中承上啟下的作用。由於層是一種弱耦合結構,層與層之間的依賴是向下的,底層對於上層而言是“無知”的,改變上層的設計對於其調用的底層而言沒有任何影響。如果在分層設計時,遵循了面向介面設計的思想,那麼這種向下的依賴也應該是一種弱依賴關係。因而在不改變介面定義的前提下,理想的分層式架構,應該是一個支援可抽取、可替換的“抽屜”式架構。正因為如此,商務邏輯層的設計對於一個支援可擴充的架構尤為關鍵,因為它扮演了兩個不同的角色。對於資料訪問層而言,它是調用者;對於展示層而言,它卻是被調用者。依賴與被依賴的關係都糾結在商務邏輯層上,如何?依賴關係的解耦,則是除了實現商務邏輯之外留給設計師的任務。
5.1 與領域專家合作
設計商務邏輯層最大的障礙不在於技術,而在於對領域業務的分析與理解。很難想象一個不熟悉該領域商務規則和流程的架構設計師能夠設計出合乎客戶需求的系統架構。幾乎可以下定結論的是,商務邏輯層的設計過程必須有領域專家的參與。在我曾經參與開發的項目中,所涉及的領域就涵蓋了電力、半導體、汽車等諸多行業,如果缺乏這些領域的專家,軟體架構的設計尤其是商務邏輯層的設計就無從談起。這個結論唯一的例外是,架構設計師同時又是該領域的專家。然而,正所謂“千軍易得,一將難求”,我們很難尋覓到這樣卓越出眾的人才。
領域專家在團隊中扮演的角色通常稱為Business Consultor(業務諮詢師),負責提供與領域業務有關的諮詢,與架構師一起參與架構與資料庫的設計,撰寫需求文檔和設計用例(或者使用者故事User Story)。如果在測試階段,還應該包括撰寫測試案例。理想的狀態是,領域專家應該參與到整個項目的開發過程中,而不僅僅是需求階段。
領域專家可以是專門聘請的對該領域具有較深造詣的諮詢師,也可以是作為需求提供方的客戶。在極限編程(Extreme Programming)中,就將客戶作為領域專家引入到整個Team Dev中。它強調了現場客戶原則。現場客戶需要參與到計劃遊戲、開發迭代、編碼測試等項目開發的各個階段。由於領域專家與設計師以及開發人員組成了一個團隊,貫穿開發過程的始終,就可以避免需求理解錯誤的情況出現。即使項目的開發與實際需求不符,也可以在項目早期及時修正,從而避免了項目不必要的延期,加強了對項目過程和成本的控制。正如Steve McConnell在構建活動的前期準備中提及的一個原則:發現錯誤的時間要儘可能接近引入該錯誤的時間。需求的缺陷在系統中潛伏的時間越長,代價就越昂貴。如果在項目開發中能夠與領域專家充分的合作,就可以最大效果地規避這樣一種惡性的鏈式反應。
傳統的軟體開發模型同樣重視與領域專家的合作,但這種合作主要集中在需求分析階段。例如瀑布模型,就非常強調早期計劃與需求調研。然而這種未雨綢繆的早期計劃方式,對架構師與需求調研人員的技能要求非常高,它強調需求文檔的精確性,一旦分析出現偏差,或者需求發生變更,當項目開發進入設計階段後,由於缺乏與領域專家溝通與合作的機制,開發人員估量不到這些錯誤與誤差,因而難以及時作出修正。一旦這些問題像毒瘤一般在系統中蔓延開來,逐漸暴露在開發人員面前時,已經成了一座難以逾越的高山。我們需要消耗更多的人力物力,才能夠修正這些錯誤,從而導致開發成本成數量級的增加,甚至於導致項目延期。當然還有一個好的選擇,就是放棄整個項目。這樣的例子不勝枚舉,事實上,項目開發的“滑鐵盧”,究其原因,大部分都是因為商務邏輯分析上出現了問題。
迭代式模型較之瀑布模型有很大地改進,因為它允許變更、最佳化系統需求,整個迭代過程實際上就是與領域專家的合作過程,通過向客戶示範迭代所產生的系統功能,從而及時擷取反饋,並逐一解決迭代示範中出現的問題,保證系統向著合乎客戶需求的方向演化。因而,迭代式模型往往能夠解決早期計劃不足的問題,它允許在發現缺陷的時候,在需求變更的時候重新設計、重新編碼並重新測試。
無論採用何種開發模型,與領域專家的合作都將成為項目成敗與否的關鍵。這基於一個軟體開發的普遍真理,那就是世界上沒有不變的需求。一句經典名言是:“沒有不變的需求,世上的軟體都改動過3次以上,唯一一個只改動過兩次的軟體的擁有者已經死了,死在去修改需求的路上。”一語道盡了軟體開發的殘酷與艱辛!
那麼應該如何加強與領域專家的合作呢?James Carey和Brent Carlson根據他們在參與的IBM SanFrancisco項目中獲得的經驗,提出了Innocent Questions模式,其意義即“改進領域專家和技術專家的溝通品質”。在一個項目團隊中,如果我們沒有一位既能擔任首席架構師,同時又是領域專家的人選,那麼加強領域專家與技術專家的合作就顯得尤為重要了。畢竟,作為一個領域專家而言,可能並不熟悉軟體設計方法學,也不具備物件導向開發和架構設計的能力,同樣,大部分技術專家很有可能對該項目所涉及的業務領域僅停留在一知半解的地步。如果領域專家與技術專家不能有效溝通,則整個項目的前途就岌岌可危了。