分解和組合的抽象方法

banq發表於2014-11-01
抽象方法一般有兩個分解decomposition和組合composition,這兩種方法的方向正好相反,分解是將整體分解為部分,而組合是將部分組合成整體。

在軟體架構設計和編碼中,我們經常快速靈活使用這兩種方法,比如將一個類分解為多個小類,將一個方法分解為多個方法,或者將幾個類合成一個類一起呼叫,GoF設計模式中有不少模式是展示這兩種方法的使用,比如橋模式或介面卡模式是將幾個類組合在一起呼叫。

分解和組合經常結合在一起使用,實際就是拆了裝,裝了拆,如同玩玩具一樣,只不過每一次拆裝都是有具體依據。

分解組合實際是一種虛擬重建方法,將現實世界中的模型使用抽象符號分解為一個個基本元素,然後再使用“關係”將它們組合在一起形成一個穩定的結構,形成結構後一個系統就具備了初步的形態。生命正在孕育之中。

軟體架構的4+1視角模型簡介一文對軟體架構劃分了五種視角,這五種視角針對不同的人群使用者,一個好的落地的軟體架構應該同時滿足不同的利益要求者。4+1檢視有:邏輯檢視 開發檢視 處理檢視 物理檢視,最後+1是場景。

邏輯檢視是業務邏輯的分析,將功能性需求分解為類圖,這裡主要使用了物件導向的分解方法,也就是將需求分解為一個個物件型別,物件型別是最小的元素,通常我們使用UML的類圖來表達,為什麼要使用物件型別來表達分解後的元素呢?因為所謂物件是有邊界的一種封裝,人以群分,物以類聚,分門別類進行封裝可以認為也是一種組合。

因此,型別是我們分解與組合的基本依據,型別理論是非常抽象和複雜,但是如果有豐富的實踐經驗,見識過各種不同型別的程式碼和抽象封裝,就像見過各種不同型別的人以後,對人性的瞭解更加深刻一樣。

處理檢視是根據效能和擴充套件性要求進行分類的檢視,低延遲和高吞吐量是處理架構的終極目標。開發檢視是根據系統模組耦合進行分類的檢視。物理檢視是面向系統工程師的分類檢視,落地為一個個實際物理存在的裝置和網路。

場景檢視是將這四種檢視組合在一起使用,從而最終實現業務用例,模擬物理世界的業務需求實現。

以上主要是軟體中的分解和組合使用,其實這兩種方法適合更廣泛的思維方式,分解思維能夠讓人不斷研究細節,比如西醫治病採取的是分解思維,肝臟有病就解剖肝臟,直至分解到細胞;而中醫是採取組合方法,肝臟有病尋找與其有關係的腎臟進行補養,中醫依據的五行水木金火土代表一種關係,肝臟代表木,而腎臟是水,水生木,也就是水能夠滋養植物,所以,中醫才採取補腎的方式治肝。

由此可見,型別與關係是分解與組合面對的主要元素,一個大的事物分解為不同型別的小事物,相同型別的事物可以合併成一組型別,分解時儘量切斷各種關係,除非是高聚合的組成關係,也就是缺一不可的關係,這樣才能孤立事物,研究事物;而組合是拉關係,透過關係將不同事物組裝在一起。如果反映到資料庫建模上,就是先建資料表,再找外來鍵關係。

典型比如幾何學是對直線 三角形等孤立圖形進行研究,實際生活中是沒有直線和三角形這個事物,就是有也是融入了複雜環境之中,分解思維能夠讓人有的放矢,集中人類的有限智慧從上帝手裡搶奪一些自然的秘密。

舉例:一張桌子。分解思維的人看到後,研究其長寬高以及材質和形狀等個體特性,而注重關係的組合思維的人看到後,環顧四周,關注這張桌子的環境以及與其他事物有時間或空間的關係。

中國人這種注重關係的思維起因還可從老子道德經的“無以為用”中發現:三十幅共一轂,當其無,有車之用。埏埴以為器,當其無,有器之用。鑿戶牖以為室,當其無,有室之用。故有之以為利,無之以為用。
這段話意思是:三十根棍子做成的圓軲轆,只有忽視圓軲轆內部這種結構,從圓軲轆外部看到,才會發現它原來是可以做車的輪子這一用處。比如門窗,只有忽視其內部如何結構的構建,才會從外部想到用它在房間中。

所以,忽視個體內部結構,從外部關係組合才會發揮其用處,這是“無以為用”;而注重內部細節的“有”,這種分解方法無疑如同利器能有的放矢,因此這是“有以為利”,兩者合併在一起就是“利用”。利用就是分解組合,中國古人的智慧還真是很厲害啊。

[該貼被banq於2014-11-01 15:59修改過]

相關文章