FxCop: составное слово следует рассматривать как отдельный термин - PullRequest
32 голосов
/ 05 января 2010

FxCop хочет, чтобы я написал имя пользователя с большой буквы (т.е. имя пользователя), потому что это составное слово. Однако по соображениям согласованности нам нужно записать его в нижнем регистре n - так что либо имя пользователя, либо имя пользователя.

Я попытался настроить CodeAnalysisDictionary.xml, добавив в раздел следующий раздел:

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

Из того, что я понимаю, как работают пользовательские словари, это должно сказать FxCop обрабатывать имя пользователя как отдельный термин и предотвращать проверку CompoundWordsShouldBeCasedCorrectly (CA1702) для запуска ошибки.

К сожалению, это не работает. У кого-нибудь есть идея, почему это и как это решить? Я не хочу добавлять подавления, потому что это может серьезно загромождать файл GlobalSuppressions, поскольку встречается довольно много.

Отредактировано для добавления : В настоящее время я решил эту проблему с помощью GlobalSuppressions, но, учитывая природу проблемы, это не кажется идеальным способом решения этой проблемы. Кто-нибудь может дать подсказку, где искать дополнительную информацию о том, как FxCop применяет правила, определенные в словаре?

Ответы [ 2 ]

31 голосов
/ 12 января 2010

Я был разработчиком в группе анализа FxCop / Managed Code в течение 3 лет, и у меня есть ваш ответ. С тех пор все изменилось, и я точно забыл, как работает пользовательская обработка словарей, поэтому мне потребовалось немало времени, чтобы понять это. :)

Резюме

Краткий ответ: вам нужно удалить все ссылки на имена пользователей, имена пользователей, имена пользователей и имена пользователей из C: \ Program Files (x86) \ Microsoft FxCop 1.36 \ CustomDictionary.xml.

Обычно я бы не рекомендовал это, так как это не требуется, но вы обнаружили, что я считаю ошибкой, и это единственный обходной путь, который я смог найти.

Полная история

ОК, теперь для длинного ответа ...

Правило имеет две различные проверки, которые работают следующим образом:

A. Проверьте составные слова, которые должны быть дискретными

  1. Разделить идентификатор на токены: например, FileName --> { "file", "name" }
  2. Проверка орфографии каждой соседней пары жетонов.
  3. Если проверка орфографии прошла успешно (например, filename считается верным словом),
    тогда мы нашли потенциальную проблему, так как одно слово не должно быть выражено как два жетона.
  4. Однако, если есть <Term CompoundAlternate="FileName">filename</Term> в разделе <Compound> пользовательского словаря это означает, что хотя filename - это слово, руководящие указания по проектированию (в основном, как намек на последовательность с уровнем техники в структуре, которая предшествует существованию правила) настаивают на этом должно быть записано как FileName, и поэтому мы должны подавить предупреждение.
  5. Кроме того, если в <DiscreteExceptions> есть запись <Term>filename</Term> раздел пользовательского словаря, то это означает, что, хотя «имя файла» Одним словом, это могут быть также два слова «файл» и «имя» в другом контексте. например Начать - это слово, но попросить пользователя изменить DoSomethingOnSet на DoSomethingOnset будет шумом, и поэтому мы должны подавить предупреждение.

B. Проверьте отдельные слова, которые должны быть составными:

  1. Взяв жетоны из А.1, проверьте каждый из них по отдельности на соответствие составу. термины в пользовательском словаре.
  2. Если есть совпадение, мы должны предупредить в соответствии с интерпретацией в шаге A.4.

Обратите внимание, что ваше предупреждение: Username должно быть UserName обнаружено в части B, которая не относится к разделу DiscreteExceptions, поэтому вы не можете подавить предупреждение, изменив этот раздел. Проблема заключается в том, что в пользовательском словаре по умолчанию есть запись о том, что правильный регистр для username всегда равен UserName. Его нужно как-то удалить или переопределить.

Жук

Теперь идеальным решением было бы оставить пользовательский словарь по умолчанию в одиночку, указать SearchFxCopDir=false в файле проекта, а затем объединить только те части пользовательского словаря по умолчанию, которые вы хотите использовать в используемом CustomDictionary.xml. для вашего проекта. К сожалению, это не работает, так как FxCop 1.36 игнорирует директиву SearchFxCopDir и всегда рассматривает ее как true. Я считаю, что это ошибка, но также возможно, что это было преднамеренное изменение, так как директива не задокументирована и не имеет соответствующего пользовательского интерфейса. Я, честно говоря, не знаю ...

Заключение

Учитывая, что FxCop всегда использует свой пользовательский словарь по умолчанию в дополнение к пользовательскому словарю проекта, единственным выходом для вас является удаление соответствующих записей из пользовательского словаря по умолчанию.

Если у меня будет возможность, я свяжусь с текущей командой по анализу кода, чтобы выяснить, действительно ли это ошибка, и сообщу здесь ...

3 голосов
/ 12 января 2010

В пользовательском словаре, который поставляется с FxCop (находится в моей системе в C: \ Program Files \ Microsoft FxCop 1.36 \ CustomDixtionary.xml , но YMMV) в Words \ Compounds, есть запись <Term CompoundAlternate="UserName">username</Term> , Удали это. Вам все еще нужно дискретное исключение.

...