最近重構一套代碼,運用以下幾種方法,供參考。
1 公共方法盡可能的使用緩存
public static List<string> GetRegisteredCompany() { String sql = "SELECT CompanyCode FROM dbo.Company WHERE Suspended='N' ORDER BY CompanyCode"; DataTable table = SqlHelper.ExecuteDataset(BaseCommon.GetSystemConnectionStringBuilder().ConnectionString, sql).Tables[0]; return (from item in table.AsEnumerable() select item.Field<string>("CompanyCode")).ToList(); }
這個方法返回的值,可能會被多個地方用到。應該把這個方法的值緩存起來,供程序多次使用。
2 使用NArrange格式化代碼,這個工具,可以將代碼格式化,用region分隔開來。
NArrange 0.2.9.0
____________________________________________________________
Copyright (C) 2007-2009 James Nies and NArrange contributors.
All rights reserved.
http://www.NArrange.net
Zip functionality courtesy of ic#code (Mike Krueger, John Reilly).
經過格式化之后,如上圖所示,被分成幾個區域,看起來條理更清晰。
3 查找重復的代碼,提取到公共方法庫中。
關於查找程序中重復的代碼,有如下工具可以檢測重復的代碼
1) Simian http://www.harukizaemon.com/simian/
2) Team City http://www.jetbrains.com/teamcity/
3) Resharper plugin AgentRalph http://agentralphplugin.googlecode.com/
4) DevExpress CodeRush
5) Resharper Find Similar Code 查找相似的代碼
6) CCFinder
7) Duplo http://sourceforge.net/projects/duplo/
8) Visual Studio 2012
9) Clone Detective for Visual Studio http://www.codeplex.com/CloneDetectiveVS
10) Atomiq http://getatomiq.com
11) NDepend http://www.ndepend.com/
12) CloneDR http://www.semanticdesigns.com/Products/Clone
工具相當多,如果使用VS2012開發,已經內置此功能。
4 增加測試代碼,測試各種情況下公共代碼的功能是否正確。
[TestMethod] public void EmpLicenseTestMethod() { DateTime expired=new DateTime(2013,12,1); string licensee = "Administrator"; string company="Microsoft Corporation"; string license=GenerateLicense(expired, licensee, company); //保存許可文件 XmlDocument doc = new XmlDocument(); doc.LoadXml(license); SaveFileDialog dlg = new SaveFileDialog(); dlg.RestoreDirectory = true; dlg.Filter = "License file (*.lic)|*.lic|All files (*.*)|*.* "; if (dlg.ShowDialog() == DialogResult.OK) { doc.Save(dlg.FileName); } }
Visual Studio內置的Test工具與技術,再配合Resharper的工具,測試一個方法相當容易實現。
5 應用改善效率的代碼替換不合適的代碼,或是應用.NET框架的方法重寫自定義的方法。
效率改善代碼,如下舉例
1 不要用string ax=”” 判斷ax是否為空, ax.Length==0的效率高於ax==string.Emptyu 一般用as.IsNullorEmpty
2 對於不改變的變量,用常量代替
3 用Linq代替大量的foreach查詢
4 MyType t=(MyType) t和t as MyType的效率比較,后者效率好,而且轉換失敗后不會拋出異常
5 List<T> 代替Array ,Haset<T> ,Dictionary<K,V> 代替Hashtable
.NET的內置的方法,string.Join可以將字符串數組連接成由一個分隔符號連接的一個字符串。比如
例如,如果 separator 為“,”且 value 的元素為“apple”、“orange”、“grape”和“pear”,則 Join(separator, value) 返回“apple, orange, grape, pear”。
如果 separator 為 nullNothingnullptrnull 引用(在 Visual Basic 中為 Nothing),則改用空字符串 (Empty)。
這個方法,我們常常自己實現。應該改用.NET內置的方法。
6 使用並行技術改善系統效率
Parallel.ForEach可以充分利用多核的,提供系統性能。對於一些不需要考慮對數據的前后順序操作的地方,均可以用這個方法改善。比如刪除臨時文件。對於需要考慮操作順序的數據,比如清空數據表數據,要先清除子表,再刪除主表,否則會引起外鍵沖突。應當用lock鎖定要刪除的數據表,提取出數據后,再進行刪除。
7 使用Linq和Lambda表達式改善系統的寫法
對於只有幾行的方法,可以用Lambda來替代。如果方法很通用,可以寫成通用的方法。對DataTable的循環遍歷操作,首選Linq技術,可減少出錯的機率,也使代碼簡化。
8 字符串操作
簡單的操作不改變,復雜的匹配與查找改用正則表達式,同時要考慮Encoding的問題。
9 公共方法的提取與擴展方法
static類型的公共方法如果過多,因為GC無法回收內存,會影響系統的效率。可以考慮用擴展方法替代,編譯時直接被替換為原始類型的靜態方法調用。一般添加擴展方法的類型為.NET系統類型,自定義的類型添加擴展方法很少。
10 盡量多的給方法注釋
使用vsDocman工具,盡可能的為公共方法書寫注釋,添加用例