3.1 編程的抽象
所有編程語言都提供一種“抽象”的方法。抽象是簡化、解決問題的手段之一,從某種程度上來說,解決問題的復雜性與抽象的種類和質量直接相關。
在不同的編程語言中,抽象的程度有所不同。匯編語言是對機器底層的一種少量抽象。后來的許多“命令式”語言(如FORTRAN、BASIC和C)是對匯編語言的一種抽象。與匯編語言相比,這些語言已有了長足的進步,但它們的抽象原理依然要求我們著重考慮計算機的結構,而非問題本身的結構。因此,開發人員在使用這些語言時有一定的技術門檻,因為開發人員必須要在機器模型(“解決方案空間”)與實際解決的問題模型(“問題空間”)之間建立起一種關聯關系。這個過程要求人們付出較大的精力,而且它脫離了編程語言本身的范圍,造成程序代碼很難編寫,而且要花較大的代價進行維護。
面向對象的程序設計在此基礎上跨出了一大步,程序員可利用一些工具表達“問題空間”內的元素。由于這種表達非常具有普遍性,因此不必受限于特定類型的問題。我們將問題空間中的元素以及它們在解決方案空間的表示物稱作“對象”(Object)。當然,還有一些在問題空間沒有對應的對象體。在面向對象編程(OOP)中,通過添加新的對象類型,程序可進行靈活調整,以便與特定問題配合。與現實世界的“對象”或者“物體”相比,編程“對象”與它們也存在共通的地方:它們都有自己的狀態(state)和行為(behavior)。比如,狗的狀態有名字、顏色等,狗的行為有叫喚、搖尾等。
如圖3-1所示,在狗的世界里面,根據狗的狀態和行為可以將狗劃分為不同的種類。軟件世界中的對象和現實世界中的對象類似,對象存儲狀態在字段(field)里,可通過方法(methods)暴露其行為。方法對對象的內部狀態進行操作,并作為對象與對象之間通信的主要機制。隱藏對象內部狀態,通過方法進行所有的交互,這是面向對象編程的一個基本原則——數據封裝(data encapsulation)。

圖3-1 狗的分類
下面以“狗”作為一個對象的建模(見圖3-2)。

圖3-2 “狗”作為對象的建模
狗可以通過狀態(名字、顏色)來創建不同的對象,同時也提供了訪問狗對象狀態的方法(叫喚、搖尾)。
編程語言中的對象可以抽象為以下特征:
· 一切皆對象。可將對象想象成一種新型變量,保存著數據,但可要求它對自身進行操作。從理論上講,可從要解決的問題本身提出所有概念性的組件,然后在程序中將其表達為一個對象。
· 程序是一大堆對象的組合。通過消息傳遞,各對象知道自己該做些什么。為了向對象發出請求,需向那個對象“發送一條消息”。更具體地講,可將消息想象為一個調用請求,它調用的是從屬于目標對象的一個方法或函數。
· 每個對象都有自己的存儲空間,可容納其他對象?;蛘哒f,通過封裝現有對象,可制作出新型對象。所以,盡管對象的概念非常簡單,但是在程序中卻可達到任意高的復雜程度。
· 每個對象都有一種類型。根據語法,每個對象都是某個“類”的一個“實例”。其中,“類”(Class)是“類型”(Type)的同義詞。一個類最重要的特征就是“能接收什么樣的消息”。
· 同一類所有對象都能接收相同的消息。由于類型為“狗”(Dog)的一個對象也屬于類型為“動物”(Animal)的一個對象,因此一條狗完全能接收動物的消息。這意味著可讓程序代碼統一指揮“動物”,令其自動控制所有符合“動物”描述的對象,其中自然包括“狗”。這一特性稱為對象的“可替換性”,是OOP最重要的概念之一。
- Practical UX Design
- Linux核心技術從小白到大牛
- ASP.NET Core Essentials
- Mastering Articulate Storyline
- 跟小海龜學Python
- Oracle數據庫從入門到運維實戰
- PHP 編程從入門到實踐
- Getting Started with SQL Server 2012 Cube Development
- PLC編程及應用實戰
- Spring+Spring MVC+MyBatis整合開發實戰
- 深入RabbitMQ
- Instant Ext.NET Application Development
- HTML5開發精要與實例詳解
- 開源項目成功之道
- Machine Learning With Go