Delphi中的對象編程

幾次參加面試的過程中,我對應聘的Delphi程序員均問了以下問題:”Pascal是第三代面向過程的編程語言,但從八十年代就轉爲面向對象了,你對Delphi目前的面向對象支持有什麼樣的看法?”.
我相信很多資深的Delphi設計師者閱讀了大量的Borland公司書寫的Delphi源碼.這些源碼是這些設計師們的良師益友.我也看了很多程序員用Delphi書寫的代碼.他們寫的代碼與大學時教我Basic課程的老師給出例子代碼差不多,一大堆的全局變量,一大堆的通用函數.我計算了調用這些函數的次數,80%的函數只調用了一次,也即這些所謂的通用函數並不是作者設計時想像的那樣通用.
這種編程思維本身還停留在70年代的面向過程編程.或許這也與Delphi的框架有一定的原因吧.你每次創建一個窗體時,單元文件裏會自動創建一個窗體類的全局變量(也即實體對象),這其實是一個很差勁的實現,雖然它的實現目的我認爲很簡單也很實用:你不需要編程就可以運行一個帶有一個窗體的程序,該窗體設爲主窗體,Program文件中會創建該實例.
面向對象編程的概念應該在專業編程課程中有較爲詳細的講解了.如果你想在不知不覺中感受面向對象編程到底是什麼?建議去用用smallTalk或Java.這兩種語言是完全運用面向對象思想的.
有很多高手都談了在Delphi中運用面向對象技術來提升開發效率.我在這裏想談談我運用面向對象編程的觀念使用Delphi編寫代碼所帶來的感受:
1.我不喜歡定義一大堆的變量:取而代之的是我定義一個類,把相關的變量定義爲該類的私有變量,然後將使用這些變量的過程或函數也搬到類裏去,將其變爲類的方法.我發覺我這樣做有很多好處,我不再需要定義一大堆的變量了,我只需要申明一個對象變量,在操作時我也不需要去小心處理這些變量之前的關係了,這些關係在類裏實現了;如果在其它地方有類似的實現,我再也不用像以前那樣複製代碼了.
複製代碼曾被我的一個同事作爲法寶,但他的程序實在是太難以維護了,以致於連他自己也總在說要重寫這些代碼.
當然還可以將這些代碼封裝成通用函數,過一段時間之後你可能會發現你在一個公用單元裏已經定義了成百上千個通用函數,你還記得他們嗎?他們是怎麼使用的?唉,要從成百上千個函數裏找出自己想要的函數來而且還要確定他們就是想要的函數還不如干脆寫一個算了.於是又多了一個通用函數.所以我有了以下的情緒:
2.我幾乎不寫通用函數,取而代之的是我將該函數放入到具體的類中去.如果你寫的是一些通用性很強的函數,比如API的聲明函數,好像沒有辦法去解決此類問題了吧.但我還是比較不喜歡,我只在公用單元裏聲明API函數,然後把該API函數引入到類中去,這樣我就不用去看微軟的那些看了後還是似懂非懂的文檔了.
3.重構?在Delphi中怎麼用?如果你遵循了上面的兩個原則,過一段時間之後,你會發現,噫,這個類怎麼這麼大?(MM都喜歡大......)把他弄小些吧.再看看<重構--改善既有代碼的設計>一書,上面好像有說怎麼做的哦.當然,還有一些規則,你可以試着去做做.我比較喜歡重構,因爲人的思想總是在前進嘛.從我用'一指禪'打出'a'到現在寫這篇狗屁不通的文章,對於軟件編程還是進步了很多.我相信很多人都還無法達到大師的水平,一出手就是高水平的(我特崇拜UNIX的創建者,在那時創建出來的操作系統到現在還稱爲是最先進/穩定的;雖然windows佔據了絕大多數終端,目前也在向高端進展,但從一開始的架構思想來說,是無法與Unix相比的).所以如<重構>一書的作者所說:我無法一開始就做正確的,因爲需求總在變化.所以我總可以對客戶懶懶地說:你要做什麼改動?說吧?超過20%一次收費XX元.嗯,XX元是不是太少了?那要看你的姿色了,我比較不自信,所以開價比較低.....
4.設計模式?我看了一遍<設計模式>,還不太懂,所以...還請看大師們的著作吧.
好像沒有說到對象編程哦?哦,對,有點偏題了.我口渴了,喝口水再說吧.
Delphi其實已經將Pascal語言改造成了面向對象編程的ObjectPascal語言;看看VCL Framework的源代碼,裏面運用的是面向對象編程技術,仔細問讀這些源代碼,慢慢地你就會領悟到面向對象編程的好處,如果能更進一步,你還能舉一返三,聯想到業務領域。不管是二層還是三層,或者是多層。不管是現在的中間件編程,面向服務編程,面向構件編程,其實都要基於面向對象編程。面向對象編程是最基本的思想,就像人的行走一樣。我無法想像不會走路的人是如何去跑、去跳的?不知道你能否想到?
其實我這個標題給得太大了,我只想談談自己對Delphi面向對象編程的一點感受。對於Delphi以及VCL Framework,我只能算作是入了門而己。

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