天天看點

《面向對象設計實踐指南:Ruby語言描述》—第1章 1.4節 面向對象程式設計簡介

本節書摘來自異步社群《面向對象設計實踐指南:ruby語言描述》一書中的第1章,第1.4節 面向對象程式設計簡介,作者【美】sandi metz,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

1.4 面向對象程式設計簡介

面向對象設計實踐指南:ruby語言描述

面向對象的應用程式由對象和它們之間傳遞的消息構成。其中,消息相對更為重要。但在本節的簡介裡(以及在本書的前面幾個章節裡),這兩個概念都同等重要。

1.4.1 過程式語言

相對于非面向對象(或過程式)的程式設計來說,面向對象程式設計是面向對象的。依據這兩種風格的差異來考慮它們很有意義。假設有這麼一種通用的程式設計語言,它可用來建立簡單的腳本。在這門語言裡,你可以定義變量(即組成多個名稱),并将這些名字與少量的資料相關聯。一旦進行了配置設定,便可以通過引用這些變量來通路相關的資料。

與所有的過程式語言一樣,這門語言隻對少量固定集合的不同類型資料(諸如字元串、數字、數組、檔案等)有所了解。這些不同類型的資料叫做資料類型。每一種資料類型都描述了某種非常具體的事物。字元串資料類型與檔案資料類型是不同的。這門語言的文法還會包含許多内建操作,以完成某些對各種資料類型來說都很合理的事情,如字元串連接配接和檔案讀取。

因為建立了變量,是以你能夠知道每一個容納的内容是何種類型。哪些操作是可用的,你對這一點的期望都依托于你對變量資料類型知識的了解。往字元串裡進行追加、使用數字進行數學計算、對數組進行索引、閱讀檔案等等,所有這些都是你所知道的。

每一種可能的資料類型和操作都已存在,所有這些内容都被建構在語言的文法裡。這門語言可能允許你建立函數(将一些預定義操作以一個新的名字組合在一起),或者允許你定義複雜的資料結構(将某些預定義的資料類型組裝成一個命名排列),但是你無法組成全新的操作或全新的資料類型。你所看到的内容便是你能得到的。

與所有過程式語言一樣,在這門語言裡的資料和行為之間都有一道鴻溝。資料是一回事,行為是與之完全不同的另一回事。資料被包裹在變量裡,然後四處傳遞給行為(坦率地講,可以對它做任何事情)。資料就像一個孩子,在每天早上行為都将其送至學校;當它離開你的視線後,你便無辦法知道實際所發生的事情。對資料的影響是不可預知的,并且在很大程度上也是捉摸不定的。

1.4.2 面向對象語言

現在假設有另一門不一樣的程式設計語言,它像ruby一樣是基于類和面向對象的。ruby沒有将資料和行為分裂成兩個單獨的部分(如兩個絕不相遇的球體),它将這兩者結合成為了一個事物(即對象)。對象擁有行為,也包含了可單獨通路控制的資料。對象之間通過互相發送消息來調用彼此的行為。

ruby有一個字元串對象,它沒有字元串資料類型。處理字元串的操作都建構在字元串對象内部,而沒有建構在語言的文法裡。字元串對象各不相同,它們每一個都包含有屬于自己的字元串資料;但是它們的行為又彼此很相似。每一個字元串都将其資料封裝或隐藏起來,以便與外面隔離。每一個對象都要自己決定需要暴露多少資料。

因為字元串對象可以自己提供操作,是以ruby沒必要對字元串資料類型特别了解,它隻需要提供一種通用的方式友善對象發送消息即可。例如,字元串能了解concat消息,是以ruby沒必要包含字元串連接配接的文法,它隻需要提供某種方式,讓一個對象可以将concat發送至另一個即可。

即便是最簡單的應用程式也可能需要多個字元串、數字、檔案或數組。事實上,雖然你可能偶爾會需要一個唯一、單獨的對象,但更為常見的期望是需要産生一大堆的對象—它們擁有相同的行為,但卻封裝了不同的資料。

像ruby那樣基于類的oo語言允許定義類——它為建構相似對象提供了一個藍圖。一個類可以定義多個方法(定義行為)和多個屬性(定義變量)。在響應消息時,方法會被調用。不同的對象可以定義具有相同名字的方法,ruby會為發送來的任何消息查找和調用正确對象的合适方法。

在有了string類之後,你便可以用它來重複地執行個體化(或建立)新的字元串對象執行個體。每一個重新執行個體化的string都會實作相同的方法,并使用相同的屬性名稱,但每一個string對象都包含了它們自己個人的資料。它們共享相同的方法,是以它們都像是string。由于都包含不同的資料,是以它們又代表了不同的狀态。

string類定義了一種類型,它遠不隻是資料那麼簡單。在知道某個對象的類型之後,你便可以對它将如何表現有所期待。在過程式語言裡,變量都隻有單一的資料類型。這個資料類型的知識允許你對哪些是有效的操作會有所期待。在ruby裡,一個對象可能有多種類型,其中任何一種都來自與它對應的類。是以對象類型的知識會讓你對它能響應的消息有所期待。

ruby提供了一系列預定義好的類。最可容易立即辨識出來的是與過程式語言所使用的資料類型相重疊的那些。例如,string類定義了字元串、fixnum類是定義了整數。對于你所期望的一門程式設計語言應該提供的每一種資料類型,都有一個預先存在的類。不過,面向對象的語言是使用對象來建構自己的,這一點讓事情開始變得很有意思。

那個string類(即建立新字元串對象的藍本),其自身也是一個對象。它是class類的一個執行個體。如同每個字元串對象都是string類的特定資料執行個體一樣,每個類對象(如string、fixnum等)也都是class類的特定資料執行個體。string類會生成新的字元串,class類會生成新的類。

是以,oo語言是開放式的。它們不會将你限制在一個很小的内建類型和事先預定義好的操作集合裡。你可以創造出全新的屬于自己的類型。每一個oo應用程式都會漸漸變成一門唯一的程式設計語言,它專屬于你的領域。

這門語言最終帶給你的是快樂,還是痛苦,都與設計有關,而這也正是本書關注的内容。

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。