FxCop: Palabra compuesta debe ser tratada como término discreto


FxCop quiere que deletree Username con N mayúscula (es decir, UserName), debido a que es una palabra compuesta. Sin embargo, debido a razones de consistencia necesitamos deletrearlo con una n minúscula, por lo que ya sea nombre de usuario o Nombre de usuario.

He intentado ajustar el Codeanalysidictionary.xml añadiendo la siguiente sección a la sección:

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

Por lo que entiendo cómo funcionan los diccionarios personalizados, esto debería indicarle a FxCop que trate el nombre de usuario como un término discreto y evite compoundwordsshoudbecasedcorrectly (CA1702) comprobar para disparar un error.

Desafortunadamente esto no funciona. ¿Alguien tiene una idea de por qué es y cómo resolver esto? No quiero agregar supresiones, porque esto podría saturar seriamente el archivo GlobalSuppressions, ya que hay muchas ocurrencias.

Editado para agregar: Por el momento he resuelto esto usando GlobalSuppressions, pero dada la naturaleza del problema, esto no parece ser la forma ideal de resolver este. ¿Puede alguien dar una pista sobre dónde buscar más información sobre cómo FxCop aplica las reglas definidas en un diccionario?

 32
Author: Anne Schuessler, 2010-01-05

2 answers

Fui desarrollador en el Equipo de Análisis de Código Administrado de FxCop durante 3 años y tengo su respuesta. Las cosas han cambiado desde mi época, y había olvidado exactamente cómo funcionaba el manejo de diccionarios personalizados, por lo que me llevó bastante tiempo descifrarlo. :)

Resumen

La respuesta corta es que debe eliminar todas las referencias a nombre de usuario, nombres de usuario, nombre de usuario y nombres de usuario de C:\Program Archivos(x86) \ Microsoft FxCop 1.36\CustomDictionary.XML.

Normalmente, no recomendaría esto ya que no debería ser necesario, pero ha encontrado lo que creo que es un error, y esta es la única solución que pude encontrar.

Historia completa

OK, ahora para la larga respuesta...

La regla tiene dos comprobaciones distintas que funcionan de la siguiente manera:

A. Compruebe las palabras compuestas que deben ser discretas

  1. Dividir el identificador en tokens: por ejemplo, FileName --> { "file", "name" }
  2. Hechizo compruebe cada par adyacente de fichas.
  3. Si el corrector ortográfico tiene éxito (por ejemplo, filename se considera una palabra válida),
    entonces hemos encontrado un problema potencial ya que una sola palabra no debe ser expresada como dos fichas.
  4. sin Embargo, si hay un <Term CompoundAlternate="FileName">filename</Term> en la sección <Compound> del diccionario personalizado, entonces se entiende que aunque filename es una palabra, las directrices de diseño (en gran medida como un guiño a la coherencia con el estado de la técnica en el Marco que antecede a la existencia del regla) insista debe escribirse como FileName, por lo que debemos suprimir la advertencia.
  5. También, si hay una entrada <Term>filename</Term> en el <DiscreteExceptions> sección del diccionario personalizado, entonces se toma para significar que aunque 'filename' es una palabra, también podría ser dos palabras 'archivo' y 'nombre' en un contexto diferente. e. g. Inicio es una palabra, pero le pide al usuario que cambie DoSomethingOnSet a DoSomethingOnset sería ruido, por lo que debemos suprimir la advertencia.

B. Compruebe las palabras discretas que deben ser compuesto:

  1. Tomando los tokens de A. 1, verifique cada uno individualmente contra el conjunto de compuestos términos en el diccionario personalizado.
  2. Si hay una coincidencia, entonces debemos advertir de acuerdo con la interpretación en el paso A. 4.

Observe que su advertencia: Username debe ser UserName se detecta en la parte B, que no consulta la sección DiscreteExceptions, por lo que no puede suprimir la advertencia modificando esa sección. El problema es que el el diccionario personalizado predeterminado tiene una entrada que indica que la carcasa correcta para username es siempre UserName. Necesita ser eliminado o anulado de alguna manera.

El Error

Ahora, la solución ideal sería dejar solo el diccionario personalizado predeterminado, especificar SearchFxCopDir=false en su archivo de proyecto, y luego fusionar solo las partes del diccionario personalizado predeterminado que desee en el CustomDictionary.xml que se utiliza para su proyecto. Lamentablemente, esto no funciona ya que FxCop 1.36 ignora el Directiva SearchFxCopDir y siempre la trata como verdadera. Creo que se trata de un error, pero también es posible que se trate de un cambio intencional, ya que la directiva no está documentada y no tiene una interfaz de usuario correspondiente. Honestamente no lo sé...

Conclusión

Dado que FxCop siempre usa su diccionario personalizado predeterminado además del diccionario personalizado del proyecto, su único recurso es eliminar las entradas en cuestión del diccionario personalizado predeterminado.

Si tengo una oportunidad, Me pondré en contacto con el equipo de análisis de código actual para ver si esto en realidad es un error, e informaré aquí...

 31
Author: Nick Guerrera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-12 07:27:01

En el diccionario personalizado que viene con FxCop (ubicado en mi sistema en C:\Program Files \ Microsoft FxCop 1.36\CustomDixtionary.xml , pero YMMV) en Words\Compounds tiene una entrada <Term CompoundAlternate="UserName">username</Term>. Bórralo. Todavía necesitas la excepción discreta.

 3
Author: Wilhelm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-12 06:24:06