前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用 ReSharper 自定义代码中的错误模式,在代码审查之前就发现并修改错误

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

作者头像
walterlv
发布2018-09-18 13:50:28
1.5K0
发布2018-09-18 13:50:28
举报
文章被收录于专栏:walterlv - 吕毅的博客

利用 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 的选项窗口,然后在里面找到“自定义模式”:

Options
Options
Custom Patterns
Custom Patterns

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

Add Highlighting Pattern
Add Highlighting Pattern

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

代码语言:javascript
复制
// 将下面这一句话复制到第一个黑色框中。
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”窗口应该是这样的:

设置完的 Edit Highlighting Pattern 窗口
设置完的 Edit Highlighting Pattern 窗口

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

Warning
Warning

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

保存到团队
保存到团队

自己动手,发掘潜能

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

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

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

更复杂的例子
更复杂的例子

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

配置 MSTestEnhancer 的检查
配置 MSTestEnhancer 的检查

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-03-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 利用 ReSharper 自定义代码中的错误模式,在代码审查之前就发现并修改错误
    • 预览效果
      • 开始编写自定义模式
        • 自己动手,发掘潜能
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档