消除代碼中的壞味道,編寫高質量代碼

消除代碼中的壞味道,編寫高質量代碼

Intro

想要寫出較好的代碼,保證代碼的高質量需要時刻警惕代碼中的壞味道,今天分享一下,我覺得平時寫的代碼中可能會出現的壞味道代碼的一些示例

常見的壞味道代碼

  1. Bug Logically(null check etc.)

嚴格的來說,這可能是一個 BUG 級別的代碼了,最簡單的一個實例,你應該明確你的輸入數據是不是可能為 null,如果可能為 null 需要檢查一下,有一些代碼中往往會在代碼中寫下一些坑,明明這個變量是 null 還是直接用這個變量中的屬性或方法

還有一種情況是明確對象不是 null 的情況下就不要 null check 或使用 null 傳播符號,下面的這個是一個錯誤示例:

var list = new List<int>(){1,2,3,-2,3,6,2};
var arr = list?.Where(x=>x>0)?.Where(x=>(x%2)==0)?.ToArray()

上面的代碼里 list 是不會為 null 的所以 list 後不需要加 ?Where 這個 LINQ 方法是不會返回一個 null 的,所以 Where 後面也是不需要加 ?

這裡特別想說一下,很多人對象 FirstFirstOrDefault 的用法有些不清楚,如果能找到數據並且要找到第一個數據就用 First,如果找不到會有 exception,
FirstOrDefault 在不確定有沒有的時候用它更合適,如果沒有就返回一個默認值。

  1. unnecessary namespace using

代碼中沒有用到的命名空間引用請移除它,避免不必要的代碼

  1. unused code, commented code

沒有用到的代碼或者被注釋的代碼直接從代碼中刪除,不要保留在代碼庫中,一個是可能會讓人很費解,一個是沒有任何用處

現在我們的代碼基本都會使用源代碼版本管理,如果沒有,我建議你使用,這樣可以保證每次修改都是一個版本,可追溯

  1. exception throw

在應用中主動拋異常的時候應該拋出具體的異常,例如參數為 null 的時候應該拋出 throw new ArgumentNullException("paramName") 而不是 throw new Exception()

還有一些異常應該是系統內部拋出的異常,不應該從用戶代碼中拋出,例如: IndexOutOfRangeException

  1. obsolete members

對於過時的方法,我們一般會標記一個 [Obsolete],標記的同時應該提供一個 message 提示用戶不要使用這個方法或者使用哪一個方法代替

  1. 抽象類

抽象類的構造器方法應該是 protected,因為抽象類是不能實例化的,所以抽象類的構造方法是不是被直接調用的,所以通常來說應該考慮抽象類的構造方法設置為 protected

抽象類中外部要使用的方法才設置為 public,僅內部會用到的成員設置為 protected 即可,體現封裝特性,最小化訪問權限

  1. 方法重載

方法重載應該放在一起,這樣方便我們查找代碼,也會更方便了解這個方法的參數

  1. method complexity

減少方法的複雜度,不要讓一個方法過於複雜,如果太複雜了就可能需要考慮重構了,方法參數不能太多,方法邏輯不要太複雜,詳細可以參考上一篇文章方法重構分析

  1. IEnumerable<T>

對於 IEnumerable<T> 使用 Any() 來代替 Count()==0

對於數組和列表分別使用 array.Lengthlist.Count 代替 Count()

Recommendations

推薦為你的 Visual Studio 安裝 CodeMaidReSharper

使用 CodeMaid 來做代碼整理,通常我會使用 CodeMaid 來自動整理代碼,防止有些地方會有多餘的空格,和自動清理命名空間,除此之外 CodeMaid 還有一個比較贊的功能是在使用 region 來區分代碼塊的時候,CodeMaid 會在 EndRegion 處增加對應的 Region 的描述信息,這樣方法較長,region 較多的情況下會比較容易區分哪裡是哪一部分的會比較清晰

遵循 ReSharper 的建議編寫更整潔的代碼,ReSharper 會提供很多實用的建議,比如使用新的 C# 語法來簡化代碼,移除沒有使用的變量等很多很實用的建議,按照 ReSharper 的建議我們就可以比較輕鬆的寫出比較良好的代碼,有時候 ReSharper 的命名規則可能會於自己的習慣不符,可以通過定製 editorconfig 來指定命名規範

More

Resharper 也有代碼整理的,不過我沒用過,習慣了 CodeMaid 了,有興趣的可以研究一下,一起交流一下哈~~

Tags: