1. 程式人生 > >消除程式碼中的壞味道,編寫高質量程式碼

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

# 消除程式碼中的壞味道,編寫高質量程式碼 ## Intro 想要寫出較好的程式碼,保證程式碼的高質量需要時刻警惕程式碼中的壞味道,今天分享一下,我覺得平時寫的程式碼中可能會出現的壞味道程式碼的一些示例 ## 常見的壞味道程式碼 0. Bug Logically(null check etc.) 嚴格的來說,這可能是一個 BUG 級別的程式碼了,最簡單的一個例項,你應該明確你的輸入資料是不是可能為 null,如果可能為 null 需要檢查一下,有一些程式碼中往往會在程式碼中寫下一些坑,明明這個變數是 `null` 還是直接用這個變數中的屬性或方法 還有一種情況是明確物件不是 `null` 的情況下就不要 null check 或使用 null 傳播符號,下面的這個是一個錯誤示例: ``` csharp var list = new List(){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` 後面也是不需要加 `?` 的 這裡特別想說一下,很多人物件 `First` 和 `FirstOrDefault` 的用法有些不清楚,如果能找到資料並且要找到第一個資料就用 `First`,如果找不到會有 exception, 而 `FirstOrDefault` 在不確定有沒有的時候用它更合適,如果沒有就返回一個預設值。 1. unnecessary namespace using 程式碼中沒有用到的名稱空間引用請移除它,避免不必要的程式碼 2. unused code, commented code 沒有用到的程式碼或者被註釋的程式碼直接從程式碼中刪除,不要保留在程式碼庫中,一個是可能會讓人很費解,一個是沒有任何用處 現在我們的程式碼基本都會使用原始碼版本管理,如果沒有,我建議你使用,這樣可以保證每次修改都是一個版本,可追溯 3. exception throw 在應用中主動拋異常的時候應該丟擲具體的異常,例如引數為 `null` 的時候應該丟擲 `throw new ArgumentNullException("paramName")` 而不是 `throw new Exception()` 還有一些異常應該是系統內部丟擲的異常,不應該從使用者程式碼中丟擲,例如: `IndexOutOfRangeException` 4. obsolete members 對於過時的方法,我們一般會標記一個 `[Obsolete]`,標記的同時應該提供一個 message 提示使用者不要使用這個方法或者使用哪一個方法代替 5. 抽象類 抽象類的構造器方法應該是 `protected`,因為抽象類是不能例項化的,所以抽象類的構造方法是不是被直接呼叫的,所以通常來說應該考慮抽象類的構造方法設定為 `protected` 抽象類中外部要使用的方法才設定為 `public`,僅內部會用到的成員設定為 protected 即可,體現封裝特性,最小化訪問許可權 6. 方法過載 方法過載應該放在一起,這樣方便我們查詢程式碼,也會更方便了解這個方法的引數 7. method **complexity** 減少方法的複雜度,不要讓一個方法過於複雜,如果太複雜了就可能需要考慮重構了,方法引數不能太多,方法邏輯不要太複雜,詳細可以參考上一篇文章方法重構分析 8. `IEnumerable` 對於 `IEnumerable` 使用 `Any()` 來代替 `Count()==0` 對於陣列和列表分別使用 `array.Length` 和 `list.Count` 代替 `Count()` ## Recommendations 推薦為你的 Visual Studio 安裝 **CodeMaid** 和 **ReSharper** 使用 **CodeMaid** 來做程式碼整理,通常我會使用 `CodeMaid` 來自動整理程式碼,防止有些地方會有多餘的空格,和自動清理名稱空間,除此之外 `CodeMaid` 還有一個比較讚的功能是在使用 region 來區分程式碼塊的時候,`CodeMaid` 會在 EndRegion 處增加對應的 Region 的描述資訊,這樣方法較長,region 較多的情況下會比較容易區分哪裡是哪一部分的會比較清晰 遵循 **ReSharper** 的建議編寫更整潔的程式碼,ReSharper 會提供很多實用的建議,比如使用新的 C# 語法來簡化程式碼,移除沒有使用的變數等很多很實用的建議,按照 `ReSharper` 的建議我們就可以比較輕鬆的寫出比較良好的程式碼,有時候 `ReSharper` 的命名規則可能會於自己的習慣不符,可以通過定製 `editorconfig` 來指定命名規範 ## More Resharper 也有程式碼整理的,不過我沒用過,習慣了 CodeMaid 了,有興趣的可以研究一下,一起交流一