代码之家  ›  专栏  ›  技术社区  ›  Anne Schuessler

fxcop:复合词应被视为分立词条

  •  32
  • Anne Schuessler  · 技术社区  · 15 年前

    fxcop希望我用大写N(即用户名)拼写用户名,因为它是一个复合词。但是,由于一致性的原因,我们需要用小写的N来拼写它,所以可以是用户名或用户名。

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

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

    根据我对自定义词典工作原理的理解,这应该告诉fxcop将用户名视为一个分立的术语,并防止复合词被正确地(ca1702)检查以引发错误。

    不幸的是,这行不通。有人知道为什么会这样吗?有人知道如何解决这个问题吗?我不想添加禁止显示,因为这会严重干扰GlobalSuppressions文件,因为会出现很多情况。

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

    2 回复  |  直到 11 年前
        1
  •  31
  •   Nick Guerrera    15 年前

    我是fxcop/托管代码分析团队的开发人员,有3年了,我知道您的答案。从我的时代起,事情就发生了变化,我完全忘记了自定义字典处理的工作原理,所以我花了不少时间来解决这个问题。:)

    执行摘要

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

    通常,我不建议这样做,因为不需要这样做,但您已经发现了我认为是bug的东西,这是我唯一能找到的解决方法。

    完整故事

    好的,现在 长的 回答…

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

    a.检查应离散的复合词

    1. 将标识符拆分为标记:例如 FileName --> { "file", "name" }
    2. 拼写检查每对相邻的标记。
    3. 如果拼写检查成功(例如 filename 被认为是一个有效的词,
      然后我们发现了一个潜在的问题,因为一个词不应该表示为 两个代币。
    4. 但是,如果 <Term CompoundAlternate="FileName">filename</Term> <Compound> 自定义词典的一部分,则意味着 虽然 文件名 是一个词,设计指南(主要是为了一致性) 在规则存在之前的框架中使用现有技术)坚持它 应该写为 FileName 所以我们必须压制警告。
    5. 此外,如果有 <Term>filename</Term> 进入 <DiscreteExceptions> 自定义词典的一部分,则意味着尽管“文件名”是 一个词,在不同的上下文中也可能是两个词“file”和“name”。例如 开始是一个词,但要求用户更改 DoSomethingOnSet DoSomethingOnset 可能是噪音,所以我们必须压制警告。

    b.检查应为复合词的离散词:

    1. 从A.1中获取令牌,根据组合集分别检查每个令牌。 自定义词典中的术语。
    2. 如果有匹配,则必须按照步骤A.4中的解释发出警告。

    注意您的警告: Username 应该是 UserName 在B部分中检测到,该部分不参考DiscreteExceptions部分,因此无法通过修改该部分来抑制警告。问题是,默认的自定义字典有一个条目,说明 username 总是 用户名 . 它需要以某种方式被删除或覆盖。

    臭虫

    现在,理想的解决方案是让默认的自定义字典单独存在,指定 SearchFxCopDir=false 在您的项目文件中,然后仅合并在用于项目的customDictionary.xml中所需的默认自定义字典的部分。遗憾的是,这并不适用于fxcop 1.36忽略searchfxcopdir指令并始终将其视为真。我相信这是一个bug,但也有可能这是一个有意的更改,因为该指令没有文档记录,也没有相应的UI。我真的不知道…

    结论

    考虑到fxcop除了使用项目自定义词典外,还始终使用其默认自定义词典,您唯一的方法是从默认自定义词典中删除有问题的条目。

    如果我有机会,我会联系当前的代码分析团队,看看这实际上是否是一个bug,然后在这里报告…

        2
  •  3
  •   Wilhelm    15 年前

    在fxcop附带的自定义字典中(位于我的系统中 C:\程序文件\Microsoft FxCop 1.36\CustomDixtionary.xml ,但ymmv)在单词\复合词中 <Term CompoundAlternate="UserName">username</Term> 条目。删除它。您仍然需要离散异常。