關於寫《面向過程和物件導向的編程》這個話題我很矛盾,我擔心許多程式員對此話題不太感興趣,可能他們不太懂得面向過程和物件導向編程的巨大差距,以及對編程水平的影響。
在我整個編程生涯中,有無數的轉變和變化讓我銘記在心。從彙編到C語言,從檔案系統到資料庫,從C語言倒Dbase,從C/S倒B/S,從程式語言倒開發平台等等。但是,讓我感覺最大的、最根本的轉變是從C語言轉學C++。可以說這是一個革命性的轉變。在當時我對C語言的運用已經如日中天,得心應手,感到只要用C語言就能完成所有應用程式的開發。但是,學了C++之後,我才恍然大悟,程式還可以用另外一種思維編寫。這個轉變過程極其痛苦,每個概念的接受都需要和C語言進行對比,都要不停地問這個是為什嗎?整整花了我幾乎半年時間,而且每分每秒讓你在不解,忽然懂了,忽然不懂中度過。我學習一種語言,主要是學習這個語言的構架和基本原理,也就是說要研究這個語言的由來和特點。又經過若干年後,我才真正意識到物件導向編程的重要意義。它絕對是程式員思維方式的變革和升華,它使得程式員可以從具體編程,提升到抽象的結構。使得程式員可以編寫更加通用的類,進而編寫通用的軟體產品。
人們從小就學習1、2、3、4,頭腦裡排滿了次序!絕大數人都是按照次序思維的。這種次序就是一種過程。例如先做什麼,後做什麼。做得比較好的,表現做事有條理,做事很有邏輯性。做得不好的,則把過程做得歪歪扭扭最後也能達到預期的結果。同樣,絕大多數程式員都是按照面向過程思維方式去編程的。儘管他們用了物件導向的程式設計語言,學了對象、學了類,用了類,但是他們仍然用面向過程的方式編程。
一、面向過程編程
面向過程編程體現了程式員的邏輯性,許多程式員的水平就體現在這裡。如何設計語句的次序,如何組織函數、如何設計函數的參數、如何設計過程分支等等都體現了程式員的邏輯能力。例如,我們編寫儲存學生資訊功能:
1) 空值處理
我們首先要判斷學生資訊項是否有空值,如必輸項為空白,則給出提示。例如,學生姓名為空白!
2) 合法性檢查
然後,我們還要對各資訊項的有效性進行判別,如果有無效資訊提示重新輸入。例如,如學生的出生日期不符合日期格式!
3) 產生學生ID
可以給出自然數,也可以給出有意義的編碼!但是ID必須是唯一的!如不唯一則進行相應的處理。
4) 開啟資料庫
建立資料庫連接,擷取資料庫控制代碼。
5) 組織_insert語句
將操作者輸入的學生資訊,拼成一句insert語句!(實現這個功能有很多種方法)
6) 提交資料庫運行
將insert語句提交給資料庫。
7) 操作日記
將以上操作資訊寫入日記。
8) 提示寫入成功
提示“儲存成功!”向操作者提示操作成功!
這些是我很隨意給出的儲存學生資訊的過程。當然,不同的程式員可能會寫出不同的過程,但是最終的結果是,學生資訊儲存到資料庫中。
處理的內容越多,不同程式員處理邏輯越是不同。可謂五花八門,而正是這些不同,體現了程式員的水平。
但是,這種面向過程的編程的程式只能用於具體的系統,卻不能用於其它系統。例如,以上的程式只能用於學生資訊處理常式。
二、物件導向編程
物件導向編程體現了程式員的抽象能力,其本質是把一個事物或多個事物看作一個抽象的對象。還是舉例,儲存學生資訊功能。
1) 我們可以把儲存學生資訊功能看成一個對象(這裡僅是舉例,不一定合理。)
注意我們這裡先不要管面向過程中的那些處理流程,僅僅把它當作一個對象,一個空集。
2) 我們為這個對象設計設計屬性
例如,輸入資訊、資料庫連接串、資料表名、日記表名等!
3) 我們為這個對象設計事件。
處理
4) 我們編寫這個類。
5) 我們在儲存功能的命令按鈕裡調用這個類
用物件導向編程思想與面向過程編程是不同的,它把學生資訊抽象成輸入資訊,把學生資訊表抽象成資料表。基本上於我們所要編寫的具體學生資訊無關。這種抽象使得編寫的類,有可能用於學生資訊處理、客戶資訊處理、員工資訊處理、人口資訊處理中的資訊儲存功能。。。
我並不是說面向過程不好,因為,絕大多數程式是面向過程的,許多程式員面向過程的邏輯效能力還有待提高,因此,程式員還需要從基礎做起,提高面向過程編程的水平;以我的經驗和體會,能夠把面向過程的程式編好也不是很容易的事!新手首先要學會面向過程編程,有經驗的程式員要提高面向過程的編程的水平。而系統的結構、模組的結構、功能的結構、函數的結構、控制項的結構都應該用物件導向的思維進行設計。但是總體上來說,從面向過程編程到物件導向編程是個思維方式提升的過程,作為程式員應該對此有一個清醒的認識,而這一點正是優秀程式員必需具備的條件之一。當一個程式員能從具體的程式抽象出對象,並能把這個對象用於其它程式,則這個程式員完成了技術水平的蛻變,躋身於優秀程式員行列了。