用StyleCop规范团队代码

前言

编码风格,每个人都是有不同的特点,风格各异,而且一个人在不同的时期,编码风格的差异也可能是非常大的,好比学生时代,刚工作的时候,工作一段时间后等。

在一个团队中,或一个项目中,如果出现了N种风格,这个可能就是比较头疼了,尤其是风格差异很大的时候。

一个项目一种风格或许还可以接受,如果一个项目风格都不一样,那就有点难受了,就更不用说整个团队的了。长久来看,团队之间,难免会有人员的调动,所以统一整个团队的编码风格还是很有必要的。

统一了编码风格会带来什么好处呢?下面列出几点

  1. 便于代码审查

  2. 新人(新同事/跨项目组同事)接手不会觉得杂乱无章

  3. ...

下面来先看看本文的重点StyleCop。

什么是StyleCop?

这里引用维基百科的介绍

StyleCop is an open-source static code analysis tool from Microsoft that checks C# code for conformance to StyleCop's recommended coding styles and a subset of Microsoft's .NET Framework Design Guidelines. StyleCop analyses the source code, allowing it to enforce a different set of rules from FxCop (which, instead of source code, checks .NET managed code assemblies). The rules are classified into the following categories:

  • Documentation

  • Layout

  • Maintainability

  • Naming

  • Ordering

  • Readability

  • Spacing

简单理解,开源的静态代码分析工具,用来检查代码是否符合推荐的编码风格。

它的开源地址: https://github.com/StyleCop/StyleCop

其在README的最后,建议我们(使用Visual Studio 2015或更高版本的开发人员)使用的是StyleCopAnalyzers。

所以,后面我们用到的是它,StyleCop规则基于.NET编译器(Roslyn)的实现。

下面通过一个示例来介绍它的简单使用。

示例

当我们新建一个.NET Core的控制台程序之后,大致就是下面的样子。可以看到是没有任何警告的。

640?wx_fmt=png

通过Nuget安装StyleCop.Analyzers,或直接在csproj里面加下面的内容。

<ItemGroup><PackageReference Include="StyleCop.Analyzers" Version="1.1.1-rc.94"><PrivateAssets>All</PrivateAssets></PackageReference></ItemGroup>

在回到Program.cs,马上就可以看到有波浪线了~~

640?wx_fmt=png

这个时候我们需要狠一点,把项目的所有警告级别的提示都当成错误来看待。

<PropertyGroup><!-- other... --><TreatWarningsAsErrors>true</TreatWarningsAsErrors></PropertyGroup>

加了这个之后,编译就立马出错了。

640?wx_fmt=png

在编译不通过时,还是ERROR级别的错,只能乖乖的去改了。

按照提示,一个个修改之后,还是有一个SA0001的错误提示。

640?wx_fmt=png

要修复这个问题,需要参考这个文档 SA0001.md

启用一下生成XML文档,同时加几个禁止显示的警告即可。

<PropertyGroup><!-- other... --><TreatWarningsAsErrors>true</TreatWarningsAsErrors><!-- 加下面2行,处理SA0001 --><GenerateDocumentationFile>true</GenerateDocumentationFile><NoWarn>$(NoWarn),1573,1591,1712</NoWarn></PropertyGroup>

这个时候再build,就不会有错误了。

640?wx_fmt=png

对于这么简单的一个空项目,都有不少要修改的地方,就可以知道,默认的规则是比较严格的。那么我们有没有办法避免应用某些规则呢?答案是肯定的。

我们可以通过添加代码分析规则集来自定义。

有两个方式添加,一个是直接添加新建项;一个是通过修改分析器里面的规则集严重性,修改后会自动生成。

640?wx_fmt=png

下面我们通过修改两个规则来体验一下。

一个是不想要上面的头部(SA1200),一个是using可以在命名空间外面(SA1633)。

下面是示例代码。

<?xml version="1.0" encoding="utf-8"?><RuleSet Name="Demo Analyzer Rules" Description="Analyzer rules for Demo." ToolsVersion="15.0"><Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers"> <!-- Using statements must be inside a namespace --><Rule Id="SA1200" Action="None" /><!-- The file header is missing or not located at the top of the file --><Rule Id="SA1633" Action="None" />    </Rules></RuleSet>

同时,还要修改csproj文件

<PropertyGroup><!-- other... --><TreatWarningsAsErrors>true</TreatWarningsAsErrors><!-- 加下面2行,处理SA0001 --><GenerateDocumentationFile>true</GenerateDocumentationFile><NoWarn>$(NoWarn),1573,1591,1712</NoWarn><!-- 加下面这行,自定义代码分析规则集 --><CodeAnalysisRuleSet>..\test.ruleset</CodeAnalysisRuleSet></PropertyGroup>

去掉代码的头部,和把using放到外面,再build一下项目,就可以正常通过了。

640?wx_fmt=png

既然可以自己定义,那么就必然有这样一个问题,每个人可能都会想把自己的习惯放开,这样的话,这个规则就是一个透明的存在了!!

换句话说,必须要有一些硬性规定,必须要有一些取舍。我们可以向某些开源项目借鉴,同时在他的基础上做简单的添加删除,个人觉得应该可以适应大多数的情况了。

下面放出几个觉得不错的参考。

  • Autofac 目前我就是以这个为基础的

  • EntityFrameworkCore

在代码分析规则集的基础上,还可以用Stylecop.json来微调某些规则的行为。

当把SA1633恢复之后,提示的第二个选项就是添加Stylecop.json配置文件

640?wx_fmt=png

添加之后,还要在csproj里面做设置

<ItemGroup><AdditionalFiles Include="stylecop.json" /></ItemGroup>

关于Stylecop.json的具体配置,可以参考Configuring StyleCop Analyzers,这里不继续展开。

除了上面的办法,还可以通过安装扩展StyleCop来处理。

640?wx_fmt=png

安装后,右击项目的时候就可以看到StyleCop相关的菜单。

640?wx_fmt=png

总结

在团队内保持一样的编码风格,并能在开发过程中纠正相应的错误,这是编写可维护和可读代码的重要一步,同样也是代码审查的重要一步!

当然,在团队内推行这类规范,还是要多多听取团队成员的意见,也要定时检查规则是否需要更新,毕竟时代在进步!只要达成一致,就是好规则,就应该要遵守。

StyleCop是一个很不错的工具,用的好就是利器。可以把它和cli模板项目相结合,这样创建的新项目就都“内嵌”了一样的规则了。

友情提示,在老项目添加这个要慎重,不然会有一阵阵酸爽。

相关文章

  • 代码审查工具StyleCop

  • StyleCop: A Detailed Guide to Starting and Using It

  • Automated, portable code style checking in .NET Core projects

原文地址:https://www.cnblogs.com/catcher1994/p/10375823.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CodeForces:103(div1)104(div2)

文章目录前言CF104A BlackjackDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF103A Testing Pants for SadnessDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF103B CthulhuDe…

UOJ#749-[UNR #6]稳健型选手【贪心,分治,主席树】

正题 题目链接:https://uoj.ac/problem/749 题目大意 如果有序列aaa&#xff0c;你每次取走一个数字后然后这个序列最前面的数字会被别人取走&#xff0c;直到序列为空。此时f(a)f(a)f(a)表示你最大能取走的权值和。 给出一个长度为nnn的序列aaa&#xff0c;qqq次询问区间[l…

A. And Then There Were K

A. And Then There Were K 题意&#xff1a; 给你一个n&#xff0c;让你求一个k&#xff0c;使得满足下列式子&#xff1a; n & (n-1) & (n-2) &…&(k) 0 问k最小是多少&#xff1f; 题解&#xff1a; 找规律 比如n的二进制为&#xff1a;1111 那么n-1就是…

一键发布部署vs插件[AntDeploy],让net开发者更幸福

一键发布工具(ant deploy tool)插件下载地址&#xff1a;https://marketplace.visualstudio.com/items?itemNamenainaigu.AntDeploy1.iis一键发布自动部署 (iis deploy support)支持netcore 和 netframework发布 (支持mvc webapi)支持website自动创建ps:需要在windows 服务器上…

数据结构二之线段树Ⅰ——Count Color,Hotel,Transformation,Tree Generator™

普通的下标线段树Count ColorHotelTransformationTree Generator™Count Color POJ2777 查询区间内颜色种类数&#xff0c;观察到颜色种类数只有30&#xff0c;完全可以状压成整型存储&#xff0c;没有必要开30棵线段树 区间内有这颜色就置为111&#xff0c;没有这个颜色就是…

计算几何全家桶

文章目录前言精度点/向量相关表示向量基本运算角度相关向量夹角旋转直线/线段相关表示点与线求点到直线垂足求点关于直线的对称点点与直线的位置关系点与直线的距离线与线直线与直线的位置关系共线与垂直判断线段与线段是否相交求直线与直线的交点角平分线中垂线多边形表示求多…

uoj#750-[UNR #6]小火车【二分,折半,鸽笼原理】

正题 题目链接:https://uoj.ac/problem/750 题目大意 给出nnn个数字和一个ppp&#xff0c;保证2n>p2^n> p2n>p。现在要求一个序列www满足wi∈[−1,1]w_i\in[-1,1]wi​∈[−1,1]&#xff0c;使得∑i1nwiai≡0(modp)\sum_{i1}^nw_ia_i\equiv 0\pmod p∑i1n​wi​ai​≡…

Sequence Pair Weight

Sequence Pair Weight 题意&#xff1a; 一个数组a&#xff0c;其中两个一样的数的贡献为1&#xff0c;问这个数组的所有子串的贡献和是多少? 题解&#xff1a; 举例&#xff1a; 对于[1&#xff0c;2&#xff0c;1&#xff0c;2&#xff0c;1&#xff0c;1&#xff0c;4]…

什么是量子计算机?用一个简单例子来解释

译者&#xff1a;王亮 作者&#xff1a;YK Sugi 原文&#xff1a;http://t.cn/EZAElk0Hi&#xff0c;大家好&#xff01;不久前&#xff0c;我参观了加拿大温哥华的D-Wave Systems公司&#xff0c;这是一家制造前沿量子计算机的公司。我在那里学到了很多关于量子计算机的知识&a…

CodeForces616:Educational Round 5

文章目录前言A Comparing Two Long Integers\text{A Comparing Two Long Integers}A Comparing Two Long IntegersDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeB Dinner with Emma\text{B Dinner with Emma}B Dinner with Emm…

CF1534F2-Falling Sand (Hard Version)

正题 题目链接:https://www.luogu.com.cn/problem/CF1534F2 题目大意 有一个n∗mn*mn∗m个网格&#xff0c;有的网格上有沙子&#xff0c;一个沙子被刷新后会下落到底并且刷新沿途中四周四连通的沙子&#xff0c;你可以选择一些沙子手动刷新。 现在要求第iii列至少有aia_iai…

数据结构二之线段树Ⅱ——KiKi‘s K-Number,ball,The Child and Sequence,「雅礼集训 2017 Day1」市场,Atlantis

值域线段树势能线段树扫描线KiKis K-NumberballThe Child and Sequence「雅礼集训 2017 Day1」市场AtlantisKiKi’s K-Number HDU-2852 权值线段树维护插入删除很简单 对于查询大于xxx的第kkk个&#xff0c;可以不用二分&#xff0c;转化一下 先查小于等于xxx的个数cntcntc…

Codeforces Round #721 (Div. 2)

Codeforces Round #721 (Div. 2) 题号题目难度知识点AAnd Then There Were KBPalindrome Game (easy version)CPalindrome Game (hard version)DSequence Pair WeightEMEX TreeFPartition Game

解决Azure DevOps部署到Azure后.NET Core网站无法启动的问题

点击上方蓝字关注“汪宇杰博客”最近我遭遇了一个奇怪的问题。使用Azure DevOps配置CI/CD管线&#xff0c;自动部署到Azure App Service以后&#xff0c;.NET Core的网站竟然会启动失败。我们来看看如何解决这个问题。查找问题首先&#xff0c;幸好&#xff0c;这是个staging环…

CF1286E-Fedya the Potter Strikes Back【KMP,RMQ】

正题 题目链接:https://www.luogu.com.cn/problem/CF1286E 题目大意 定义一个字符串sss的权值为对于每个sL∼Rs1∼R−L1s_{L\sim R}s_{1\sim R-L1}sL∼R​s1∼R−L1​的区间&#xff0c;会产生min⁡iLRwi\min_{iL}^Rw_iminiLR​wi​的贡献。 现在开始时sss为空串&#xff0c…

模板:二维凸包(计算几何)

所谓凸包&#xff0c;就是一个凸出来的包 &#xff08;逃&#xff09; 前言 计算集合的第一课。 关键特征&#xff1a;周长最小。此时一定是凸包。 解析 定义 凸包&#xff1a;在平面上能包含所有给定点的最小凸多边形叫做凸包。 性质&#xff1a;凸包的周长是所有能包含给…

[AtCoder Beginner Contest 215] A-G题解

文章目录A - Your First JudgeB - log2(N)C - One More aab aba baaD - Coprime 2E - Chain ContestantF - Dist Max 2G - Colorful Candies 2atcoder题目链接 A - Your First Judge 签到题 #include <cstdio> #include <iostream> using namespace std; string…

Acwing 135 最大子序和

Acwing 135 最大子序和 题目&#xff1a; 输入一个长度为 n 的整数序列&#xff0c;从中找出一段长度不超过 m 的连续子序列&#xff0c;使得子序列中所有数的和最大。 题解&#xff1a; 我们把这个问题的集合分成n份&#xff0c;第k份表示以A[k]结尾的最大连续子序列是多少…

.net core自定义高性能的Web API服务网关

网关对于服务起到一个统一控制处理的作用&#xff0c;也便于客户端更好的调用&#xff1b;通过网关可以灵活地控制服务应用接口负载&#xff0c;故障迁移&#xff0c;安全控制&#xff0c;监控跟踪和日志处理等。由于网关在性能和可靠性上都要求非常严格&#xff0c;所以针对业…

微软宣布 Visual Studio 2019 将于4月2日正式发布

微软于去年发布了 Visual Studio 2019 预览版。今天&#xff0c;该公司宣布 Visual Studio 2019 正式版将于4月2日发布。微软在公告中表示&#xff1a;“欢迎加入我们在4月2号当天举办的 VS 2019 线上发布活动&#xff0c;这是一款更加现代化、创新且实用的生产力工具”。据悉&…