
在实际项目开发中,越是复杂的项目,越是需要很多人协同完成,每一个人根据职责分工不同,负责不同的模块。在这个过程中,由于每一个人的工作经历不同,在不同的职场环境中,会形成不同的编码习惯,比如有人喜欢驼峰命名方式,有人喜欢帕斯卡命名方式,还有人喜欢用下划线分隔单词,更有甚者,有的人喜欢随意命名,那在整个项目中如何保持一种编码风格,让每一个人都能快速的看懂其他同事的代码,就显得非常关键。要解决这一个问题,最直接的方法就是代码审查(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)神器》的全部内容,旨在抛砖引玉,一起学习,共同进步!