找回密码
 立即注册
首页 业界区 安全 推荐一款代码规范检查(CodeReview)神器

推荐一款代码规范检查(CodeReview)神器

恐肩 2025-9-28 18:37:16
在实际项目开发中,越是复杂的项目,越是需要很多人协同完成,每一个人根据职责分工不同,负责不同的模块。在这个过程中,由于每一个人的工作经历不同,在不同的职场环境中,会形成不同的编码习惯,比如有人喜欢驼峰命名方式,有人喜欢帕斯卡命名方式,还有人喜欢用下划线分隔单词,更有甚者,有的人喜欢随意命名,那在整个项目中如何保持一种编码风格,让每一个人都能快速的看懂其他同事的代码,就显得非常关键。要解决这一个问题,最直接的方法就是代码审查(Code Review),同事之间相互审查对方的代码,以便及时更正,但这也有弊端,比如在项目工期较紧的时候,人工代码审查就会流于形式;同时大家的编程习惯各不相同,也难于形成统一认识。这时候如果能有一款工具,在编程的时候,及时标识出不规范的地方,那将会大大的节约大家的时间,同时也容易形成统一认识,按照既定的规则进行编程。今天我们就以一个简单的小例子,简述如何通过StyleCop.Analyzers实现代码的静态审查,仅供学习分享使用,如有不足之处,还请指正。
 
1.png

 
什么是StyleCop.Analyzers?

 
StyleCop.Analyzes是一个C#源码分析工具,用于检测代码样式、质量和可维护性、设计及其他问题。它目前已经包含了200多个最佳实践规则,可以帮助我们更容易的进行代码审查。而且这些实践规则,和 Visual Studio 中默认的代码格式化规则是一致的。它会根据预定义的C#代码格式的最佳实践,对我们的源代码进行检查,并给出不符合编码风格的错误提示。可以帮助团队成员强制执行一组代码样式和一致性规则。
github网址为:https://github.com/DotNetAnalyzers/StyleCopAnalyzers/
 
2.png

 
StyleCop安装

 
在Visual Studio 2022开发工具中,可以通过Nuget包管理器进行安装。首先创建示例项目Okcoder.StyleCopAnalyzers.Demo解决方案,它包含两个项目,分别为WinForm程序Okcoder.StyleCopAnalyzers.Demo和类库Okcoder.StyleCopAnalyzers.Test。创建成功后,如下图所示:
 
3.png

 
在项目右键,选择“管理 Nuget程序包...”打开Nuget包管理页面,然后在“浏览”输入“StyleCop.Analyzers”关键字进行搜索。当前最新版本为v1.1.118,如下所示:

4.png

 
可以根据实际情况进行安装,如果有些项目不需要进行代码静态审查,则不需要安装。
 
分析器和代码提示

 
StyleCop.Analyzers安装成功后,打开项目Okcoder.StyleCopAnalyzers.Demo的“依赖项”,并在子项中选择“分析器”中,可以看到StyleCop.Analyzers的内容,它主要包含代码静态审查的规则和严重程度设置。如下所示:
 
5.png

 
这个时候,当我们打开FrmMain页面,可以看到多了很多绿色的波浪线,这是在提示我们它不符合StyleCop.Analyzers的代码审查规则,当鼠标放在绿色波浪线的上方,会提示具体的详细内容,如下所示:
 
6.png

 
当我们按照StyleCop.Analyzer提示的规则修改后,绿色波浪线会消失,如下所示:
 
7.png

同时经过修改,代码也变得清爽很多。
 
StyleCop规则说明

 
StyleCop.Analyzers定义了很多规则,但我们并不需要应用全部的规则,可以根据项目实际需要应用部分规则,它主要定义的规则如下所示:

  • 文档规则:主要包括文档的定义相关规则,如文档说明,接口说明,类说明,属性说明等内容。
  • 缩进规则:主要是采用哪种方式缩进,如tab缩进,空格缩进。
  • 间距规则:主要定义间距。
  • 可读性规则:主要定义代码可读性,如给内置类型设置别名等。
  • 排序规则:主要定义文档中元素之间的排序,如属性,方法等排序规则。
  • 命名规则:主要定义命名规则方式。
  • 可维护性规则:主要定义哪些类型需要定义在单独的文件中,如一个类文件只能包含一个类定义。
  • 布局规则:主要定义代码布局,如do-while的闭合花括号和条件表达式在同一行。
以上是StyleCop.Analyzers定义的主要规则,每一项还包含更详细的规则,具体可以在实际应用中进行查看。
 
StyleCop规则配置

 
StyleCop.Analyzers提供了两种规则配置方式,本文主要通过stylecop.json文件进行配置,关于stylecop.json的创建,可以通过在代码警告提示的地方,点击“快速操作和重构”小灯泡按钮,然后点击“Add StyleCop settings file to the project”就可以在项目中添加stylecop.json配置文件,如下所示:
 
8.png

 
配置完成后,stylecop.json的示例文件如下所示:
 
  1. {
  2.   // ACTION REQUIRED: This file was automatically added to your project, but it
  3.   // will not take effect until additional steps are taken to enable it. See the
  4.   // following page for additional information:
  5.   //
  6.   // https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/EnableConfiguration.md
  7.   "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json",
  8.   "settings": {
  9. <ItemGroup>
  10.    
  11. </ItemGroup>//文档规则
  12. <ItemGroup>
  13.    
  14. </ItemGroup>"documentationRules": {
  15. <ItemGroup>
  16.    
  17. </ItemGroup>  "companyName": "Okcoder", //指定应在版权声明中出现的公司名称
  18. <ItemGroup>
  19.    
  20. </ItemGroup>  "copyrightText": "Copyright (c) { companyName }. All rights reserved.",
  21. <ItemGroup>
  22.    
  23. </ItemGroup>  "xmlHeader": true,
  24. <ItemGroup>
  25.    
  26. </ItemGroup>  "variables": {
  27. <ItemGroup>
  28.    
  29. </ItemGroup><ItemGroup>
  30.    
  31. </ItemGroup>"licenseName": "MIT",
  32. <ItemGroup>
  33.    
  34. </ItemGroup><ItemGroup>
  35.    
  36. </ItemGroup>"licenseFile": "LICENSE"
  37. <ItemGroup>
  38.    
  39. </ItemGroup>  },
  40. <ItemGroup>
  41.    
  42. </ItemGroup>  "headerDecoration": "-----------------------------------------------------------------------",
  43. <ItemGroup>
  44.    
  45. </ItemGroup>  "documentInterfaces": true,
  46. <ItemGroup>
  47.    
  48. </ItemGroup>  "documentExposedElements": true,
  49. <ItemGroup>
  50.    
  51. </ItemGroup>  "documentInternalElements": true,
  52. <ItemGroup>
  53.    
  54. </ItemGroup>  "documentPrivateElements": false,
  55. <ItemGroup>
  56.    
  57. </ItemGroup>  "documentPrivateFields": false,
  58. <ItemGroup>
  59.    
  60. </ItemGroup>  "fileNamingConvention": "stylecop",
  61. <ItemGroup>
  62.    
  63. </ItemGroup>  "documentationCulture": "en-US",
  64. <ItemGroup>
  65.    
  66. </ItemGroup>  "excludeFromPunctuationCheck": ["seeaslo"]
  67. <ItemGroup>
  68.    
  69. </ItemGroup>},
  70. <ItemGroup>
  71.    
  72. </ItemGroup>//缩进规则
  73. <ItemGroup>
  74.    
  75. </ItemGroup>"indentation": {
  76. <ItemGroup>
  77.    
  78. </ItemGroup>  "useTabs": false,
  79. <ItemGroup>
  80.    
  81. </ItemGroup>  "tabSize": 4,
  82. <ItemGroup>
  83.    
  84. </ItemGroup>  "indentationSize": 4
  85. <ItemGroup>
  86.    
  87. </ItemGroup>},
  88. <ItemGroup>
  89.    
  90. </ItemGroup>//间距规则
  91. <ItemGroup>
  92.    
  93. </ItemGroup>"spacingRules": {
  94. <ItemGroup>
  95.    
  96. </ItemGroup>},
  97. <ItemGroup>
  98.    
  99. </ItemGroup>//可读性规则
  100. <ItemGroup>
  101.    
  102. </ItemGroup>"readabilityRules": {
  103. <ItemGroup>
  104.    
  105. </ItemGroup>  //是否运行给内置类型定义别名
  106. <ItemGroup>
  107.    
  108. </ItemGroup>  "allowBuiltInTypeAliases": false
  109. <ItemGroup>
  110.    
  111. </ItemGroup>},
  112. <ItemGroup>
  113.    
  114. </ItemGroup>//排序规则
  115. <ItemGroup>
  116.    
  117. </ItemGroup>"orderingRules": {
  118. <ItemGroup>
  119.    
  120. </ItemGroup>  //定义文档中元素排序和优先级 traits:特性
  121. <ItemGroup>
  122.    
  123. </ItemGroup>  "elementOrder": [ "kind", "accessibility", "constant", "static", "readonly" ],
  124. <ItemGroup>
  125.    
  126. </ItemGroup>  "systemUsingDirectivesFirst": true,
  127. <ItemGroup>
  128.    
  129. </ItemGroup>  "usingDirectivesPlacement": "outsideNamespace",
  130. <ItemGroup>
  131.    
  132. </ItemGroup>  "blankLinesBetweenUsingGroups": "allow"
  133. <ItemGroup>
  134.    
  135. </ItemGroup>},
  136. <ItemGroup>
  137.    
  138. </ItemGroup>//命名规则
  139. <ItemGroup>
  140.    
  141. </ItemGroup>"namingRules": {
  142. <ItemGroup>
  143.    
  144. </ItemGroup>  //允许使用常见的匈牙利语前缀
  145. <ItemGroup>
  146.    
  147. </ItemGroup>  "allowCommonHungarianPrefixes": true,
  148. <ItemGroup>
  149.    
  150. </ItemGroup>  "allowedHungarianPrefixes": [ "cd", "md" ],
  151. <ItemGroup>
  152.    
  153. </ItemGroup>  "allowedNamespaceComponents": [ "" ],
  154. <ItemGroup>
  155.    
  156. </ItemGroup>  "includeInferredTupleElementNames": false, //是否需要触发推断出的元组名进行分析
  157. <ItemGroup>
  158.    
  159. </ItemGroup>  "tupleElementNameCasing": "PascalCase" // 元组命名方式,Pascal方式
  160. <ItemGroup>
  161.    
  162. </ItemGroup>},
  163. <ItemGroup>
  164.    
  165. </ItemGroup>//可维护性规则
  166. <ItemGroup>
  167.    
  168. </ItemGroup>"maintainabilityRules": {
  169. <ItemGroup>
  170.    
  171. </ItemGroup>  //定义哪些类型需要在单独的文件中
  172. <ItemGroup>
  173.    
  174. </ItemGroup>  "topLevelTypes": [ "class", "interface", "enum", "delegate", "struct" ]
  175. <ItemGroup>
  176.    
  177. </ItemGroup>},
  178. <ItemGroup>
  179.    
  180. </ItemGroup>"layoutRules": {
  181. <ItemGroup>
  182.    
  183. </ItemGroup>  "allowConsecutiveUsings": true, //允许使用连续无花括号的语句
  184. <ItemGroup>
  185.    
  186. </ItemGroup>  "allowDoWhileOnClosingBrace": false, //是否允许do while 的条件表达式和闭合括号在同一行
  187. <ItemGroup>
  188.    
  189. </ItemGroup>  "newlineAtEndOfFile": "allow" // 文件结尾是否允许出现新行标识符
  190. <ItemGroup>
  191.    
  192. </ItemGroup>}
  193.   }
  194. }
复制代码
 
配置规则共享

 
在实际应用中,我们不止有一个项目,如果需要在多个项目中应用同一套代码审查规则,可以将stylecop.json文件复制到公共目录,如解决方案文件夹,如下所示:
 
9.png

 
在需要添加的项目中,右键编辑项目文件,然后在项目文件中添加如下代码,将共享规则文件链接到项目中,如下所示:
 
  1. <ItemGroup>
  2.    
  3. </ItemGroup>
复制代码
 
添加后项目文件如下所示:
 
10.png

 
并且在一个地方修改stylecop.json文件,会同时生效,因为两个项目都是链接的同一个json文件。在项目中如下所示:
 
11.png

以上就是《推荐一款代码规范检查(CodeReview)神器》的全部内容,旨在抛砖引玉,一起学习,共同进步!

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册