Delphi 中物件導向程式設計之我見 (轉)

worldblog發表於2007-12-06
Delphi 中物件導向程式設計之我見 (轉)[@more@]


中面向之我見

  物件導向的程式設計技術提出來也有些年頭了,開發大型的時候採用物件導向的程式設計技術可以縮短的開發週期,提高程式的可讀性,易性,同時也就相應的提高了程式的可維護性,而對大型軟體而言,可維護性是保證其生命力的一個極為重要的指標。
  不知大家注意到沒有,視覺化程度很高的程式語言在採用物件導向的程式設計技術上很難處理。例如 VB,4.0基本不支援物件導向的程式設計,5.0 好一些,但也只敢說在物件導向的程式設計上 5.0 比 4.0 好得多,而不敢說 5.0 支援完全的物件導向的程式設計(6.0 我沒用過,不知道,如果能支援,也是 愛好者的福音了)。這大概就是人們常說的不用 VB 做大型程式的重要原因之一吧。 我不知 Delphi 是從什麼版本開始提供物件導向程式設計支援的,但我從 VB 5.0 轉到 Delphi 4.0,除了專案要求外,這是最重要的原因了。
  由於 Delphi 除了支援物件導向的程式設計外,也支援一般的程式導向的程式設計,而且因為其視覺化技術的運用,很多人(包括我)很容易就偏離了物件導向的方向,實際上,我覺得要實現物件導向的程式設計也不難,因為 Delphi 給你的全都是物件,你只要在程式設計的時候注意自己的程式碼就是了。下面是我對在 Delphi 中採用物件導向技術的一些體會:

1.不要用全域性變數
  即使要用,也要用全域性物件來代替它。習慣了程式導向程式設計的程式設計師在這點上很容易犯錯,而且這一點相對來說也比較難掌握。實際上,全域性變數也是程式導向程式設計技術的一個很大的缺陷,難跟蹤,難除錯,也就難維護。
  為什麼要用物件而不是變數呢?物件可以封裝對變數的操作,任何對該變數的操作都必須透過物件的方法來完成,我們可以在操作該變數的方法中設定斷點來除錯,這就解決了前面所提到的 3 個難點(難跟蹤、難除錯、難維護)。
  舉個常見的例子(也許並不能最大限度的反映這個問題):讓你做一個 IE,對於 Inte Option,你打算怎樣處理?
  根據以上的討論,我的想法是寫一個 TDefaultINI 類,這個類負責 Option 中各項設定的儲存,讀取。Option window 和別的需要操作其中設定的物件都透過這個類來進行處理。這樣就實現了資料的封裝。你可以定義一個 TDefaultINI 類的例項作為全域性物件,當然,因為這些設定是儲存在器中可以隨時讀取的,你也可以只在需要的時候建立一個 Tdefault 物件來完成你的功能。

2.物件之間資料,儘可能的使用屬性而不是變數
  為什麼要用屬性而不是變數呢?對資料的操作可以透過屬性的方法進行封裝,一旦以後物件內部的資料結構發生了變化,只要我們提供的屬性介面不變,對程式別的部分的影響就能減小到最小。例如 Fo之間透過屬性來交換資料。以後因為某個原因你得將原來用陣列實現的東西改為用連結串列實現,只要你的屬性介面仍然是陣列,那對別的物件就幾乎沒有影響。

3.合理的安排物件的方法
  我直接舉例來說明這個問題,例如在連線的時候,你是在主 Form 中設定好 TdataModule 中 Tdatabase 的 AliasName 和 Params,然後用 DataModule.Database.Open 來連線呢,還是寫一個 TdataModule.ConnectToDatabase 方法,將 AliasName 和 Params 作為 TdataModule 的屬性,而在主 Form 中呼叫這個方法來連線呢?從理論上來講,兩種方法都是物件導向的。也許很多人不能體會到後一種方法的優越性,想象一下如果資料庫發生了變化,以前只有 SERVER,現在還需考慮 。後一種方法將會使你的應對輕鬆的多,尤其是你在主 Form 中有好幾處地方需要連線資料庫的時候。

4.合理的安排你的物件
  一個問題該有幾個物件來解決,每個物件實現什麼功能,它們之間是什麼聯絡?這個問題是物件導向程式設計的永恆的問題,Delphi 中這個問題怎麼處理呢?在此我就和 Form 有關的問題和大家討論一下吧,先舉一個例子:寫一個將 中的收藏夾匯入到資料庫中的程式,該怎麼安排你的物件?這個問題並不複雜,一個 Form 就能解決問題了,也許為了資料庫管理比較方便,再加上一個 DataModule,Form 負責讀入收藏夾,將之顯示在 TreeView 中,可以選擇 TreeView 的節點(即收藏夾)匯入資料庫。也許你的程式剛做好,老闆又要求對 的 BookMark 也完成同樣的功能,怎麼樣,你的改動量有多大?如果你以前使用的是兩個物件來完成上面討論的一個 Form 的功能,一個物件負責將收藏夾的資料匯入到 TreeView 中,而 Form 只完成對 TreeView 的操作,你就會發現你的改動是很輕鬆的。由此我的建議是 Form 只完成對介面的操作,對於具體的資料結構,由我們自己寫的物件去完成。

5.不要在兩個同級的子 Form 之間交換資料
  在 Delphi 中很容易犯這個錯誤,這樣做是很危險的,因為很有可能你認為存在的 Form 被關閉了或者乾脆就沒有開啟過,而且這樣做最大的壞處是程式晦澀難懂。解決的辦法之一是可以透過它們的父 Form來交換資料,例如父 Form 中取得 A子 Form 的屬性值,根據這些值來設定 B 子 Form 的屬性值。
  物件導向的程式設計技術絕不只是應用在大型軟體的開發上,實際上,小型程式採用面嚮物件的技術開發對於今後的擴充套件和移植(即是隻是部分功能的移植)是很有幫助的。希望我的這篇文章能起到一個拋磚引玉的作用,歡迎大家和我討論,我的 e :l940801@.com。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988803/,如需轉載,請註明出處,否則將追究法律責任。

相關文章