分解和組合的抽象方法
在軟體架構設計和編碼中,我們經常快速靈活使用這兩種方法,比如將一個類分解為多個小類,將一個方法分解為多個方法,或者將幾個類合成一個類一起呼叫,GoF設計模式中有不少模式是展示這兩種方法的使用,比如橋模式或介面卡模式是將幾個類組合在一起呼叫。
分解和組合經常結合在一起使用,實際就是拆了裝,裝了拆,如同玩玩具一樣,只不過每一次拆裝都是有具體依據。
分解組合實際是一種虛擬重建方法,將現實世界中的模型使用抽象符號分解為一個個基本元素,然後再使用“關係”將它們組合在一起形成一個穩定的結構,形成結構後一個系統就具備了初步的形態。生命正在孕育之中。
軟體架構的4+1視角模型簡介一文對軟體架構劃分了五種視角,這五種視角針對不同的人群使用者,一個好的落地的軟體架構應該同時滿足不同的利益要求者。4+1檢視有:邏輯檢視 開發檢視 處理檢視 物理檢視,最後+1是場景。
邏輯檢視是業務邏輯的分析,將功能性需求分解為類圖,這裡主要使用了物件導向的分解方法,也就是將需求分解為一個個物件型別,物件型別是最小的元素,通常我們使用UML的類圖來表達,為什麼要使用物件型別來表達分解後的元素呢?因為所謂物件是有邊界的一種封裝,人以群分,物以類聚,分門別類進行封裝可以認為也是一種組合。
因此,型別是我們分解與組合的基本依據,型別理論是非常抽象和複雜,但是如果有豐富的實踐經驗,見識過各種不同型別的程式碼和抽象封裝,就像見過各種不同型別的人以後,對人性的瞭解更加深刻一樣。
處理檢視是根據效能和擴充套件性要求進行分類的檢視,低延遲和高吞吐量是處理架構的終極目標。開發檢視是根據系統模組耦合進行分類的檢視。物理檢視是面向系統工程師的分類檢視,落地為一個個實際物理存在的裝置和網路。
場景檢視是將這四種檢視組合在一起使用,從而最終實現業務用例,模擬物理世界的業務需求實現。
以上主要是軟體中的分解和組合使用,其實這兩種方法適合更廣泛的思維方式,分解思維能夠讓人不斷研究細節,比如西醫治病採取的是分解思維,肝臟有病就解剖肝臟,直至分解到細胞;而中醫是採取組合方法,肝臟有病尋找與其有關係的腎臟進行補養,中醫依據的五行水木金火土代表一種關係,肝臟代表木,而腎臟是水,水生木,也就是水能夠滋養植物,所以,中醫才採取補腎的方式治肝。
由此可見,型別與關係是分解與組合面對的主要元素,一個大的事物分解為不同型別的小事物,相同型別的事物可以合併成一組型別,分解時儘量切斷各種關係,除非是高聚合的組成關係,也就是缺一不可的關係,這樣才能孤立事物,研究事物;而組合是拉關係,透過關係將不同事物組裝在一起。如果反映到資料庫建模上,就是先建資料表,再找外來鍵關係。
典型比如幾何學是對直線 三角形等孤立圖形進行研究,實際生活中是沒有直線和三角形這個事物,就是有也是融入了複雜環境之中,分解思維能夠讓人有的放矢,集中人類的有限智慧從上帝手裡搶奪一些自然的秘密。
舉例:一張桌子。分解思維的人看到後,研究其長寬高以及材質和形狀等個體特性,而注重關係的組合思維的人看到後,環顧四周,關注這張桌子的環境以及與其他事物有時間或空間的關係。
中國人這種注重關係的思維起因還可從老子道德經的“無以為用”中發現:三十幅共一轂,當其無,有車之用。埏埴以為器,當其無,有器之用。鑿戶牖以為室,當其無,有室之用。故有之以為利,無之以為用。
這段話意思是:三十根棍子做成的圓軲轆,只有忽視圓軲轆內部這種結構,從圓軲轆外部看到,才會發現它原來是可以做車的輪子這一用處。比如門窗,只有忽視其內部如何結構的構建,才會從外部想到用它在房間中。
所以,忽視個體內部結構,從外部關係組合才會發揮其用處,這是“無以為用”;而注重內部細節的“有”,這種分解方法無疑如同利器能有的放矢,因此這是“有以為利”,兩者合併在一起就是“利用”。利用就是分解組合,中國古人的智慧還真是很厲害啊。
[該貼被banq於2014-11-01 15:59修改過]
相關文章
- 抽象方法和抽象類抽象
- 【Java】繼承、抽象、組合Java繼承抽象
- hdu 5698 瞬間移動 【質因數分解求組合數】
- 【力扣】組合總和3(組合的去重)力扣
- 結合實戰理解 Java 抽象類和介面Java抽象
- 介面的行為抽象和抽象類的行為抽象抽象
- 列表和元組的方法
- 組合數字首和
- JavaScript中的繼承和組合JavaScript繼承
- js的curry和函式組合JS函式
- 「計算方法」快3常出和值萬能組合
- 介面定義和抽象方法_hehe.base.10.1抽象
- 組合數取模的幾種方法--Exlucas&楊輝三角&組合
- 降低過擬合和欠擬合的方法
- 抽象結合例項 Employee抽象
- 377. 組合總和 Ⅳ
- Solidity語言學習筆記————35、抽象合約和介面Solid筆記抽象
- DDD當前工程方法組合 - Kamil
- Pandas 基礎 (9) - 組合方法 merge
- Java 介面與抽象方法Java抽象
- Xposed攔截抽象方法抽象
- LeetCode39. 組合總和LeetCode
- 抽象類和介面抽象
- 介面和抽象理解抽象
- 介面和抽象類的區別抽象
- 對抽象方法仇恨的自白 - 250bpm抽象
- 【抽象那些事】不完整的抽象&多方面抽象&未用的抽象&重複的抽象抽象
- LeetCode 39. 組合總和 40.組合總和II 131.分割回文串LeetCode
- Solidity之旅(十)OOP-抽象合約SolidOOP抽象
- 集合的組合
- PAT-B 1056 組合數的和【規律】
- 組合語言-CALL和RET指令組合語言
- LeetCode216.組合總和lllLeetCode
- LeetCode40.組合總和IILeetCode
- LeetCode-040-組合總和 IILeetCode
- leetcode:組合總和II(回溯java)LeetCodeJava
- 全網最適合入門的物件導向程式設計教程:50 Python函式方法與介面-介面和抽象基類物件程式設計Python函式抽象
- Day 26| 39. 組合總和 、 40.組合總和II 、 131.分割回文串
- [譯] 函數語言程式設計:抽象與組合(系列教程第十五部分)函數程式設計抽象