Pregunta

Estoy seguro de que esto se ha hecho antes, pero en este ejemplo estoy curioso en cuanto a lo que los demás puedan ver utilidad en la separación de las constantes de este grado:

public class CoreStringConstants
 {
  // Common strings
  public const string SPACE = " ";
  public const string PERIOD = ".";
  public const string COMMA = ",";
  public const string COLON = ":";
  public const string SEMI_COLON = ";";
  public const string HYPHEN = "-";
  public const string UNDER_SCORE = "_";
  public const string LEFT_BRACKET = "(";
  public const string RIGHT_BRACKET = ")";
    public const string LEFT_SQUARE_BRACKET = "[";
    public const string RIGHT_SQUARE_BRACKET = "]";
    public const string LEFT_CURLY_BRACKET = "{";
    public const string RIGHT_CURLY_BRACKET = "}";
    public const string PIPE = "|";
    public const string CIRCUMFLEX = "^";
    public const string ASTERISK = "*";

... En serio?

¿Hay realmente ningún beneficio para la separación de este tipo de constantes de cadena a partir del código?

Cuando se utiliza el carácter para el asterisco va a cambiar en el curso de la vida previsible de la aplicación?

¿Fue útil?

Solución

En realidad, me gustaría considerar esta desventaja. Los beneficios son dudosos por decir lo menos, sobre todo porque no hay soporte para la agrupación de los literales de cadena de todos modos, y como desarrollador tendría que buscar el valor de cada constante cuando me encuentro con un código como éste por primera vez.

Además, alguien subir con código que lee

public const string COLON = "*";

Otros consejos

En el ejemplo que nos ha facilitado, las constantes son inútiles, porque como usted ha dicho, ASTERISK siempre va a ser *.

No tendría mucho más sentido que los nombre después de su propósito real. Por ejemplo, si se ha utilizado paréntesis para agrupar algo en sus cadenas, se podría escribir:

public const string GROUP_START = "(";
public const string GROUP_END = ")";

En este caso, tiene sentido porque los caracteres de agrupamiento podría cambiar mañana a, por ejemplo, entre corchetes.

No se puede pensar en una sola razón por la cual estas constantes de cadena deben ser definidos. Tal vez el autor original pensó que habría un ahorro de memoria mediante la definición de las cuerdas una vez, pero el compilador de C # es lo suficientemente inteligente como para cadenas Intern. (Por ejemplo, las constantes de cadena idénticas se salida una vez en la sección .DATA del montaje.)

var space1 = " ";
var space2 = " ";
Console.WriteLine(Object.ReferenceEquals(space1, space2));  // Outputs true

Así que no es sinceramente sin bien razón de CoreStringConstants.

Hay varias razones por las que alguien podría querer hacer esto (aunque no hay necesidad de gritar todas las constantes en este día y edad!). Sin embargo, es poco probable que haya muchos bien razones de las define particulares que usted ha enumerado.

  • Las diferentes codificaciones de caracteres puede significar que algunas de las constantes podría cambiar. Sí, es "posible" que en una codificación de caracteres en particular "asterisco" no es lo mismo que un ASCII "". Tal vez en China un carácter diferente puede ser preferible a "". ¿Es probable? Bueno, tal vez no ... pero tener estos valores en las constantes hará más fácil la refactorización.

  • Dependiendo del uso, utilizando una constante permite que el personaje que solía ser cambiado a través del código de refactorización más fácil. Sin embargo, en este caso yo diría que esas constantes están mal nombrados (por ejemplo, si una llave representa el inicio de un ámbito, "empezar alcance" sería un nombre mejor que el "corchete", lo que le permite redefinir el sistema para su uso ( por ejemplo) soportes en ángulo en lugar de llaves para iniciar un alcance sin el nombre de la constante de convertirse confundir)

  • El programador puede haber pensado que podría refactorizar a utilizar cadenas o caracteres en el futuro, y mediante el uso de constantes, esta elección es más fácil de refactorizar más tarde. Por supuesto, uno debe tener más confianza en los diseños de uno que eso: -)

  • Tal vez el programador piensa que las constantes hará que todas las cuerdas para ser compartidos en lugar de duplicarse. Cadena internar por lo general hace de esto una optimización innecesaria.

  • Las constantes con nombre son a menudo más significativa que las constantes mágicas entre líneas, y son menos propensos a errores tipográficos - esta es la única razón por la "buena" se me ocurre

  • .

No, esto no ayuda, pero esto puede provenir de los consejos de asignación de la sección 12.7 Constantes con nombre completo de Steve McConnell . En concreto, escribe

  

Evita literales, aunque sean "seguros" En el siguiente bucle ¿qué piensa el 12 representa?

     

Ejemplo de Visual Básico del Código poco claro

     

Para i = 1 a 12

   profit( i ) = revenue (i ) = expense ( i )
     

Siguiente

Luego más tarde muestra que sería mejor sustituir 12 con NUM_MONTHS_IN_YEAR o para hacer from Month_January to Month_Decemener

Eso es todo muy bien, pero el consejo no puede hacer una excepción para cuando se está utilizando un cadena para que tenga significado y no son magia. Por ejemplo, cadenas SQL y expresiones regulares y cadenas HTML y CSS tienen un significado y el significado debe ser bien conocido para el usuario.

Este tipo de cosas parece ser un caso específico para esta pregunta

El único beneficio sería que la escritura CoreStringConstants.SPACE sería un poco más claro y menos propenso a errores tipográficos inadvertidas que " ". Aparte de eso no hay realmente ninguna buena razón para hacer algo así.

Como usted señala, ninguno de ellos va a cambiar, por lo que no hay tal razón para centralizar las definiciones.

Ah, y utilizando todo en mayúsculas para los identificadores es simplemente horrible.

que tienen las directivas de preprocesador alrededor de ellos se podría especificar diferentes conjuntos de ellos en función de su construcción. Esto sería útil en un grande entorno de procesamiento de texto que debe ser independiente del lenguaje (especialmente en los casos en que se utilizan los signos de puntuación diferente).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top