2009年10月30日 星期五

1.1.2 資料與抽象化

大約在西元1995年之後,一種新觀念的資料結構開始被大眾所接受。此一改變在於物件導向程式語言的流行所造成。在1995年之後,C++開始發展STL標準樣板類別庫,而Java語言也在此時誕生。在此階段,資料結構已經提升為抽象化的資料型式。這明顯的改變可以由struct關鍵字在C與C++中的不同來觀察。
讓我們檢視Algorithms + Data Structures = Programs之名言,在此名言中,資料結構代表的可說是結構化後的資料,但光有資料結構是無法運作的,因此需要演算法使得程式變成是「活」的。舉例來說,光是組織一艘航空母艦是不能完成工作的,必須有前進演算法,使得航空母艦能夠前進。然而戰鬥機也有前進演算法,明顯地,它與航空母艦的前進演算法應該不同,因此,這些演算法應該只侷限於該個體使用。
物件導向程式語言提供了以class類別來撰寫程式的新思維,藉由類別生成的物件實體之互動來達到程式設計之目的。而C++的類別與C語言的結構最大的差別在於,類別除了能夠組織資料,還能夠宣告所屬運算以及設計運算的細節。例如C語言的結構只能宣告「航空母艦」結構、「戰鬥機」結構,而C++的類別,不但能宣告「航空母艦」類別、「戰鬥機」類別,並且這些類別內還可以包含「前進」、「左彎」、「右彎」等成員函式。
到了Java流行的年代,上述名言可完全改為Programs = Classes,因為Java的每一行程式都必定隸屬於某一個類別中,絕對不會在類別之外。而這與原名言是否有衝突呢?嚴格來說,原名言仍是正確的,只需要小幅修正,因為此階段的資料結構已經包含了運算以及實現運算的演算法。換句話說,在純物件導向的程式設計中,Programs = Data Structures = Classes。
更明確地來說,兩者的Data Structures意函並不完全相同,如下整理:
1975~1995年:Programs(in Proc) = Algorithms + Old Data Structures
 1995~20xx年:Programs(in OOP) = New Data Structures = Classes
 而New Data Structures= Algorithms + Old Data Structures

struct關鍵字可用來觀察上述的時代演變。在C++的程式設計中,建議以類別方式來設計程式,但C++的struct結構體也可以如class類別般宣告成員函式,只不過預設的保護等級不同而已。換句話說,如果我們明確地宣告各成員的保護等級時,則使用struct與使用class具有相同效果。
由此可知,C++'s struct (New Data Structures) = C's struct(Old Data Structures) + Algorithms(implement in MemberFunctions)。正由於有此轉變,因此新型態的資料結構已經不能再以文字上的意義-「結構」來解釋,它還應該包含了運算。因此是更高層次抽象化的結果。

抽象類別、介面與資料結構的抽象化描述(待續..)

沒有留言: