區塊鏈技術語言(二十二)——Go語言面向物件
1
面向過程和麵向物件的區別
面向物件(Object Oriented,簡稱OO)和麵向過程(Procedure Oriented,簡稱PO)是兩種不同的程式設計思想。
1.1 面向過程的程式設計
面向過程程式設計(Process Oriented Programming,簡稱POP),以事物的發展過程為中心的程式設計思想,它根據流程一步一步解決問題。
1.1.1 面向過程的程式設計
傳統的面向過程程式設計是圍繞功能進行的,用一個函式實現一個功能。面向過程的程式設計具備如下特點:
a. 程式按要解決的問題劃分為各個小程式,這些小程式被稱為函式;
b.大多數函式共享全域性資料;
c.資料是開放的,由一個函式流向另一個函式。函式把資料從一種形式轉換為另一種形式。
1.1.2 面向過程程式設計的優缺點
面向過程程式設計的優點就是其效能比面向物件高,因為面向物件程式設計的物件呼叫時需要將物件例項化,開銷大。面向過程程式設計消耗資源少,效能高。
但面向過程程式設計存在很大的缺點。
a. 程式碼維護難度大
在多函式程式中,許多重要的資料被宣告為全域性變數,這樣它們才可以被所有的函式訪問。每個函式又可以有自己的區域性變數。全域性變數很容易被某個函式不經意之間改變。而在一個大程式中,很難分辨每個函式都使用了哪些變數。如果我們需要修改某個外部資料的結構,我們就要修改所有訪問這個資料的函式。這樣很容易導致bug的產生。
b. 不能很好的模擬真實世界的問題。
函式都是面向過程的,而不是真正的對應於問題中的各個元素。
總的來說,相較於面向物件程式設計,面向過程程式設計效能好,但是程式碼維護難度大、程式很難複用和擴充套件。
1.2 面向物件的程式設計
面向物件程式設計(Object Oriented Programming,簡稱OOP),能很好的模擬真實世界的問題,能真正的對應於問題中的各個元素。
1.2.1 面向物件的程式設計
面向物件的程式設計思路和日常生活處理問題的思路是類似的。在自然世界和社會生活中,一個複雜的事物總是由許多部分組成。譬如手機的生產,需要分別設計螢幕、電池、晶片、攝像頭等,最後將它們組裝在一起。在組裝的時候,各部分零部件有一定的聯絡,以便協調工作。這就是面向物件的程式設計的基本思路。
1.2.2 與面向物件有關的幾個概念
a. 物件
客觀世界中任何一個事物都可以看成一個物件(object),它是程式中的基本單元。一個物件具備兩個要素:屬性(attribute)和行為(behavior)。若使這個物件實現這個行為,需要其他物件向其傳送相應的訊息,這樣物件之間就通過傳送和接收訊息取得聯絡。
如圖1所示,在Go語言中,每個物件都是由資料和操作這些資料的方法構成的。物件中的資料體現了“屬性”要素。例如一個圓形物件,資料半徑是它的屬性,方法是對該物件中的資料進行的操作。如果要實現這個物件計算面積的功能,就可以通過方法對資料的半徑進行操作,實現計算該物件面積這個行為。
b. 封裝與資訊隱蔽
封裝是面向物件三大基本特性之一,它包含兩方面含義:
一是將有關資料和操作資料的方法封裝在一個物件中,形成一個基本單元,各物件之間相對獨立,互不干擾。
二是將物件中某些部分對外隱蔽,即隱蔽其內部細節,只留下少量跟外界聯絡的渠道,以便接收外界的訊息。這種對外界隱蔽的做法稱為資訊隱蔽(imformation hiding)。它有利於資料安全,防止無關的人瞭解和修改資料。
在Go語言中,通過方法將資料和操作這些資料的方法封裝在一個物件。方法這個概念在後續章節再做介紹。
c. 抽象
抽象是將有關事物和物件進行共性歸納和集中,它表示同一類事物的本質。類是物件的抽象,物件是類的特例,也就是類的具體形式。
Go語言通過結構體(struct)將有關事物和物件進行共性歸納和集中。
d. 繼承與重用
如果在軟體開發中已經建立了一個名為A的“類”,又想另外建立一個名為B的“類”,而後者與前者內容基本相同,只是在前者的基礎上增加了一些屬性和行為,只需在類A的基礎上增加一些新內容即可。這就是面向物件程式設計的繼承機制。
利用繼承可以簡化程式設計的步驟。例如,“白馬”繼承了“馬”的基本特徵,又增加了新的特徵——顏色。“馬”是父類,或稱為基類;“白馬”是從“馬”派生出來的,稱為子類或派生類。
Go語言沒有“繼承”這個概念,但它通過匿名組合實現了這個功能,這就是“軟體重用”(software reusability) 的思想。匿名組合在後續章節再做解釋。
e. 多型性
一千個讀者就有一千個哈姆雷特。面對同一事物,或者同一個訊息,不同的人會有不同的表現,這種情況就是多型。
在Go語言中,沒有多型這個概念,但Go語言通過介面(interface)實現了多型,我們在後續章節還會重點介紹介面。介面儲存了一系列的方法,雖然不同型別的物件例項可以呼叫同一介面,即呼叫的都是相同方法名的方法。但是由於建立在不同型別的方法內容不同,它的表現形式就不相同。
1.2.2 面向物件程式設計的優缺點
面向物件程式設計由於物件例項化消耗資源,效能比面向過程低。
但面向物件程式設計的優點很多:
a. 程式碼維護簡單
把事物看成物件,將資料和操作資料的方法進行封裝,物件之間相互獨立。這樣在程式碼維護就更加簡單。
b. 資訊保安
將物件中的一些資訊對外界隱藏,資料更加安全。
c. 可擴充性
面向物件程式設計通過繼承可以很快地擴充這個類,建立一個具有擴充的功能的類。系統很容易從小到大逐步升級。
d. 表現靈活
不同的物件實現同一介面,有不同的表現形式。
2
Go語言的面向物件程式設計
Go語言在面向物件程式設計的設計簡潔又優雅。Go語言簡潔,這是因為Go語言沒有沿襲傳統面向物件程式設計中的諸多概念,比如封裝、繼承、多型、虛擬函式、建構函式和解構函式、隱藏的this指標等。Go語言優雅,這是因為Go語言對面向物件的支援是語言型別系統中的天然組成部分。
封裝、繼承、多型是面向物件的三大特性。儘管Go語言沒有封裝、繼承、多型這些概念,但它通過以下方式實現了這些特性:
▷封裝:通過方法實現(方法在後續章節分析);
▷ 繼承:通過匿名組合實現(匿名組合在後續章節分析);
▷ 多型:通過介面實現(介面在後續章節分析)。
ofollow,noindex"> 原文連結:區塊鏈技術語言(二十二)——Go語言面向物件
參考資料
[1] 譚浩強.C++面向物件程式設計[M]. 清華大學出版社,2006
[2] 陳維興,陳昕.C++面向物件程式設計[M]. 人民郵電出版社,2010
本文完,獲取更多資訊,敬請關注區塊鏈工程師。
來源:鏈塊學院
本文由布洛克專欄作者釋出,代表作者觀點,版權歸作者所有,不代表布洛克科技觀點
——TheEnd——
關注“布洛克科技”