常見的 C 語言是屬於程序導向中結構化程式設計的概念,採取『自上而下、逐步細化、模組化』的方法,將軟體的複雜度控制在一個範圍內,從而降低軟體發展的複雜度,因此 C 語言成為 20 世紀 70 年代軟體發展的潮流。
隨著硬體的快速發展,業務要求越來越複雜,而且程式設計應用領域越來越廣泛,結構化程式設計的軟體生產力遠跟不上硬體和業務的發展。
因為結構化程式設計的方式無法滿足軟體『可擴充性』和『可維護性』的需求,因此物件導向的概念才開始普及。從 C++ 到後來的 Java、C# 把物件導向推向巔峰。
和程序導向相比,物件導向的概念更加貼近人類思維的特點,這也是軟體設計的一次重大突破。
一、程序導向簡介
程序導向是一種以『程序』為中心的程式流水線設計概念,其中最中要的就是『完成一件事情的步驟』。這是一種機械式的邏輯,每個階段都有自己的輸入資料、處理單元及輸出資料。
在程序導向中,我們需要將程式分成不同的處理單元,然後設計不同單元該如何銜接,並定義每個單元的輸入及輸出資料類型。
程式設計人員應該都聽過「程式設計 = 演算法 + 資料結構」,這其實就是程序導向的概念,而這種特徵其實和電腦的本質相關,其核心 CPU 處理指令的方式就如同流水線一樣,所以電腦是以程序導向為基石來進行處理。
即使我們使用物件導向語言來進行程式開發,但它最後還是要轉換成 CPU 能執行的指令,依舊屬於程序導向。
二、物件導向簡介
物件導向是一種以『物件』作為中心的程式設計概念,著重在對現實世界的模擬。
跟程序導向不同,物件導向的方法中沒有主要控制的角色,也不需要指定嚴謹的操作順序,而是以物件為主體,指定這些物件完成任務,以及這些物件如何對外界的刺激做出反應。
人們大多是按照物件導向的方式進行思考,所以物件導向更加符合人類的思維習慣。
在物件導向的程式設計中,「程式設計 = 物件 + 互動」
三、為什麼需要物件導向?
由於程序導向是電腦運行的基石,因此目前 C 語言、作業系統、協定堆疊、驅動程式,依然還是程序導向的天下。
但程序導向有著先天性的不足,那就是流程和結構相對固定,雖有效率但其擴充比較麻煩。每次需求的變更,都要對流程的每個步驟、中間的進出的資料結構進行修改。
物件導向是為了解決程序導向的『擴充性』問題而誕生的,因此物件導向的最大特徵就是『可擴充性』。要將變化帶來的影響控制在有限的範圍內,避免產生全流程或大範圍的影響,降低開發上的風險。
因此,經常發生變化的地方就是物件導向的發威之處,常見及可變的主要集中在客戶需求部份,不變的一般都屬於電腦系統的基礎。
作業系統、資料庫及協定等,相對穩定而且要求高效率,因此較適合程序導向;而企業應用、網際網路或遊戲等應用,需求經常變更且功能不斷擴展,適用物件導向的概念。
對效能要求很高的系統軟體,基本上都是利用 C 語言寫的,例如作業系統、驅動程式、嵌入式軟體及網路設備等。
四、物件導向語言不等於物件導向程式設計
C 語言是純粹的程序導向的程式語言,但不代表用 C 語言撰寫程式就是程式導向程式設計,利用 C 語言一樣可以寫出物件導向的程式。
同理, Java 是純粹的物件導向程式語言,但也可以用 Java 寫出程式導向的程式。
程序導向和物件導向都是一種思維方式,它是一種思考問題的方法,和具體的語言沒有必然的關係。
舉例來說,在 Java 中寫程式導向的程式碼,最簡單的方式是撰寫一個大類別,內含很多方法,然後在 main 函式裡面按照程式導向的方式呼叫即可。
五、重點摘要
- 程序導向是一種「機械的思維」。
- 物件導向是一種「人類的思維」。
- 物件導向適合解決軟體的「可擴充性」問題。
- 物件導向程式語言不等於物件導向程式設計。