利用 ReSharper 自定义代码中的错误模式,在代码审查之前就发现并修改错误

利用 ReSharper 自定义代码中的错误模式,在代码审查之前就发现并修改错误

发布于 2018-03-20 11:54 更新于 2018-03-20 12:35

多人协作开发的项目总会遇到代码编写风格上的差异。一般工具都能帮我们将常见的差异统一起来——例如 if 的换行;但也有一些不那么通用,但项目中却经常会出现的写法也需要统一。

例如将单元测试中的 Assert.AreEqual(foo.GetType(), typeof(Foo)); 换成 Assert.IsInstanceOfType(foo, typeof(Foo));

阅读本文将学习如何使用 ReSharper 的 Custom Pattern 功能来完成这样的警告和转换。


预览效果

我们团队中自定义了一个代码风格规范,在单元测试中 Assert.AreEqual(foo.GetType(), typeof(Foo)); 应该被换成 Assert.IsInstanceOfType(foo, typeof(Foo));。于是,ReSharper 会给出警告,并给出推荐的写法;如果遵循 ReSharper 的建议,ReSharper 将自动为我们修改代码。

▲ 给出警告,并提供建议

▲ 可以遵循建议

▲ 然后代码就被修改成我们建议的写法了

开始编写自定义模式

我们需要打开 ReSharper 的选项窗口,然后在里面找到“自定义模式”:

点击“Add Pattern”之后,我们就可以开始编写 Custom Pattern 了。

为了快速开始,可以将下面的两行代码分别复制到两个黑框中。(如果你只看到了一个黑框,请在右上角将“Find”按钮切换到“Replace”按钮。)

// 将下面这一句话复制到第一个黑色框中。
Assert.AreEqual($instance$.GetType(), typeof($type$));
// 将下面这一句话复制到第二个黑色框中。
Assert.IsInstanceOfType($instance$, typeof($type$));

这时,占位符框中就会出现我们编写的两个占位符:

▲ 占位符列表

我们需要将 instance 占位符从表达式修改为标识符:

解释一下这几项的意思:

  1. Argument Placeholder 参数占位符
    • 意味着这里是参数列表,可以是一个或多个参数,中间用逗号分隔。参数数量可以额外指定。
  2. Expression Placeholder 表达式占位符
    • 形如 foo.Bar(),注意,分号并不是表达式的一部分。
  3. Identifier Placeholder 标识符占位符
  4. Statement Placeholder 语句占位符
    • 形如 if (foo is null) throw new ArgumentNullException(nameof(foo));,注意,分号属于语句的一部分。
  5. Type Placeholder 类型占位符
    • 形如 Foo,或者 Walterlv.Demo.Foo

确定之后我们填写其他的信息:

  • Pattern severity:警告
    • 如果你需要,修改成“错误”也是可以的;事实上我们的项目中就是标记为错误,这样找出的代码就会是红色的错误下划线了。
  • Suppression key:AssertEqualToInstanceOfType
    • (可选)只有指定了用于阻止检查的标识字符串,才可以在特殊情况下用以下几种方法阻止检查;否则你将对错误无能为力。
      • // ReSharper disable once AssertEqualToInstanceOfType
      • [SuppressMessage("ReSharper", "AssertEqualToInstanceOfType")]
  • 上面的 Description:建议简化成 InstanceOfType 以提升可读性。
    • 这将在鼠标滑到找到的语句上面时给出提示。
  • 下面的 Description:简化成 InstanceOfType
    • 这将在在 Alt+Enter 时出现的重构列表中显示

设置完之后,“Edit Highlighting Pattern”窗口应该是这样的:

当然,在“Custom Pattern”列表中也可以统一设置所有模式的警告级别。

最后,把这些规则保存到团队共享中,那么所有安装了 ReSharper 的此项目的团队成员都将遵循这一套规则

自己动手,发掘潜能

Custom Pattern 功能只是为了给我们一个格式转换吗?才不止是这样哦!它能够帮助我们发现一些潜在的错误。

例如使用 MSTestEnhancer 进行单元测试时,如果使用了它推荐的单元测试风格,就应该配套使用 ContractTestCase 特性,如果不这么写,必定意味着错误。

于是,我们可以编写一个自定义模式来发现和修改这样的错误。

你认为可以怎么写呢?我在下面给出了我的写法。你还可以发掘出更多的潜能吗?非常期待!

本文会经常更新,请阅读原文: https://walterlv.com/post/analyze-and-fix-code-using-resharper-custom-pattern.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (walter.lv@qq.com)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏梧雨北辰的开发录

iOS面试知识总结之基本概念总结

凡经历过iOS面试的我们总会发觉,即使实际开发中做过许多项目,也难免为一个普通的面试题受挫。这也许不是因为我们技术不过关,而是因为在平时我们忽略了怎样将用到的知...

4127
来自专栏分布式系统和大数据处理

.Net 项目代码风格参考

代码风格没有正确与否,重要的是整齐划一,这是我拟的一份《.Net 项目代码风格参考》,供大家参考。

1482
来自专栏何俊林

Android Multimedia框架总结(十一)CodeC部分之AwesomePlayer到OMX服务

前言:上篇文《Android Multimedia框架总结(十)》总结了音视频的输出过程,从今天开始分析Codec部分,今天分析的是AwesomePlayer到...

2608
来自专栏ASP.NETCore

在.NET Core程序中设置全局异常处理

但是在.NET Core中并没有AppDomain的相关实现,至少在.NET Core最新的发布版本里没有。

1293
来自专栏华章科技

干货:手把手教你用Python读写CSV、JSON、Excel及解析HTML

导读:本文要介绍的这些技法,会用Python读入各种格式的数据,并存入关系数据库或NoSQL数据库。

2112
来自专栏王清培的专栏

.NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)

阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControl...

2456
来自专栏FreeBuf

Windows内核漏洞CVE-2016-0143分析

0x00 背景 4月20日,Nils Sommer在exploitdb上爆出了一枚新的Windows内核漏洞PoC。该漏洞影响所有版本的Windows操作系统,...

2376
来自专栏高爽的专栏

Hession反序列化导致CPU占用飙高

背景 今天发布一个线上服务,暂且称之为O,发布完后,依赖O服务的2个服务C和W大量Time报警,并且这两个服务的CPU占用都飙到了40%左右,平时只有10%的样...

4010
来自专栏Danny的专栏

System.Data.SqlClient.SqlException: 将截断字符串或二进制数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

3954
来自专栏老马寒门IT

Node入门教程(13)第十一章:mocha单元测试+should断言库+istanbul覆盖率测试+art-template

声明: 以下为老马的全栈视频教程的笔记,如果需要了解详情,请直接配合视频学习。视频全部免费,视频地址:https://ke.qq.com/course/2945...

1550

扫码关注云+社区

领取腾讯云代金券