天天看點

程式設計基礎概念:面向對象程式設計

程式設計基礎概念:面向對象程式設計

面向對象程式設計

        現在的世界,大家都用面向對象程式設計。這是結構化程式設計的基礎上進一步發展出來的。以前程式設計的範式是資料結構+算法,後來軟體規模越來越大,于是在一個程式裡面出現了成百上千個函數過程和資料結構,程式很不容易維護。于是人們就把程式分解成子程式,子程式裡面包含更小的組成部件,每個部件由一些資料結構及相關的算法組成。這些部件我們叫做對象。

        按照這樣的觀點,程式由一堆對象及對象間的消息互動組成。聽起來好像很平常,甚至認為很自然很理所當然。這個思想卻是一大進步。這個範式最後成為主流,現在幾乎所有的系統都是按照這個範式建構的。

        這個範式為什麼好呢?理論上的研究表明,需求構成了“問題空間”,程式構成了“解決空間”,兩個空間的相似度決定了解決的困難度。傳統上,我們要解決一個問題,計算機給我們提供的卻是寄存器、記憶體、加法器這一類機器的概念術語,是以那個時候将問題空間映射到解決空間的時候很複雜。而面向對象事件驅動的模型,跟現實世界的問題空間有一定程度的相似度,我們能夠比較省力地進行映射,解決問題。這個現實世界,本就是一個一個主體客體構成,它們發生了什麼事情,本來就是通過消息傳遞方式聯系在一起的。面向對象程式設計有一些新的術語,如類,對象/執行個體,消息,方法,屬性。我們後面會接觸到。

        不過我們要了解,任何一種程式設計範式都是有局限的,面向對象範式的缺點是過于強調名詞(對象),而把動詞(操作/算法)隐藏在名詞中沒有獨立抽象出來,遇到有些場景會設計得比較别扭複雜。比如關系資料庫的場景,1970年代發展出來的關系理論非常強大,但是跟面向對象思想不是很相容,在設計軟體的時候,我們被迫采用一種叫做ORM的方式進行映射,很複雜而且低效。我個人的觀點,關系資料庫是一種流,不是對象,應該采用代數演算來處理,我們的設計模式需要改變,要對等考慮對象、動作和關系。

Python支援多種類型的程式設計範式,例如過程式程式設計、函數式程式設計、面向對象程式設計,而且還可以融合多種類型的範式。我們後面寫的程式也是過程和對象程式設計混合的,都會介紹一點。

Python類的結構是:

        類是相同對象的一個抽象,包含了屬性和方法,可以了解為傳統程式設計中的變量和函數,也可以了解為一個完成某功能的獨立程式單元。

類本身隻是一個定義,運作的時候要根據這個類的定義生成一些執行個體去執行,這些執行個體也叫對象。對象裡面有自己的屬性和方法,兩個對象之間這些屬性的值是獨立的,互不幹擾。

        而一個類還可以有子類,子類繼承了父類的屬性和方法,之外還可以有自己特殊的方法和屬性。一個實際的系統都會建構一整套繼承體系,這也是面向對象程式設計的難點,不小心設計,很容易把體系建構得亂七八糟。是以,架構師一般會設計一些接口或者純粹虛的類,作為對外的界面,然後構造一些抽象類進行基礎部分的實作,最後讓程式員實作具體的子類完成特定的業務邏輯。

        在實際語言的實作中,除了正常的用執行個體去運作,還會提供類級别的運作,可以直接使用類裡面的變量和方法。

看一個例子:

測試一下:

曆史上,好些科學家都為面向對象程式設計貢獻了想法,是以我們不能确切地說誰發明了面向對象的概念。我這裡要提到的Alan Kay是比較出名的一個,他1960年代就提出了這個想法,發明了Smalltalk語言,為圖形界面做出了先驅性貢獻,于2003年獲Turing獎。他最有名的一句名言是“The best way to predict the future is to invent it.”。

程式設計基礎概念:面向對象程式設計

(Alan Kay,1940.5.17 - ,圖檔來源:維基百科)