1. 程式人生 > >每日一題:詳解面向物件

每日一題:詳解面向物件

面向物件與面向過程

最初,軟體開發所使用的思想都是面向過程,面向過程的模式更適合計算機運算,或者說更貼近於人類大腦的理解模式。然而隨著時代的發展,軟體系統也越來越複雜,規模越來越大,面向過程的弊端逐漸顯現出來,最關鍵的在於面向過程開發出的軟體系統更難維護,程式碼耦合度較高,當需求變更後,每次都需要修改大量的程式碼。

面向物件的出現則解決了這些問題,當然有付出才有回報,相比與面向過程,面向物件思想下的程式碼也有以下缺點:

  • 可讀性相對於面向過程更差一些,主要是因為面向物件的程式碼較為零散
  • 效能比面向過程的程式碼要低,因為面向物件的程式碼執行過程中需要不斷的處理類的建立和銷燬之類的操作,資源佔用比面向過程要大。

總而言之,面向過程和麵向物件並沒有誰優誰劣,只是適用範圍不同,如果說專案比較簡單,也不太需要關心後期變更的問題,面向過程可以讓你更快的構建專案,如果說專案規模比較大,後期專案會有較長的維護期,那從需求分析開始,你就需要以面向物件的思想來處理。

面向物件的三個特點

  • 封裝
    之前提到需要以面向物件的思想來處理問題,首先的第一步就是抽象,將這個花花世界中我們關心的東西抽象為一個類,一個可以描述我們關心的東西的類。任何一件物品從不同角度來看都能抽象出不同的屬性,因為關注點不一樣,一個人如果從醫生的角度去抽象,我們可能關心的是身高、體重、身體狀況、睡眠情況、飲食情況等等,而從一個設計師的角度去抽象,我們關心的可能就是身高、體重、性別、性格、喜歡的顏色、三圍等等

抽象就是以某一個視角來看待這個世界中的東西並將其封裝為類,將我們關心的屬性作為類的屬性,我們關心的動作作為方法,然後通過控制其屬性和方法是否為私有來控制是否可以被外界訪問

  • 繼承
    繼承實現在封裝的基礎之上,我們在封裝類時會遇到多個類擁有重複的屬性或方法,而繼承可以讓一個類完全擁有另一個類的公共屬性和公共方法,這樣我們可以減少封裝時的重複內容,也可以在不修改類程式碼的情況下對類進行擴充套件。

被繼承的類我們一般稱之為超類、基類或父類,而繼承父類的類我們一般稱之為子類。繼承在設計中一般都是大類到小類的過程,父類和子類的關係為“is a”,例如封裝一個動物類,然後通過繼承實現一個子類,例如狗,這樣狗擁有動物的所有特徵,之後便可在子類中繼續編寫狗特有的屬性和方法,父子類的關係可描述為狗是一種動物。

注:雖然說繼承是眾多開發語言都具備的功能,但繼承也存在很大的程式碼耦合問題,父類的程式碼一旦變更則會導致所有子類都會跟著改變,所以開發過程中儘可能的使用介面來代替繼承。

  • 多型
    多型是在繼承基礎之上衍生出的,變數所引用的物件型別在執行期間由程式決定。多型的必要條件為繼承,多型雙方必須為父子類,父類在執行期間決定由哪個子類來執行具體操作,換句話說父類變數在程式執行期間決定指向哪個子類物件。同樣,因為子類繼承了父類的所有方法且存在自定義方法的可能,所以多型的情況下父類無法獲取或執行只存在於子類中的屬性或方法。