面向對象程式設計

面向對象程式設計

面向對象編程(ObjectOrientedProgramming,OOP,面向對象程式設計)是一種計算機編程架構。OOP的一條基本原則是電腦程式是由單個能夠起到子程式作用的單元或對象組合而成。OOP達到了軟體工程的三個主要目標:重用性、靈活性和擴展性。為了實現整體運算,每個對象都能夠接收信息、處理數據和向其它對象傳送信息。一項由 Deborah J. Armstrong 進行的長達40年之久的計算機著作調查顯示出了一系列面向對象程式設計的基本理論。

基本信息

基本理論

面向對象程式設計 面向對象程式設計

一項由 Deborah J. Armstrong 進行的長達40年之久的計算機著作調查顯示出了一系列面向對象程式設計的基本理論。它們是:

類(Class)定義了一件事物的抽象特點。通常來說,類定義了事物的屬性和它可以做到的(它的行為)。舉例來說,"狗"這個類會包含狗的一切基礎特徵,例如它的孕育、毛皮顏色和吠叫的能力。類可以為程式提供模版和結構。一個類的方法和屬性被稱為"成員"。 我們來看一段偽代碼:

歷史

計算機科學中對象和實例概念的最早萌芽可以追溯到麻省理工學院的PDP-1系統。這一系統大概是最早的基於容量架構(capabilitybasedarchitecture)的實際系統。另外1963年IvanSutherland的Sketchpad套用中也蘊含了同樣的思想。對象作為編程實體最早是於1960年代由Simula67語言引入思維。Simula這一語言是奧利-約翰·達爾和克利斯登·奈加特在挪威奧斯陸計算機中心為模擬環境而設計的。(據說,他們是為了模擬船隻而設計的這種語言,並且對不同船隻間屬性的相互影響感興趣。他們將不同的船隻歸納為不同的類,而每一個對象,基於它的類,可以定義它自己的屬性和行為。)這種辦法是分析式程式的最早概念體現。在分析式程式中,我們將真實世界的對象映射到抽象的對象,叫做“模擬”。Simula不僅引入了“類”的概念,還套用了實例這一思想——這可能是這些概念的最早套用。

20世紀70年代施樂PARC研究所發明的Smalltalk語言將面向對象程式設計的概念定義為,在基礎運算中,對對象和訊息的廣泛套用。Smalltalk的創建者深受Simula67的主要思想影響,但Smalltalk中的對象是完全動態的——它們可以被創建、修改並銷毀,這與Simula中的靜態對象有所區別。此外,Smalltalk還引入了繼承性的思想,它因此一舉超越了不可創建實例的程式設計模型和不具備繼承性的Simula。

此外,Simula67的思想亦被套用在許多不同的語言,如Lisp、Pascal。

面向對象程式設計在80年代成為了一種主導思想,這主要應歸功於C++——C語言的擴充版。在圖形用戶界面(GUI)日漸崛起的情況下,面向對象程式設計很好地適應了潮流。GUI和面向對象程式設計的緊密關聯在MacOSX中可見一斑。MacOSX是由Objective-C語言寫成的,這一語言是一個仿Smalltalk的C語言擴充版。面向對象程式設計的思想也使事件處理式的程式設計更加廣泛被套用(雖然這一概念並非僅存在於面向對象程式設計)。一種說法是,GUI的引入極大地推動了面向對象程式設計的發展。

蘇黎世聯邦理工學院的尼克勞斯·維爾特和他的同事們對抽象數據和模組化程式設計進行了研究。Modula-2將這些都包括了進去,而Oberon則包括了一種特殊的面向對象方法——不同於Smalltalk與C++。

面向對象的特性也被加入了當時較為流行的語言:Ada、BASIC、Lisp、Fortran、Pascal以及種種。由於這些語言最初並沒有面向對象的設計,故而這種糅合常常會導致兼容性和維護性的問題。與之相反的是,“純正的”面向對象語言卻缺乏一些程式設計師們賴以生存的特性。在這一大環境下,開發新的語言成為了當務之急。作為先行者,Eiffel成功地解決了這些問題,並成為了當時較受歡迎的語言。

在過去的幾年中,Java語言成為了廣為套用的語言,除了它與C和C++語法上的近似性。Java的可移植性是它的成功中不可磨滅的一步,因為這一特性,已吸引了龐大的程式設計師群的投入。

近日,一些既支持面向對象程式設計,又支持面向過程程式設計的語言悄然浮出水面。它們中的佼佼者有Python、Ruby等等.

正如面向過程程式設計使得結構化程式設計的技術得以提升,現代的面向對象程式設計方法使得對設計模式的用途、契約式設計和建模語言(如UML)技術也得到了一定提升。

設計方法

在數據輸入模組內部設計中,採用面向對象的設計方法。面向對象的基本概念如下:

對象:對象是要研究的任何事物。從一本書到一家圖書館,單的整數到整數列龐大的資料庫、極其複雜的自動化工廠、太空梭都可看作對象,它不僅能表示有形的實體,也能表示無形的(抽象的)規則、計畫或事件。對象由數據(描述事物的屬性)和作用於數據的操作(體現事物的行為)構成一獨立整體。從程式設計者來看,對象是一個程式模組,從用戶來看,對象為他們提供所希望的行為。在對內的操作通常稱為方法。

類:類是對象的模板。即類是對一組有相同數據和相同操作的對象的定義,一個類所包含的方法和數據描述一組對象的共同屬性和行為。類是在對象之上的抽象,對象則是類的具體化,是類的實例。類可有其子類,也可有其它類,形成類層次結構。

訊息:訊息是對象之間進行通信的一種規格說明。一般它由三部分組成:接收訊息的對象、訊息名及實際變元。

面向對象主要特徵:

封裝性:封裝是一種信息隱蔽技術,它體現於類的說明,是對象的重要特性。封裝使數據和加工該數據的方法(函式)封裝為一個整體,以實現獨立性很強的模組,使得用戶只能見到對象的外特性(對象能接受哪些訊息,具有那些處理能力),而對象的內特性(保存內部狀態的私有數據和實現加工能力的算法)對用戶是隱蔽的。封裝的目的在於把對象的設計者和對象的使用者分開,使用者不必知曉行為實現的細節,只須用設計者提供的訊息來訪問該對象。

繼承性:繼承性是子類自動共享父類之間數據和方法的機制。它由類的派生功能體現。一個類直接繼承其它類的全部描述,同時可修改和擴充。繼承具有傳遞性。繼承分為單繼承(一個子類只有一父類)和多重繼承(一個類有多個父類)。類的對象是各自封閉的,如果沒繼承性機制,則類對象中數據、方法就會出現大量重複。繼承不僅支持系統的可重用性,而且還促進系統的可擴充性。

多態性:對象根據所接收的訊息而做出動作。同一訊息為不同的對象接受時可產生完全不同的行動,這種現象稱為多態性。利用多態性用戶可傳送一個通用的信息,而將所有的實現細節都留給接受訊息的對象自行決定,如是,同一訊息即可調用不同的方法。例如:Print訊息被傳送給一圖或表時調用的列印方法與將同樣的Print訊息傳送給一正文檔案而調用的列印方法會完全不同。多態性的實現受到繼承性的支持,利用類繼承的層次關係,把具有通用功能的協定存放在類層次中儘可能高的地方,而將實現這一功能的不同方法置於較低層次,這樣,在這些低層次上生成的對象就能給通用訊息以不同的回響。在OOPL中可通過在派生類中重定義基類函式(定義為重載函式或虛函式)來實現多態性。

綜上可知,在面對對象方法中,對象和傳遞訊息分別表現事物及事物間相互聯繫的概念。類和繼承是是適應人們一般思維方式的描述範式。方法是允許作用於該類對象上的各種操作。這種對象、類、訊息和方法的程式設計範式的基本點在於對象的封裝性和類的繼承性。通過封裝能將對象的定義和對象的實現分開,通過繼承能體現類與類之間的關係,以及由此帶來的動態聯編和實體的多態性,從而構成了面向對象的基本特徵。

面向對象設計是一種把面向對象的思想套用於軟體開發過程中,指導開發活動的系統方法,是建立在“對象”概念基礎上的方法學。對象是由數據和容許的操作組成的封裝體,與客觀實體有直接對應關係,一個對象類定義了具有相似性質的一組對象。而每繼承性是對具有層次關係的類的屬性和操作進行共享的一種方式。所謂面向對象就是基於對象概念,以對象為中心,以類和繼承為構造機制,來認識、理解、刻畫客觀世界和設計、構建相應的軟體系統。。按照Bjarne STroustRUP的說法,面向對象的編程範式:

l 決定你要的類;

2 給每個類提供完整的一組操作;

3 明確地使用繼承來表現共同點。

由這個定義,我們可以看出:面向對象設計就是“根據需求決定所需的類、類的操作以及類之間關聯的過程”。

特點

面向對象設計方法以對象為基礎,利用特定的軟體工具直接完成從對象客體的描述到軟體結構之間的轉換。這是面向對象設計方法最主要的特點和成就。面向對象設計方法的套用解決了傳統結構化開發方法中客觀世界描述工具與軟體結構的不一致性問題,縮短了開發周期,解決了從分析和設計到軟體模組結構之間多次轉換映射的繁雜過程,是一種很有發展前途的系統開發方法。

但是同原型方法一樣, 面向對象設計方法需要一定的軟體基礎支持才可以套用,另外在大型的MIS開發中如果不經自頂向下的整體劃分,而是一開始就自底向上的採用面向對象設計方法開發系統,同樣也會造成系統結構不合理、各部分關係失調等問題。所以面向對象設計方法和結構化方法目前仍是兩種在系統開發領域相互依存的、不可替代的方法。

學科套用

計算機科學中對象和實例概念的最早萌芽可以追溯到麻省理工學院的PDP-1系統。這一系統大概是最早的基於容量架構(capabilitybasedarchitecture)的實際系統。另外1963年IvanSutherland的Sketchpad套用中也蘊含了同樣的思想。對象作為編程實體最早是於1960年代由Simula67語言引入思維。Simula這一語言是奧利-約翰·達爾和克利斯登·奈加特在挪威奧斯陸計算機中心為模擬環境而設計的。(據說,他們是為了模擬船隻而設計的這種語言,並且對不同船隻間屬性的相互影響感興趣。他們將不同的船隻歸納為不同的類,而每一個對象,基於它的類,可以定義它自己的屬性和行為。)這種辦法是分析式程式的最早概念體現。在分析式程式中,我們將真實世界的對象映射到抽象的對象,叫做“模擬”。Simula不僅引入了“類”的概念,還套用了實例這一思想——這可能是這些概念的最早套用。

20世紀70年代施樂PARC研究所發明的Smalltalk語言將面向對象程式設計的概念定義為,在基礎運算中,對對象和訊息的廣泛套用。Smalltalk的創建者深受Simula67的主要思想影響,但Smalltalk中的對象是完全動態的——它們可以被創建、修改並銷毀,這與Simula中的靜態對象有所區別。此外,Smalltalk還引入了繼承性的思想,它因此一舉超越了不可創建實例的程式設計模型和不具備繼承性的Simula。

此外,Simula67的思想亦被套用在許多不同的語言,如Lisp、Pascal。

面向對象程式設計在80年代成為了一種主導思想,這主要應歸功於C++——C語言的擴充版。在圖形用戶界面(GUI)日漸崛起的情況下,面向對象程式設計很好地適應了潮流。GUI和面向對象程式設計的緊密關聯在MacOSX中可見一斑。MacOSX是由Objective-C語言寫成的,這一語言是一個仿Smalltalk的C語言擴充版。面向對象程式設計的思想也使事件處理式的程式設計更加廣泛被套用(雖然這一概念並非僅存在於面向對象程式設計)。一種說法是,GUI的引入極大地推動了面向對象程式設計的發展。

蘇黎世聯邦理工學院的尼克勞斯·維爾特和他的同事們對抽象數據和模組化程式設計進行了研究。Modula-2將這些都包括了進去,而Oberon則包括了一種特殊的面向對象方法——不同於Smalltalk與C++。

面向對象的特性也被加入了當時較為流行的語言:Ada、BASIC、Lisp、Fortran、Pascal以及種種。由於這些語言最初並沒有面向對象的設計,故而這種糅合常常會導致兼容性和維護性的問題。與之相反的是,“純正的”面向對象語言卻缺乏一些程式設計師們賴以生存的特性。在這一大環境下,開發新的語言成為了當務之急。作為先行者,Eiffel成功地解決了這些問題,並成為了當時較受歡迎的語言。

在過去的幾年中,Java語言成為了廣為套用的語言,除了它與C和C++語法上的近似性。Java的可移植性是它的成功中不可磨滅的一步,因為這一特性,已吸引了龐大的程式設計師群的投入。

一些既支持面向對象程式設計,又支持面向過程程式設計的語言悄然浮出水面。它們中的佼佼者有Python、Ruby等等.

正如面向過程程式設計使得結構化程式設計的技術得以提升,現代的面向對象程式設計方法使得對設計模式的用途、契約式設計和建模語言(如UML)技術也得到了一定提升。

相關詞條

相關搜尋

熱門詞條

聯絡我們