1. 程式人生 > >什麼是物件?什麼是面向物件程式設計?面嚮物件語言有什麼優點?

什麼是物件?什麼是面向物件程式設計?面嚮物件語言有什麼優點?

在初學面嚮物件語言的時候,很多書都會有這樣的句子–“一切都是物件”。那麼物件究竟是什麼呢?是不是一切的事物都叫物件?但這裡的物件並不是我們日常生活中的物件(事物),C#中我們把一個類的例項叫做物件,這裡的物件並非只是具體的事物,它也可以是一種規則、計劃或事件。在我看來,物件就是對事物共同特性及行為的抽象及總結。
下面引用維基百科上對物件的定義:

在電腦科學中,物件(英語:object),臺灣譯作物件,是一個儲存器地址,其中擁有值,這個地址可能有識別符號指向此處。物件可以是一個變數,一個數據結構,或是一個函式。是面向物件(Object Oriented)中的術語,既表示客觀世界問題空間(Namespace)中的某個具體的事物,又表示軟體系統解空間中的基本元素。
在軟體系統中,物件具有唯一的識別符號,物件包括屬性(Properties)和方法(Methods),屬性就是需要記憶的資訊,方法就是物件能夠提供的服務。在面向物件(Object Oriented)的軟體中,物件(Object)是某一個類(Class)的例項(Instance)。

那麼所謂面向物件程式設計,就是面向類和例項的程式設計方法嗎?這樣的理解似乎有些片面。面向物件並不是單純的面向類和例項程式設計,更不是面向一切事物(一切都是物件)程式設計。在程式設計世界裡提到面向物件更多的是指一種設計及程式設計的思想及開發方式,愚以為如何將問題抽象成物件並編碼實現的過程便是面向物件程式設計,而不是寫一個類實現一個例項就是面向物件程式設計。
為了防止大家跟我在錯誤的道路上越走越遠,下面同樣粘一段維基百科的定義:

面向物件程式設計(英語:Object-oriented
programming,縮寫:OOP)是種具有物件概念的程式程式設計範型,同時也是一種程式開發的方法。它可能包含資料、屬性、程式碼與方法。物件則指的是類的例項。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充套件性,物件裡的程式可以訪問及經常修改物件相關連的資料。在面向物件程式程式設計裡,計算機程式會被設計成彼此相關的物件[1][2]。

面向物件程式設計可以看作一種在程式中包含各種獨立而又互相呼叫的物件的思想,這與傳統的思想剛好相反:傳統的程式設計主張將程式看作一系列函式的集合,或者直接就是一系列對電腦下達的指令。面向物件程式設計中的每一個物件都應該能夠接受資料、處理資料並將資料傳達給其它物件,因此它們都可以被看作一個小型的“機器”,即物件。目前已經被證實的是,面向物件程式設計推廣了程式的靈活性和可維護性,並且在大型專案設計中廣為應用。此外,支持者聲稱面向物件程式設計要比以往的做法更加便於學習,因為它能夠讓人們更簡單地設計並維護程式,使得程式更加便於分析、設計、理解。反對者在某些領域對此予以否認。

當我們提到面向物件的時候,它不僅指一種程式設計方法。它更多意義上是一種程式開發方式。在這一方面,我們必須瞭解更多關於面向物件系統分析和麵向物件設計(Object
Oriented Design,簡稱OOD)方面的知識。許多流行的程式語言是面向物件的,它們的風格就是會透由物件來創出例項。

重要的面向物件程式語言包含Common
Lisp、Python、C++、Objective-C、Smalltalk、Delphi、Java、Swift、C#、Perl、Ruby 與
PHP等。

支援部分或絕大部分面向物件特性(類和例項、封裝性、繼承、多型)的語言即可稱為基於物件的或面向物件的語言。Java跟C#是目前最流行的兩門面向物件語言。
從一開始的面向過程(Procedure Oriented,是一種以過程為中心的程式設計思想),到之後面向物件逐步成為主流,面嚮物件語言開始佔據歷史舞臺。一開始面向物件的程式其實並非是面嚮物件語言寫出來的,使用面向過程的語言也可以寫出面向物件的程式,只是實現比較曲折,所以後來才會有層出不窮的面嚮物件語言。相較於面向過程及函數語言程式設計。面嚮物件語言可以歸類為:

  1. 基於物件的程式設計語言;
  2. 面向物件的程式設計語言。

面向物件程式設計具有以下優點:

  1. 易維護
    採用面向物件思想設計的結構,可讀性高,由於繼承的存在,即使改變需求,那麼維護也只是在區域性模組,所以維護起來是非常方便和較低成本的。

  2. 易擴充套件
    通過繼承,我們可以大幅減少多餘的程式碼,並擴充套件現有程式碼的用途;
    我們可以在標準的模組上(這裡所謂的”標準”指程式設計師之間彼此達成的協議)構建我們的程式,而不必一切從頭開始。這可以減少軟體開發時間並提高生產效率;

  3. 模組化
    封裝可以定義物件的屬性和方法的訪問級別,通過不同的訪問修飾符對外暴露安全的介面,防止內部資料在不安全的情況下被修改。這樣可以使程式具備更高的模組化程度,方便後期的維護和修改。
    同時,面嚮物件語言允許一個物件的多個例項同時存在,而且彼此之間不會相互干擾;

  4. 方便建模
    雖然面嚮物件語言中的物件與現實生活中的物件並不是同個概念,但很多時候,往往可以使用現實生活中物件的概念抽象後稍作修改來進行建模,這大大方便了建模的過程。(但直接使用現實中的物件來建模有時會適得其反)。

以上就是筆者對面向物件的一些理解,歡迎交流。