對象 物件導向軟體開發的十大原則 (轉一)
對於開發人員來說,時時回過頭來檢查一下應用程式是非常有用的。考慮一下這個應用程式是否達到了預期目的?是否遵循了最佳方案?要想實現目的是否還存在更好的方法?溫故而知新,也許你會從回顧中發現新的思路。
本文就提出10種頂尖的物件導向的編程技術來協助你對應用程式進行評價,希望你使用這10個頂尖技術從物件導向的編程中獲得最大利益。
1. 重新審視對象的聲明操作
如何聲明物件變數會給對象的使用和效能帶來重大的影響。你應該使用這個文法:
Private m_oCust As Ccustomer
注意一定要使用正確的範圍。在大多數情況下,你希望物件變數是私人的。如果只是在一個特定的程式中需要這個對象,就可以用Dim來聲明它是屬於那個程式私人的。如果在整個類或表單模組中都需要它的話,就應該用Private 在那個類或表單的頂部聲明它。按照習慣,在模組層聲明的變數要加一個首碼 "m_",以表示用於模組層或成員變數。如果需要從類外部使用物件變數,就不要將變數設成Public,寧可定義一個Property Get程式來使用物件變數,這樣就防止了其它代碼不用你不希望的方法去使用變數。
在聲明中,總是使用類名稱,而不要使用 "As Object",因為使用 "As Object" 會使物件變數成為後期捆綁(late-bound)。這就意味著在已耗用時間之前,Visual Basic不知道你將使用的物件類型,因此它不能給你提供自動列表成分(對象屬性和方法的下拉式清單)。更重要的是,在運行時會對早期捆綁(early-bound)對象造成明顯的效能衝擊。
最後,在聲明中不要使用"New"這個關鍵字。使用關鍵字"New"時,將在引用它的任何時間自動建立對象,這對效能會造成輕微的影響,因為每個對象的屬性和方法調用都必須進行校正以確定對象是否被建立了。使用"New"這個關鍵字還會給調試帶來噩夢,因為在對象被破壞之後,如果你不經意地再次引用它的話,應用程式會自動地重新建立對象。當你準備移植到.NET時,理解這一點更加重要,因為在那裡關鍵字"New"有一個不同的意義。在.NET中,關鍵字"New"允許你在聲明時建立一個對象,比如下面這條語句將建立一個新的Customer對象:
Private mo_Cust as New CCustomer()
2. 重視對象清除行為
當不再需要物件變數時,一定要釋放它們,然後VB就會破壞與變數相聯絡的對象,從而釋放應用程式中的記憶體。使用下面的代碼釋放一個對象:
Set x = Nothing
3. 封裝的重大作用
Encapsulate(封裝)從字面上講就是放入封套或"放在一個殼子中"。從物件導向編程 (OOP) 的角度來看,這意味著將所有與一個對象相關的資料和處理都放在它的類中。
封裝有時候指的是資訊隱藏,因為你將對象的資料藏在了類的內部。如果其它的類需要使用資料,可以使用屬性程式(.NET 中的屬性聲明)來暴露這些資料。這個行為為類提供了控制, 它控制使用者可以如何觀看或重新整理資料,並且防止其它對象誤用資料。
封裝使得對象之間的互動作用變得簡單化。一個對象不用知道另一個對象的全部資料或者其資料是如何管理的,就能夠使用這個對象。例如,一個Customer對象可能有名字和地址屬性以及電話號碼、信用曆史和其它相關域。如果一個Invoice 對象想要使用一個 Customer 對象,它可以為發票請求名字和地址,而不需要知道Customer是從哪裡擷取那個資料的,或者其它資料元素是什麼。
對於如何為可擴充的標記語言(XML)將文件物件模型 (DOM) 封裝在一個封裝類中的解決方案,請參考此文,這使你能夠更容易地與一個XML檔案進行互動作用,而不需要知道DOM的細節。
4. 狀態監視問題
良好的基於組件的開發技術會頻繁地要求無狀態的對象。無狀態對象沒有保持的屬性,只有方法。你可以訪問一個無狀態的組件,執行方法,然後不需要擷取方法調用間的任何資料就可以完成處理。
有一些OOP方面的文章提出沒有屬性的對象就不是對象。 但是我們現在忽略這個語義上的問題,你可以建立有方法而沒有屬性的類。當你從事COM+或Web開發時,經常會需要這樣做。一個ASP頁面可以在一個組件上執行一個方法來完成一個特殊的處理,然後再釋放組件,不用為管理對象狀態而費心。
5. 傳遞參數的可擴充性
參數提供了類的方法之間傳遞資訊的途徑。你需要用參數向方法傳遞任何必要的資料,特別是當你需要無狀態對象的時候。
例如,無狀態對象Customer 的PlaceOrder方法要求把客戶的資訊作為參數傳遞給它,然後PlaceOrder方法就用這個資訊來完成必要的處理。