Подтвердить что ты не робот

FxCop: составное слово следует рассматривать как дискретный термин

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Резюме

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

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

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

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

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

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

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

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

  • Принимая маркеры из A.1, проверяйте каждый отдельно по отношению к набору соединений  терминов в пользовательском словаре.
  • Если есть совпадение, тогда мы должны предупредить в соответствии с интерпретацией на шаге A.4.

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

Ошибка

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

Заключение

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

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

Ответ 2

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