【问题标题】:FxCop: Compound word should be treated as discrete termFxCop:复合词应视为离散项
【发布时间】:2011-01-01 16:24:22
【问题描述】:

FxCop 想让我用大写 N 拼写用户名(即用户名),因为它是一个复合词。然而,由于一致性的原因,我们需要用小写的 n 来拼写 - 所以无论是用户名还是用户名。

我尝试通过将以下部分添加到该部分来调整 CodeAnalysisDictionary.xml:

<DiscreteExceptions>
  <Term>username</Term>
</DiscreteExceptions>

据我了解自定义词典的工作原理,这应该告诉 FxCop 将用户名视为一个离散术语,并防止 CompoundWordsShouldBeCasedCorrectly (CA1702) 检查引发错误。

不幸的是,这不起作用。有谁知道为什么会这样以及如何解决这个问题?我不想添加抑制,因为这会严重混淆 GlobalSuppressions 文件,因为出现的次数很多。

编辑添加:目前我已经通过使用 GlobalSuppressions 解决了这个问题,但考虑到问题的性质,这似乎不是解决这个问题的理想方法。任何人都可以提示在哪里寻找有关 FxCop 如何应用字典中定义的规则的更多信息?

【问题讨论】:

  • 您确定 FxCop 正在加载和使用您的文件 - 例如,它是否正在应用其他规则?
  • 你检查过这个问题吗? stackoverflow.com/questions/359290/…
  • @Jeff Sternal:我使用了现有的 CodeAnalysisDictionary.xml,它已经进行了自定义。我刚刚删除了一些现有条目,正如预期的那样,我现在收到了更多警告,因此通常 FxCop 可以识别字典并正确应用附加术语和单词。 @Austin Salonen:是的,我做到了,但我找不到任何适用于我的具体问题的东西。字典本身可以工作,但它似乎并没有像我期望的那样将用户名视为一个离散的术语。

标签: c# fxcop


【解决方案1】:

我在 FxCop / 托管代码分析团队担任了 3 年的开发人员,我有你的答案。从那时起事情已经发生了变化,我已经忘记了自定义字典处理是如何工作的,所以我花了很多时间来弄清楚这一点。 :)

执行摘要

简短的回答是,您需要从 C:\Program Files (x86)\Microsoft FxCop 1.36\CustomDictionary.xml 中删除对用户名、用户名、用户名和用户名的所有引用。

通常情况下,我不建议这样做,因为它不是必需的,但是您发现了我认为是错误的地方,这是我能找到的唯一解决方法。

全文

好的,现在是 long 答案...

该规则有两个不同的检查,其工作方式如下:

A.检查应该是离散的复合词

  1. 将标识符拆分为标记:例如FileName --&gt; { "file", "name" }
  2. 拼写检查每对相邻的标记。
  3. 如果拼写检查成功(例如,filename 被认为是一个有效单词),
    那么我们发现了一个潜在的问题,因为一个单词不应该表示为 两个令牌。
  4. 但是,如果有&lt;Term CompoundAlternate="FileName"&gt;filename&lt;/Term&gt; 在自定义字典的&lt;Compound&gt; 部分中,则表示 尽管filename 是一个词,但设计指南(主要是对一致性的认可 框架中的现有技术早于规则的存在)坚持它 应该写成FileName,所以我们必须禁止警告。
  5. 另外,如果&lt;DiscreteExceptions&gt; 中有&lt;Term&gt;filename&lt;/Term&gt; 条目 自定义字典的部分,那么它的意思是虽然“文件名”是 一个词,在不同的上下文中也可能是两个词“文件”和“名称”。例如 Onset 是一个词,但要求用户将DoSomethingOnSet 更改为 DoSomethingOnset 会是噪音,所以我们必须抑制警告。

B.检查应该是复合词的离散词:

  1. 从 A.1 中取出标记,根据一组化合物分别检查每个标记 自定义词典中的术语。
  2. 如果匹配,我们必须按照步骤 A.4 中的解释进行警告。

请注意,您的警告:Username 应该是 UserName 在 B 部分中检测到,该部分未参考 DiscreteExceptions 部分,这就是您无法通过修改该部分来抑制警告的原因。问题是默认的自定义字典有一个条目指出username 的正确大小写始终是UserName。需要以某种方式删除或覆盖它。

虫子

现在,理想的解决方案是不理会默认自定义字典,在项目文件中指定 SearchFxCopDir=false,然后在使用的 CustomDictionary.xml 中仅合并默认自定义字典的部分为您的项目。遗憾的是,这不起作用,因为 FxCop 1.36 忽略了 SearchFxCopDir 指令并始终将其视为 true。我认为这是一个错误,但也有可能是故意更改,因为该指令没有记录在案并且没有相应的 UI。老实说,我不知道...

结论

鉴于 FxCop 始终使用其默认自定义字典以及项目自定义字典,您唯一的办法就是从默认自定义字典中删除相关条目。

如果有机会,我会联系当前的代码分析团队,看看这是否真的是一个错误,并在这里报告......

【讨论】:

  • 感谢您的详细回答。这证实了我的怀疑,但在 FxCop 检查规则时获得一些有关 FxCop 工作原理的信息是件好事。
  • @Nick:阅读您的摘要,如果我添加一个 条目和一个 条目,我应该能够同时拥有两个版本而不会发出警告。我读对了吗?
【解决方案2】:

在 FxCop 附带的自定义词典中(位于我的系统中 C:\Program Files\Microsoft FxCop 1.36\CustomDixtionary.xml,但 YMMV)在 Words\Compounds 中有一个 &lt;Term CompoundAlternate="UserName"&gt;username&lt;/Term&gt;入口。删除它。您仍然需要离散异常。

【讨论】:

  • 感谢您的回答。我将尼克的答案标记为接受的答案,因为它更详细。但是,我认为您的解决方案几乎相同。
  • @Nick 如果我们要消除复合替代品,那么它不会自动算作离散异常。
  • @Wilhelm。我之前对为什么不需要离散异常的解释是错误的。谢谢你指出这一点。我已删除该评论,因为它只会使其他人感到困惑。但是,在这种情况下仍然不需要离散异常,因为 OP 希望将用户名表示为单个令牌。离散例外仅适用于上述规则的 A 部分,它只能在一对相邻的令牌上触发。
  • 我应该补充一点,如果您希望 FxCop 同时接受用户名和用户名,那么是的,您确实需要离散异常。我不相信这是 OP 想要的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 2018-08-04
  • 2014-01-22
  • 1970-01-01
  • 2022-07-26
  • 2020-04-06
  • 2017-03-01
相关资源
最近更新 更多