關於《道法自然》一書中的「依賴倒置」問題

2021-03-31 08:56:31 字數 2323 閱讀 3162

最近在書店裡買到你們的新書《道法自然》。感覺寫得非常好,正如李維先生的評價一樣,內容豐富,匯集並組織大量的物件導向知識,並且以乙個實踐專案為主線將這些知識有機的組織,豐富而且有著內在的統一性。非常吸引人,我已經讀了100多頁。看得很仔細,也思考了很多,所以在讀的過程中,我發現了一些小的錯誤或疑問,在此列出,與您商討。

p.9, line 2 : 乙個排字錯誤:原意 -> 願意

p.140: 箭頭應該是由class4 指向 class3, 友元類的依賴關係,我認為畫反了。

p.113, figure 6-3: 層間依賴關係, 這樣的設計我認為不是很好,應該由資料持久化層依賴於 domain logic. 因為domain logic 才是問題域的本質與核心,才是最穩定的。所有的層都依賴於domain 層,domain 層才可以得到最優先的考慮。 這樣也符合 robert martin 在 《敏捷軟體開發》中提出的 依賴倒置原則。 可以參考 《敏捷軟體開發》 中文版的 page 256 以及chapter 11。也可參考《特徵驅動開發方法》中文版的 page 156 的圖。

p.113, figure 6-4: 層依賴關係似乎也應該倒過來。道理和上一條是一樣的。

上面兩條其實都是 robert martin 所說的 dip ( dependancy inversion principle). 它的含義是:

建議:建議將依賴倒置原則加入的您的書中。

這些是我的個人看法,提出的目的是與您商討。

也許在這個點上,您是錯的。但是瑕不掩瑜,我很慶幸自己買了一本好書。

2023年10月20日

p.140關於友元類的描述,確實有乙個明顯的錯誤。其中圖和**如下所示:

include 「class4.h」

class3 ;

圖和**是統一的,沒有錯誤,但是前面的文字有乙個筆誤:

原文為:即class3不僅依賴於class4,而且class3還是class4的友元類。

應該是:即class4不僅依賴於class3,而且class4還是class3的友元類(class4希望能訪問class3的非公有成員)。

關於依賴倒置原則,我在寫《道法自然》時也經過了仔細的思考。下面從幾個方面說明一下我的理解:

首先,從理論上說,robert martin是這樣定義的:依賴於抽象,而不要依賴於具象(參見:《道法自然 3.4.3)。

更為詳細的定義是:

其次,以fishgui為例項,從實踐的角度來看。假設fishgui框架系統必須要移植到不同的作業系統(如:windows和unix),為了使作業系統的變化不影響框架層,就必須抽象出乙個作業系統介面卡介面,fishgui框架層中的類只依賴於該介面,而該介面的派生類具體實現到不同作業系統的呼叫。這個實現是符合依賴倒置原則的。如下圖所示:

如果我們認為介面卡介面類屬於框架層,由框架層的開發人員來設計,這個介面就會設計得很適合框架層的開發。但是容易遇到乙個問題,當需要移植到另乙個新的作業系統時,這個介面可能不適合該作業系統的實現,實現具體的介面卡時非常麻煩。這時,兩層的依賴關係如下圖所示,下層依賴於上層。

如果我們認為介面卡介面屬於適配層,由適配層的開發人員來開發,這個介面就會總結了多種作業系統的特性,使得移植非常方便。但是很容易造成框架層使用的困難。這時,兩層的依賴關係如下圖所示,上層依賴於下層。

這兩種不同的選擇,在具體的設計中很容易遇到,兩種設計得到的結果似乎是相反的,是乙個兩難的問題。

最後,從傳統的分層架構模式的要求來說,應該上層使用下層的服務,依賴於下層;而下層決不能使用上層的服務,依賴於上層。而且,從fishgui的框架層和介面卡層來說,確實,框架層會呼叫適配層,而適配層絕不會呼叫框架層,適配層僅僅是反向依賴於介面卡介面。

上面分析的這幾點似乎存在著很大的矛盾。我覺得只要理解了下面的兩個要點,就可以完美地把這些矛盾統一起來了。

根據這兩個要點,我覺得對於上面fishgui的例子,在架構分析階段,把系統分為框架層和適配層時,不要考慮依賴倒置原則,而是從巨集觀上看,由於框架層要呼叫適配層,框架層依賴於適配層,上層依賴於下層。

當進入物件導向設計階段,這些ood原則就能發揮作用了。這時,按照「針對介面程式設計,而不要針對實現程式設計」的原則,通過介面卡介面的引入,就能很好地消除上層對於下層的依賴。這樣的設計也就能很好地符合開閉原則,完全替換原則和依賴倒置原則,所以說,依賴倒置原則並不是真的把依賴反過來,而是解除了層之間的耦合,使它們更容易適應變化的需求。

這時,也不需要強求加入的介面屬於哪一層,而是應該由兩層的設計人員共同協商解決,設計出對兩層都方便的介面。

這就是我在撰寫《道法自然》一書時,對依賴倒置原則的一些思考,希望能聽到你的想法。通過這樣的交流,就能更加深我們對於oo原則的理解,使oo技術在實踐中得到更好的應用,這也是我撰寫《道法自然》一書最根本的想法。

王詠武2023年10月25日

天人合一道法自然的註解 天人合一,道法自然

前文,貧道講了抱元守一是我們修行的方法。今天談談抱元守一后我們進一步要做的事情。人能常清靜,天地悉皆歸 這句話的意思是什麼呢?人 即善男信女也。能 意思是至強無息。常 即平常,一直堅守。清 意為萬緣頓息,靜 乃一念不生也。人能常清靜 意指人如果能以天地為妙用,收其放心,存其良心,非禮勿視,則眼清靜矣...

關於《C 程式設計第4版》一書中發現的錯誤

書名 programming c 中文版 第4版 1 懷疑出錯位置 第5章 繼承與多型 112頁 呼叫基類構造方法 部分內容 懷疑內容 在示例5 1中,新的類 listbox 派生之 control 有自己的構造方法,引數為三個整數。請問 是三個整數嗎?下面是 內容 public listbox i...

Lua程式設計一書中的8皇后示例 解析

因為八皇后要求是每行每列只能放乙個,所以示例中按每列座標用一維陣列表示 例子 1維陣列 這相當於是 二維陣列以下座標 1,1 2,7 3,5 4,8 5,2 6,4 7,6 8,3 首先明白這個概念 n 8 function isplaceok a,n,c for i 1,n 1 do if a i...