推薦一款代碼規范檢查(CodeReview)神器
在實際項目開發中,越是復雜的項目,越是需要很多人協同完成,每一個人根據職責分工不同,負責不同的模塊。在這個過程中,由于每一個人的工作經歷不同,在不同的職場環境中,會形成不同的編碼習慣,比如有人喜歡駝峰命名方式,有人喜歡帕斯卡命名方式,還有人喜歡用下劃線分隔單詞,更有甚者,有的人喜歡隨意命名,那在整個項目中如何保持一種編碼風格,讓每一個人都能快速的看懂其他同事的代碼,就顯得非常關鍵。要解決這一個問題,最直接的方法就是代碼審查(Code Review),同事之間相互審查對方的代碼,以便及時更正,但這也有弊端,比如在項目工期較緊的時候,人工代碼審查就會流于形式;同時大家的編程習慣各不相同,也難于形成統一認識。這時候如果能有一款工具,在編程的時候,及時標識出不規范的地方,那將會大大的節約大家的時間,同時也容易形成統一認識,按照既定的規則進行編程。今天我們就以一個簡單的小例子,簡述如何通過StyleCop.Analyzers實現代碼的靜態審查,僅供學習分享使用,如有不足之處,還請指正。

什么是StyleCop.Analyzers?
StyleCop.Analyzes是一個C#源碼分析工具,用于檢測代碼樣式、質量和可維護性、設計及其他問題。它目前已經包含了200多個最佳實踐規則,可以幫助我們更容易的進行代碼審查。而且這些實踐規則,和 Visual Studio 中默認的代碼格式化規則是一致的。它會根據預定義的C#代碼格式的最佳實踐,對我們的源代碼進行檢查,并給出不符合編碼風格的錯誤提示。可以幫助團隊成員強制執行一組代碼樣式和一致性規則。
github網址為:https://github.com/DotNetAnalyzers/StyleCopAnalyzers/

StyleCop安裝
在Visual Studio 2022開發工具中,可以通過Nuget包管理器進行安裝。首先創建示例項目Okcoder.StyleCopAnalyzers.Demo解決方案,它包含兩個項目,分別為WinForm程序Okcoder.StyleCopAnalyzers.Demo和類庫Okcoder.StyleCopAnalyzers.Test。創建成功后,如下圖所示:

在項目右鍵,選擇“管理 Nuget程序包...”打開Nuget包管理頁面,然后在“瀏覽”輸入“StyleCop.Analyzers”關鍵字進行搜索。當前最新版本為v1.1.118,如下所示:

可以根據實際情況進行安裝,如果有些項目不需要進行代碼靜態審查,則不需要安裝。
分析器和代碼提示
StyleCop.Analyzers安裝成功后,打開項目Okcoder.StyleCopAnalyzers.Demo的“依賴項”,并在子項中選擇“分析器”中,可以看到StyleCop.Analyzers的內容,它主要包含代碼靜態審查的規則和嚴重程度設置。如下所示:

這個時候,當我們打開FrmMain頁面,可以看到多了很多綠色的波浪線,這是在提示我們它不符合StyleCop.Analyzers的代碼審查規則,當鼠標放在綠色波浪線的上方,會提示具體的詳細內容,如下所示:

當我們按照StyleCop.Analyzer提示的規則修改后,綠色波浪線會消失,如下所示:

同時經過修改,代碼也變得清爽很多。
StyleCop規則說明
StyleCop.Analyzers定義了很多規則,但我們并不需要應用全部的規則,可以根據項目實際需要應用部分規則,它主要定義的規則如下所示:
- 文檔規則:主要包括文檔的定義相關規則,如文檔說明,接口說明,類說明,屬性說明等內容。
- 縮進規則:主要是采用哪種方式縮進,如tab縮進,空格縮進。
- 間距規則:主要定義間距。
- 可讀性規則:主要定義代碼可讀性,如給內置類型設置別名等。
- 排序規則:主要定義文檔中元素之間的排序,如屬性,方法等排序規則。
- 命名規則:主要定義命名規則方式。
- 可維護性規則:主要定義哪些類型需要定義在單獨的文件中,如一個類文件只能包含一個類定義。
- 布局規則:主要定義代碼布局,如do-while的閉合花括號和條件表達式在同一行。
以上是StyleCop.Analyzers定義的主要規則,每一項還包含更詳細的規則,具體可以在實際應用中進行查看。
StyleCop規則配置
StyleCop.Analyzers提供了兩種規則配置方式,本文主要通過stylecop.json文件進行配置,關于stylecop.json的創建,可以通過在代碼警告提示的地方,點擊“快速操作和重構”小燈泡按鈕,然后點擊“Add StyleCop settings file to the project”就可以在項目中添加stylecop.json配置文件,如下所示:

配置完成后,stylecop.json的示例文件如下所示:
{
// ACTION REQUIRED: This file was automatically added to your project, but it
// will not take effect until additional steps are taken to enable it. See the
// following page for additional information:
//
// https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/EnableConfiguration.md
"$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json",
"settings": {
//文檔規則
"documentationRules": {
"companyName": "Okcoder", //指定應在版權聲明中出現的公司名稱
"copyrightText": "Copyright (c) { companyName }. All rights reserved.",
"xmlHeader": true,
"variables": {
"licenseName": "MIT",
"licenseFile": "LICENSE"
},
"headerDecoration": "-----------------------------------------------------------------------",
"documentInterfaces": true,
"documentExposedElements": true,
"documentInternalElements": true,
"documentPrivateElements": false,
"documentPrivateFields": false,
"fileNamingConvention": "stylecop",
"documentationCulture": "en-US",
"excludeFromPunctuationCheck": ["seeaslo"]
},
//縮進規則
"indentation": {
"useTabs": false,
"tabSize": 4,
"indentationSize": 4
},
//間距規則
"spacingRules": {
},
//可讀性規則
"readabilityRules": {
//是否運行給內置類型定義別名
"allowBuiltInTypeAliases": false
},
//排序規則
"orderingRules": {
//定義文檔中元素排序和優先級 traits:特性
"elementOrder": [ "kind", "accessibility", "constant", "static", "readonly" ],
"systemUsingDirectivesFirst": true,
"usingDirectivesPlacement": "outsideNamespace",
"blankLinesBetweenUsingGroups": "allow"
},
//命名規則
"namingRules": {
//允許使用常見的匈牙利語前綴
"allowCommonHungarianPrefixes": true,
"allowedHungarianPrefixes": [ "cd", "md" ],
"allowedNamespaceComponents": [ "" ],
"includeInferredTupleElementNames": false, //是否需要觸發推斷出的元組名進行分析
"tupleElementNameCasing": "PascalCase" // 元組命名方式,Pascal方式
},
//可維護性規則
"maintainabilityRules": {
//定義哪些類型需要在單獨的文件中
"topLevelTypes": [ "class", "interface", "enum", "delegate", "struct" ]
},
"layoutRules": {
"allowConsecutiveUsings": true, //允許使用連續無花括號的語句
"allowDoWhileOnClosingBrace": false, //是否允許do while 的條件表達式和閉合括號在同一行
"newlineAtEndOfFile": "allow" // 文件結尾是否允許出現新行標識符
}
}
}
配置規則共享
在實際應用中,我們不止有一個項目,如果需要在多個項目中應用同一套代碼審查規則,可以將stylecop.json文件復制到公共目錄,如解決方案文件夾,如下所示:

在需要添加的項目中,右鍵編輯項目文件,然后在項目文件中添加如下代碼,將共享規則文件鏈接到項目中,如下所示:
<ItemGroup>
<AdditionalFiles Include="..\stylecop.json" Link="stylecop.json" />
</ItemGroup>
添加后項目文件如下所示:

并且在一個地方修改stylecop.json文件,會同時生效,因為兩個項目都是鏈接的同一個json文件。在項目中如下所示:

以上就是《推薦一款代碼規范檢查(CodeReview)神器》的全部內容,旨在拋磚引玉,一起學習,共同進步!
作者:老碼識途
出處:http://www.rzrgm.cn/hsiang/
本文版權歸作者和博客園共有,寫文不易,支持原創,歡迎轉載【點贊】,轉載請保留此段聲明,且在文章頁面明顯位置給出原文連接,謝謝。
關注個人公眾號,定時同步更新技術及職場文章

浙公網安備 33010602011771號