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