您現在的位置是:首頁 > 動作武俠首頁動作武俠

小技巧:使用物件機制實現元件初始化及銷燬

簡介解決方法我們先來看下面一張圖,它描述了程式改造之前的互動場景:在上圖中,我們在CWinApp物件的InitInstance中呼叫了元件的Init介面初始化元件,然後,如果程式正常退出,CWinApp物件的ExitInstance會被呼叫,我

初始化技能怎麼用

問題

最近在對一份程式碼進行重構的時候,發現在特殊情況下,元件的銷燬介面會因為程式的異常而得不到呼叫,這個雖然不是什麼大問題(整個程式都出現異常了,程序退出是即將發生的事情),但是對於有點完美主義的我來說,這個的的確確的,降低了程式的異常安全性。

解決方法

我們先來看下面一張圖,它描述了程式改造之前的互動場景:

小技巧:使用物件機制實現元件初始化及銷燬

在上圖中,我們在CWinApp物件的InitInstance中呼叫了元件的Init介面初始化元件,然後,如果程式正常退出,CWinApp物件的ExitInstance會被呼叫,我們在該方法中呼叫元件銷燬介面Exit,這樣的成對呼叫方式,確保元件內部資源的正常初始化和釋放。

但是,如果因為程式的Bug,導致正常的程式流沒有走到ExitInstance,則元件的Exit介面不會得到呼叫,從而發生資源洩漏。

將程式進行一點改造,如下圖所示:

小技巧:使用物件機制實現元件初始化及銷燬

工作原理

在上圖的改造中,我們將元件的初始化和銷燬介面的呼叫封裝到一個全域性物件的構造和析構方法中,實現元件在程式例項啟動時的自動呼叫。物件的構造析構機制,也確保了元件的銷燬介面會得到正常呼叫。

另外這樣做的好處是,你不用擔心程式的其他部分使用元件功能時,元件還沒有初始化,因為我們的ComponentLauncher全域性物件,就像CWinApp全域性物件一樣,它的建構函式將早於程式的main入口點,所以,我們確保了元件的初始化呼叫。

對於元件銷燬,也是一樣。程式的其他程式碼在接近程式退出的時間點的時候,依然可能會呼叫元件的業務功能,這個時候,你也無需擔心元件被過早的銷燬了,因為全域性物件的析構位於程式的main入口點之後。

總結

1) 使用這個方法,我們需要定義一個簡單的ComponentLauncher物件,其建構函式呼叫元件初始化介面,解構函式呼叫元件的銷燬介面。實現自動化的成對呼叫。

2) 需要定義一個全域性ComponentLauncher物件,就像CWinApp物件一樣。

3) 這個方法的缺點:如果元件是一個大型工程,其初始化或銷燬過程十分耗時,則從使用者體驗上來說:這個程式啟動或退出比較慢。這個就需要開發者對程式健壯性和使用者體驗進行權衡了。

我的建議是:使用者喜愛的程式,才是一個好程式。

Top