淺談面向對象編程相對於面向過程編程的優勢

最近在設計一個項目的二期方案。相對於一期過程驅動的實現,二期則更加模糊了過程的邊界,需要通過分析業務的當前狀態和歷史狀態去推理上下文,雖然硬件上相對簡單了,但對於軟件邏輯來說,卻提出了更多挑戰。所以原來偏重於面向過程風格的實現方法顯得有點力不從心,是時候“面向對象”了,呵呵。

我們知道,現有的編程範式主要是:面向過程編程、面向對象編程、函數式編程(也有的書上將面向過程編程用結構化編程替代)。函數式編程目前使用的比較少,此處擱置不表。

面向過程編程以過程(可理解爲方法、函數、操作)作爲組織代碼的基本單元,以數據(可以理解爲成員變量、屬性)與方法相分離爲最主要的特點。面向過程風格是一種流程化的編程風格,通過拼接一組順序執行的方法來操作數據完成某一個業務。

面向對象編程以類或對象爲組織代碼的基本單元,並具備封裝、抽象、集成、多態四個特性,作爲代碼設計和實現的基石。面向對象編程語言是支持類或對象的語法機制,能方便地實現面向對象編程的四大特性。

面向對象風格編程和麪向過程風格編程的明顯區別就是組織代碼的方式不同。面向過程風格的代碼一般被組織成一組數據結構及其方法集合,數據和方法互相分開;而面向對象風格的代碼,則被組織成一組類(Class),同一個類的方法和數據被綁定在一起,定義在同一個數據結構(類)中。

那麼,面向對象編程,相對於面向過程編程,有哪些優勢呢?

1. 面向對象編程更適合大規模複雜程序的開發

對於流程清晰的簡單程序,一般只有一條流程主線,很容易被劃分成順序執行的幾個步驟,面向對象編程和麪向過程編程沒有太大差別,並且面向過程編程常常比面向對象編程更加直觀高效。但當我們面對一個大型的複雜程序,由於其錯綜複雜的流程和交互關係,很難將其簡單地拆分成一條主線串成的簡單步驟,而通常表現爲一個網狀關係結構。這個時候,面向過程編程的這種流程化和線性化的思維方式就會顯得比較吃力,而面向對象編程的優勢就比較明顯了。這是因爲,對於面向對象編程來說,我們首先要做的不是流程分解,而是爲業務建模。我們需要思考的是,如何將業務需求抽象成對象,並且爲不同的對象建立方法,如何設計不同對象之間的聯繫。設計好對象(類)之後,我們就可以將不同的類按照關係和流程組裝起來,形成整個程序。這種思維模式,讓我們在面對複雜問題的時候,能夠更清晰地分解問題並創建模型,相應地,也提供了一種更爲清晰和模塊化的代碼組織方式。

2. 面向對象編程風格的代碼更容易複用、擴展和維護

爲什麼這麼說?這是因爲面向對象編程提供的封裝、抽象、繼承和多態這些特性,能夠更容易地幫我們寫出易於複用、擴展和維護的代碼。

首先來看封裝特性。由於面向對象編程將數據和方法綁定在同一個類中,並提供了訪問權限控制,外部調用者只能通過類暴露出的有限方法去訪問某些數據,而不會向面向過程編程那樣,數據可以被任意方法隨意修改,因此,相比於面向過程編程,面向對象編程有更好的代碼易維護性。

其次是抽象特性。不抽象,無對象。抽象是一種對現實世界的提煉,它將現實對象映射成系統對象,抽象的內容包含數據、屬性和行爲。一個好的抽象,可以讓我們形成更好的軟件結構和代碼風格,使得我們的代碼更容易理解,也更易維護。

其次,看看繼承特性爲我們帶來了什麼。繼承和多態,是面向對象編程相比於面向過程編程所特有的兩個特性。由於可以將不同類的相同屬性和方法抽取到父類中,讓子類繼承父類的方法,也可以重用父類的代碼,從而提高了代碼的可複用性。

最後,來看一下多態特性。多態特性允許我們在修改或添加某個功能的時候,可以定義一個新的子類,在子類中重寫父類的方法和功能邏輯,並在具體的應用中用子類替代父類,而不是所有新的需求都需要重寫原有的代碼和功能邏輯。這種設計方式遵從了軟件設計的開閉原則(OCP),能夠極大地提高代碼的可擴展性。

3. 面向對象編程語言更高級、更人性化

瞭解編程語言發展歷史的同學肯定知道,編程語言一直是向着更接近自然語言的方向發展。從最開始的二進制指令、彙編語言到面向過程的編程語言,再到如今的面向對象編程語言,編程思維和編程套路也從最初的機器思維方式逐步過渡到接近於人類的思維方式。在機器思維方式下,程序員需要針對某項任務設計一組指令,讓機器逐一執行這組指令去操作某些地址下的數據,從而完成某項計算任務;而高級語言讓我們從指令設計中解放出來,以傾向於人類大腦的思維方式,將注意力聚焦到如何爲業務建模,將真實世界映射爲對象,從而能夠實現更大規模和更加複雜的程序。

說了這麼多面向對象編程的好處,那在開發過程中,爲什麼工程師們更容易寫出面向過程風格的代碼呢?是否面向過程編程就徹底被淘汰了呢?

由於人類的思考慣性,已經習慣了用流程化和線性化的思維方式去解決問題。在面對一個任務的時候,我們往往想的是如何把它分解成一系列可執行的簡單步驟,然後再按照步驟去一一執行並完成任務。這種思維方式與面向過程編程的思維方式不謀而合,通常也是工程師在工作早期的直線思維的結果。而面向對象編程是一種自底向上的思考方式,首先關注的不是步驟,而是爲任務建立模型,將任務分解成一個個獨立的模塊(類),並設計類之間的交互,最後再按照流程和關係將類組裝起來實現整個任務。這種思維方式並不是很符合人類的思維習慣。由於有一點“反人類”的特性,面向對象的思維方式比面向過程的思維方式顯得更難,需要工程師的經驗和技巧來支撐。所以經驗欠缺的工程師往往更容易選擇相對容易的面向過程編程風格。

但也並不是說,所有的編程都要採用面向對象的方法。在實際使用中,我們只要根據業務類型和程序規模,選擇合適的編程風格即可。並且,面向對象和麪向過程也不是非黑即白非此即彼的,常常在面向對象編程語言開發的軟件中,也會寫出面向過程風格的代碼;而面向過程的編程語言,也能夠組織出面向對象風格的代碼。不管哪種語言,哪種風格,我們最終的目的都是要寫出易讀、易維護、易複用和易擴展的高質量代碼。

發佈了56 篇原創文章 · 獲贊 56 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章