問題
最近重新配置代碼時(shí)發(fā)現(xiàn),在特殊情況下,組件的破壞界面由于程序的異常而無法調(diào)用。這不是什么大問題(整個(gè)程序不正常,進(jìn)程退出是即將發(fā)生的事),但對(duì)于有一點(diǎn)完美主義的我來說,這確實(shí)降低了程序的異常安全性。(阿爾伯特愛因斯坦,《美國(guó)電視劇》,節(jié)目、節(jié)目、節(jié)目、節(jié)目、節(jié)目、節(jié)目、節(jié)目、節(jié)目)
解決方法
我們先來看下面一張圖,它描述了程序改造之前的交互場(chǎng)景:
在上圖中,我們?cè)贑WinApp對(duì)象的InitInstance中調(diào)用了組件的Init接口初始化組件,然后,如果程序正常退出,CWinApp對(duì)象的ExitInstance會(huì)被調(diào)用,我們?cè)谠摲椒ㄖ姓{(diào)用組件銷毀接口Exit,這樣的成對(duì)調(diào)用方式,確保組件內(nèi)部資源的正常初始化和釋放。
但是,如果因?yàn)槌绦虻腂ug,導(dǎo)致正常的程序流沒有走到ExitInstance,則組件的Exit接口不會(huì)得到調(diào)用,從而發(fā)生資源泄漏。
將程序進(jìn)行一點(diǎn)改造,如下圖所示:
工作原理
在上圖的改造中,我們將組件的初始化和銷毀接口的調(diào)用封裝到一個(gè)全局對(duì)象的構(gòu)造和析構(gòu)方法中,實(shí)現(xiàn)組件在程序?qū)嵗龁?dòng)時(shí)的自動(dòng)調(diào)用。對(duì)象的構(gòu)造析構(gòu)機(jī)制,也確保了組件的銷毀接口會(huì)得到正常調(diào)用。
另外這樣做的好處是,你不用擔(dān)心程序的其他部分使用組件功能時(shí),組件還沒有初始化,因?yàn)槲覀兊腃omponentLauncher全局對(duì)象,就像CWinApp全局對(duì)象一樣,它的構(gòu)造函數(shù)將早于程序的main入口點(diǎn),所以,我們確保了組件的初始化調(diào)用。
對(duì)于組件銷毀,也是一樣。程序的其他代碼在接近程序退出的時(shí)間點(diǎn)的時(shí)候,依然可能會(huì)調(diào)用組件的業(yè)務(wù)功能,這個(gè)時(shí)候,你也無需擔(dān)心組件被過早的銷毀了,因?yàn)槿謱?duì)象的析構(gòu)位于程序的main入口點(diǎn)之后。
總結(jié)
1) 使用這個(gè)方法,我們需要定義一個(gè)簡(jiǎn)單的ComponentLauncher對(duì)象,其構(gòu)造函數(shù)調(diào)用組件初始化接口,析構(gòu)函數(shù)調(diào)用組件的銷毀接口。實(shí)現(xiàn)自動(dòng)化的成對(duì)調(diào)用。
2) 需要定義一個(gè)全局ComponentLauncher對(duì)象,就像CWinApp對(duì)象一樣。
3) 這個(gè)方法的缺點(diǎn):如果組件是一個(gè)大型工程,其初始化或銷毀過程十分耗時(shí),則從用戶體驗(yàn)上來說:這個(gè)程序啟動(dòng)或退出比較慢。這個(gè)就需要開發(fā)者對(duì)程序健壯性和用戶體驗(yàn)進(jìn)行權(quán)衡了。
我的建議是:用戶喜愛的程序,才是一個(gè)好程序。
1.《如何初始化接口?總結(jié)很全面速看!小技巧:使用對(duì)象機(jī)制實(shí)現(xiàn)組件初始化及銷毀》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請(qǐng)聯(lián)系頁腳下方聯(lián)系方式。
2.《如何初始化接口?總結(jié)很全面速看!小技巧:使用對(duì)象機(jī)制實(shí)現(xiàn)組件初始化及銷毀》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來源地址,http://f99ss.com/gl/2107080.html