项目重构方案设计
最近接手到一個(gè)已經(jīng)成型的項(xiàng)目,然后我們的任務(wù)就是對(duì)它進(jìn)行重構(gòu),這個(gè)項(xiàng)目是一個(gè)功能很齊全的WPF視頻播放器(附帶很多其他功能),在仔細(xì) 研究了項(xiàng)目的背景和架構(gòu)以后,初步做出了一下的重構(gòu)方案: 目前現(xiàn)狀: 雖然整個(gè)系統(tǒng)做得很漂亮,代碼也寫得不錯(cuò),但仍有以下不足: 1, 架構(gòu)有待改善。雖然看似MVC架構(gòu),卻沒有遵循MVC的模式,里面邏輯和UI耦合很高,沒有清晰的規(guī)律。 2, 沒有充分用到WPF的特性。WPF除了給我們很多炫麗的效果外,還給我們提供了諸如 Binding,command等特性,這些特性可以幫我們隔開耦合,同時(shí)減少代碼量。 3, 代碼和文件沒有組織。代碼、dll、樣式文件和資源文件等沒有統(tǒng)一的組織,到處都有,這樣看起來(lái)就會(huì)很混亂。 4, 沒有建立公用代碼庫(kù)。沒有把公用的代碼庫(kù)獨(dú)立出來(lái),很多地方都是另外在寫,這樣既增加了代碼量,同時(shí)維護(hù)和重構(gòu)也帶來(lái)了麻 煩。 5, 邏輯處理不應(yīng)暴露在Client端。項(xiàng)目是一個(gè)C/S架構(gòu)的系統(tǒng),沒有必要把所有的邏輯都暴露在Client 端,應(yīng)該用分布式把Logic放在服務(wù)器端,這樣可以更安全同時(shí)使客戶端變小。 6, 沒有單元測(cè)試。這樣一個(gè)龐大的程序,沒有單元測(cè)試是非常危險(xiǎn)的,我們不可能做到100%的覆蓋率,但是我們可以對(duì)主要的邏輯 和Function做單元測(cè)試,這樣既減少了測(cè)試人員的工作量同時(shí)整個(gè)系統(tǒng)的安全、穩(wěn)定和可維護(hù)性得到了大大的提高。 7, 性能不夠優(yōu)化。啟動(dòng)項(xiàng)目,通過(guò)WPF性能工具Perforator和Visual Profiler分析得出,程序啟動(dòng)和界面操作都導(dǎo)致CPU很高,內(nèi)存也消耗比較多。 解決方案 1, 針對(duì)缺陷1的“架構(gòu)問(wèn)題”。做法是采用MVP或者M(jìn)VVM模式,目前正在對(duì)比和考慮。 2, 針對(duì)缺陷2的“WPF特性”。做法是充分利用Binding,command等特性。 3, 針對(duì)缺陷3的“代碼和文件沒有組織”。做法是建立一些單獨(dú)的工程或者文件來(lái)分類和組織這些代碼,并且充分隔離 耦合。 4, 針對(duì)缺陷4的“沒有建立公用代碼庫(kù)”。做法是把一些公用的代碼和常用的代碼做成單獨(dú)的Dll,并且有完整的單 元測(cè)試,這樣才能提高效率。 5, 針對(duì)缺陷5的“邏輯處理不應(yīng)暴露在Client端”。做法是用WCF做為中間層,把業(yè)務(wù)邏輯全 部進(jìn)行封裝,通過(guò)WCF提供統(tǒng)一的接口供項(xiàng)目調(diào)用。 6, 針對(duì)缺陷6的“沒有單元測(cè)試”。做法是不管用MVP還是MVVM,我們起碼保證對(duì)邏輯組件的代碼有充分的單元 測(cè)試覆蓋,同時(shí)對(duì)一些公用的組件也要有單獨(dú)的單元測(cè)試代碼。 7, 針對(duì)缺陷7的“性能不夠優(yōu)化”。這個(gè)我會(huì)單獨(dú)做一個(gè)性能優(yōu)化列表出來(lái),針對(duì)耗資源的操作和其他有損害性能的操 作,我們應(yīng)該避免。 那么我們就可以結(jié)合實(shí)際情況搭建如下的結(jié)構(gòu) ? 因?yàn)槭褂昧薓VVM模式,所以UI結(jié)構(gòu)圖就做如下調(diào)整 由于整個(gè)項(xiàng)目客戶部希望我們引用第三方的組件或者工具,所以很多功能都只能通過(guò)企業(yè)庫(kù)實(shí)現(xiàn),比如AOP和IOC,log和exception對(duì)項(xiàng) 目特征做了定制化,數(shù)據(jù)訪問(wèn)通過(guò)企業(yè)庫(kù)重寫實(shí)現(xiàn)局部ORM,對(duì)性能要求比較高的應(yīng)用仍然實(shí)現(xiàn)存儲(chǔ)過(guò)程。對(duì)所有事務(wù)操作都轉(zhuǎn)移到數(shù)據(jù)庫(kù),郵件使用JOB進(jìn)行 發(fā)送。大型數(shù)據(jù)和客戶要求較高的實(shí)時(shí)操作,用MSMQ和SSB相結(jié)合的方式。層次依賴關(guān)系 UI: 功能模塊使用時(shí)候,都會(huì)首先通過(guò)UI層次Security模塊的安全驗(yàn)證(驗(yàn)證是通過(guò)Components模塊里面的自定義 的用于頁(yè)面功能以及功能點(diǎn)驗(yàn)證的控件觸發(fā)), Security模塊會(huì)通過(guò)服務(wù)層獲取用戶身份數(shù)據(jù),用于頁(yè)面驗(yàn)證.功能模塊的實(shí)際功能實(shí)現(xiàn),如果需要數(shù)據(jù)庫(kù)支持,那么依然會(huì)通過(guò)服務(wù)層進(jìn)行數(shù)據(jù)操作.整個(gè)架構(gòu)基于MVVM模式。Service:通過(guò)WCF做中間服務(wù),使應(yīng)用隔離開來(lái),這樣有利于擴(kuò)展和維護(hù),同事提高了整個(gè)應(yīng)用程序的伸縮性。Business Logic: 服務(wù)層內(nèi)部之間的組合關(guān)系,主要體現(xiàn)再依賴和調(diào)用,由上往下調(diào)用,逐級(jí)依賴,最后Service底層邊界Data Access模塊將調(diào)用Framework中的Data模塊,Data模塊將調(diào)用MS.EntLib3中的Data,向數(shù)據(jù)服務(wù)器發(fā)送數(shù)據(jù)操作命令和數(shù) 據(jù).Framework: 該層次提供許多基礎(chǔ)的功能模塊(七大塊),分別提供給UI,Service層里面的模塊直接或者間接的調(diào)用,同時(shí)也可以看到Framework層次內(nèi)部各 模塊之間再運(yùn)行時(shí)也有互相依賴調(diào)用的關(guān)系存在.該層次的部分模塊會(huì)依賴和調(diào)用Ms.EntLib3中的模塊,一般是按照兩個(gè)層次里面的模塊名稱,產(chǎn)生關(guān)系 的.MS.EntLib3: 該層次的各個(gè)模塊是整個(gè)系統(tǒng)框架中最底層的,只會(huì)在運(yùn)行時(shí)被更高層次的模塊依賴和調(diào)用,同時(shí)該層次內(nèi)部各個(gè)模塊之間也存在依賴和運(yùn)行時(shí)調(diào)用關(guān)系.整個(gè)架構(gòu)采用迭代的方式進(jìn)行開發(fā),這樣方便客戶進(jìn)行實(shí)時(shí)反饋,由于現(xiàn)在還沒有開始,所以有很多時(shí)間進(jìn)行準(zhǔn)備,如果園子里有這方面經(jīng)驗(yàn)的朋友,也 可以暢所欲言,謝謝!
總結(jié)
- 上一篇: SI9000阻抗计算安装教程
- 下一篇: sqlserver查看被锁表、解锁