從程式導向到物件導向

asterisk發表於2015-06-18
 物件導向作為指令式程式設計的主流程式設計模型,佔有著非常重要的地位,關於物件導向的書籍可謂汗牛充棟,一說OO就是關於封裝,繼承,多型,張嘴就是設計模式,普通的模型吹的神乎其技。

開始: 我們會定義一堆的過程,封裝成各種庫。

然後:程式越寫越大,我們又開始寫起了框架,封裝常用的功能。

Function (f,x){
   y = f(x);
return y;
}

在上述的程式碼中,我們重用的是Function這個函式。而Function這個函式又接受另外一個函式作為參 數,並在Function函式體內對這個過程引數進行了呼叫。 變化的部分是引數f,叫做回撥函式(callback)。 上述的簡化程式碼實際上是一種函數語言程式設計語言(Functional Programming Language)的 表達方式,函式名(過程名)可以直接作為引數傳入到另一個過程中。命令式語言一般不允許這麼做,你必須 傳入一個特殊的指定型別。

C語言中,我們通過函式指標來將函式名作為引數傳給另一個函式。

指標是什麼呢,就是一個記憶體單元中儲存了另外一個記憶體單元的地址編號。

那些蹩腳的概念,傳值,傳址,形參,實參 能有什麼意義?引數值無論如何就是個值而已,說它是記憶體單元地址編號不可以麼。。函式指標作為回撥函式去重複利用,學習的話讀《深入理解C指標》就不錯。

C語言中複合結構是struct型別,不過他是單純為資料的屬性設計的,並不能進行函式的定義,擴充套件之後就有了class。通過class我們可以定義物件,既有資料成員又有成員函式。

Static method 可以直接通過類來使用,不需要例項化。

Class內部的method第一個引數都指向本物件的一個物件例項,java中我們用this,Python中非常直觀,就是self,所以我覺得Python物件導向的部分是非常值得學習的。毫無疑問這是編譯器或直譯器設定的,不需要我們去插手。

說起物件導向的特性,多型是最神祕的。 查閱資料後得知,

在java,Python等比較高階的面嚮物件語言中,所有方法都是虛方法, 虛方法的呼叫是在執行期決定的,具有物件導向程式設計的多型性,真正實現了定義與實現相分離的特性。 虛方法在物件的記憶體結構是存在於一個叫做虛表(Virtual Table,簡寫為VTable)的結構中的。物件的記憶體結 構中的最後一格內容就是虛表的地址。計算機每次呼叫虛方法的時候,需要進行兩次地址對映,首先,找到對 象記憶體結構中的虛表地址,然後,再從虛表中找到對應的虛方法。 虛表(VTable)是面嚮物件語言的非常重要的概念。基本上,所有的面嚮物件語言都是基於虛表結構來實現 的。正是由於二級對映的虛表的存在,才實現了物件導向程式設計的多型特性,從而實現了定義與實現相分離的特 性。

虛表中有兩份表格,一份物件記憶體結構表,一份虛表,物件記憶體結構表最後一行就是虛表的地址。 Java中的interface和class展示的就是定義與實現相分離的典範。

PS: 接下來談的就是設計模式了。 (待續.......)

相關文章