最近重構一套代碼,運用以下幾種方法,供參考。
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),則改用Null 字元串 (Empty)。
這個方法,我們常常自己實現。應該改用.NET內建的方法。
6 使用並行技術改善系統效率
Parallel.ForEach可以充分利用多核的,提供系統效能。對於一些不需要考慮對資料的前後順序操作的地方,均可以用這個方法改善。比如刪除臨時檔案。對於需要考慮操作順序的資料,比如清空資料表資料,要先清除子表,再刪除主表,否則會引起外鍵衝突。應當用lock鎖定要刪除的資料表,提取出資料後,再進行刪除。
7 使用Linq和Lambda運算式改善系統的寫法
對於只有幾行的方法,可以用Lambda來替代。如果方法很通用,可以寫成通用的方法。對DataTable的迴圈遍曆操作,首選Linq技術,可減少出錯的機率,也使代碼簡化。
8 字串操作
簡單的操作不改變,複雜的匹配與尋找改用Regex,同時要考慮Encoding的問題。
9 公用方法的提取與擴充方法
static類型的公用方法如果過多,因為GC無法回收記憶體,會影響系統的效率。可以考慮用擴充方法替代,編譯時間直接被替換為原始類型的靜態方法調用。一般添加擴充方法的類型為.NET系統類別型,自訂的類型添加擴充方法很少。
10 盡量多的給方法注釋
使用vsDocman工具,儘可能的為公用方法書寫注釋,添加用例