連載04:軟件體系設計新方向:數學抽象、設計模式、系統架構與方案設計(簡化版)(袁曉河著)

置換的公理化過程

前面所涉及到的地址和值的“置換”關係以外,賦值、抽象、實現、繼承等也都是一種“置換”的關係,而這種“置換”關係是否只是邏輯上我們的一個創造呢?還是客觀現實中存在呢?這裏我暫時先給出結論:“置換”變換其本質上是物理上存在的一種變換操作,只是我們將之應用到邏輯層面的設計之中,客觀上的置換不是根據設計的需要進行更好的創造,我們只是利用這種客觀的變換過程,來對邏輯設計進行評判和使用的一種解決方式而已。

那麼“置換”具體是如何描述的呢?我們是否可以通過一種比較準確的定義來表達這樣的一個概念呢?此概念是否能夠正確地應用到我們的軟件設計領域呢?

在數學概念中,置換就是在有限定義空間的滿變換,而滿變換所表示的意思如圖1-3可以看出,定義域上每一個元素在值域上都有映射關係的結果。

     圖1‑3

 

置換在數學中有很多實際的應用,例如在集合論中,一個集合的置換是從該集合映至自身的雙射,又例如置換可以將元素的變換用矩陣的形式表示。

但是我們這裏所提到的“置換”應該是一個更加廣義的涵義,因爲在計算機理論中,其替換的元素並不一定都是平等概念,其可能元素與元素之間是一種包含關係,或者是不同層次上的相互關係,例如上面提到的值和地址的置換與函數和函數指針的置換,以及類的抽象和繼承等的置換,都是在不同層面進行的,而不同於數學矩陣概念上的“置換”,因此,這裏的“置換”就是泛指的一種變換,其變換後的結果是:在邏輯意義上,通過對變換前的引用和變換後的引用在邏輯概念上等效。這樣的變換結果就是一種置換,簡單的說就是使用不同的表達形式,其在此的佔位符在邏輯概念上是無關緊要的。

當然,我們這種廣泛的表述方式也包含數學定義中的“置換”,雖然針對數學意義中的置換還有多種不同方式的表達,而這些表達方式也可能意義並非一致。

所以必須明確的說明,我們這裏談的置換是一個動態的過程,是一個動作。置換並非研究“靜態”實體,而是研究一個“動態”的操作。所以,在我們使用的過程中,我們無法通過如值、地址、類等等可以通過靜態的描述術語來表達,在我們的源代碼中無法用一個符號來表示這就是置換,而且即使生搬硬套用一個符號來表示,其也無法融入到源代碼中來表示。所以針對比如設計模式結構這樣的方式,其實也是這種動態的描述,描述靜態結構之間的相互關係以此指導我們的軟件設計工作,因此我們在使用的時候,只是對一種“勢”的使用。這種“勢”就要求,我們的軟件設計工作就是一種“平衡”的處理方式,在整個系統中通過多方面的取捨達到一個動態的平衡。

         在邏輯意義上,使用直接地址來訪問到的數據和通過指針訪問到的數據是等效的,採用的方式不同,但是結果是等效的,這種用指針間接訪問就是置換了直接地址訪問,或者使用直接地址訪問的數據置換了指針間接訪問。

         同理,對於一個繼承關係來說,在此位置上,如果對父類的訪問結果與對子類的訪問結果是等效的,那麼說明此繼承關係可以進行相互置換。

         當然對於置換來說,A置換B與B置換A雖然其操作名稱都是置換,在邏輯概念上是等效的,但並不是表示其結果是相等的,也就是說,置換操作不具有交換性,A置換B的結果在物理上是不等效B置換A。

         兩種置換的複合還是置換,也就是說A置換B,B置換C,最後形成的A置換C也是成立的,說明這樣的置換是可結合的。

         但是置換具有傳遞性,也就是說A置換B,B置換C,那麼一定能夠推導出A置換C,例如在繼承體系下,C繼承於B,B繼承於A,例如在函數參數的訪問中使用B的引用就能夠傳遞C進入,同時使用A的引用,也能夠傳遞C進入。

         繼承表示一種運算關係,如果A繼承於 B 則這種“置換”可抽象爲一種運算A•B = B

抽象表示這種運算關係的反向運算, 如果A繼承於B 則這種“置換”可表示爲B•A = A

當然,我們也可以這樣來看待類與對象的關係,他們應該是一個映射的關係,可以表示爲“X”乘的關係,其擴展到時間和空間。應該是類型(屬性+操作)在時間和空間上的某一系列變化的結果。

綜上所述,目前已經被應用的設計方法中的絕大部分都是圍繞可“置換”展開的,都體現了“置換”的基本概念所描述的思想。

1、  最基本的置換,值可置換(變量賦值)

2、  值與地址的可置換(指針)

3、  一個過程操作過程的可置換(函數),另外函數的參數也是一種置換方式。

4、  多態是函數置換的一種表示方式,是函數地址位置的置換。

5、  抽象和繼承的可置換(類),目前是通過函數的可置換進行實際操作的。在類中使用private、protected、const等限制,並進一步定製所置換的部分。

6、  將這些可置換的函數分組,集合在一起形成接口,爲什麼要進行分組呢?因爲這些可置換之間存在邏輯的聯繫(接口)

7、  需要對類型進行可置換(模板),泛型中的置換是既可以進行單獨數據的置換,也能單獨進行地址的置換,或者兩者兼有。目前其數據成員無法特化,只能特化成員函數,而且成員函數特化可使用模板+繼承來解決,例如如下的方式:

template <class Base>

class Derive:public Base{}

8、  typedef 對類型置換。模板與typedef實際上有很多相似之處,可以說在本質上是一回事,只是模板通過參數或配置方式來更改這種置換,是typedef的升級。

9、  對相同功能的函數進行名稱的置換(函數重載),在STL中操作符重載實際上就是一種置換。

10、         對於分層,邏輯抽象實際上就是一種可置換的操作過程。是使用邏輯意義置換物理意義的過程。

11、         註冊機制就是因爲有地址的可置換,所以才能達到抽象的能力。

還存在其他更多的“可置換”的方面,所以設計就是尋找“可置換”的一系列操作的集合,好的設計可以通過這種可置換後的成本以及收益進行衡量,所以“可置換”可以作爲衡量軟件設計好壞的一個可行的標準之一。

可擴展性是軟件設計的原則之一,是以適應軟件系統的變化的適配的程度。可擴展性是軟件拓展系統的能力,可擴展性非常重要,是現代軟件系統重要的標誌,一個軟件系統如果欠缺可擴展性則代表其基本上走向死亡。根據上面我們對“可置換”的特徵的分析,我們可以這樣來說,設計就是一系列“置換”的設計過程。

“置換”並非是整體完整的替換過程,其中也存在“半置換”、“部分置換”等形式的存在,因爲如果所站在一個整體的角度來說,“半置換”、“部分置換”是“置換”概念的必然的補充。

當然不能簡單認爲“半置換”、“部分置換”是一個意義不大的概念,其實“半置換”、“部分置換”的功能也是非常強大的,例如使用偏特化就是一個部分置換,這樣能夠在不同部分中進行置換,讓設計的靈活性更加強大。

對於上面的置換, 應該分爲兩大類,一類是靜態置換,例如typedef和class、template的置換,一類是動態置換就是賦值等的置換。

靜態置換是一種在邏輯抽象上的置換,其是一種概念上的替換結果,靜態置換不具有時間和空間屬性,所以其最終的實現是通過動態置換來實現的。

動態置換包含了更多的實現細節,是將靜態置換中的置換過程,在時間和空間上給予實現。

所以在層次上大體應該是這樣的層次關係(圖1-4所示),這個層次反映了我們的認識和實踐的基本路徑,這個層次過程表徵就是我們設計過程的層次路徑。


 

 

發佈了42 篇原創文章 · 獲贊 2 · 訪問量 2360
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章