改善C#公共程序類庫質量的10種方法


最近重構一套代碼,運用以下幾種方法,供參考。

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).

image

經過格式化之后,如上圖所示,被分成幾個區域,看起來條理更清晰。

 

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

image

5)  Resharper  Find Similar Code 查找相似的代碼

image

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工具,盡可能的為公共方法書寫注釋,添加用例

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM