Pregunta

Hacemos muchos procesamientos léxicos con cadenas arbitrarias que incluyen puntuación arbitraria. Estoy dividido en cuanto a si usar caracteres mágicos / cadenas o constantes simbólicas.

Los ejemplos deben leerse como independientes del idioma, aunque la mayoría son Java.

Hay ejemplos claros en los que la puntuación tiene un papel semántico y debe identificarse como una constante:

File.separator no " / " o " \\ " ; // una obviedad ya que depende del sistema operativo

y escribo XML_PREFIX_SEPARATOR = ": " ;

Sin embargo, digamos que necesito reemplazar todos los ejemplos de " " con una cadena vacía ``. Puedo escribir:

s = s.replaceAll("\"\"", "");

o

s = s.replaceAll(S_QUOT+S_QUOT, S_EMPTY);

(He definido todas las puntuaciones comunes como S_FOO (cadena) y C_FOO (char))

A favor de cadenas / personajes mágicos:

  1. Es más corto
  2. Es natural leer (a veces)
  3. Las constantes nombradas pueden no ser familiares ( C_APOS vs '\' ')

A favor de las constantes

  1. Es más difícil hacer errores tipográficos (por ejemplo, contraste " '' " + '"' con S_APOS + S_APOS + C_QUOT )
  2. Elimina los problemas de escape Si una expresión regular es " \\ s + " o " \ s + " o " \\\ \ s + " ?
  3. Es fácil buscar el código para la puntuación

(Hay un límite para esto: no escribiría expresiones regulares de esta manera, aunque la sintaxis de expresiones regulares sea una de las partes más cognitivamente disfuncionales de toda la programación. Creo que necesitamos una sintaxis mejor).

¿Fue útil?

Solución

Si las definiciones pueden cambiar con el tiempo o entre instalaciones, tiendo a poner estas cosas en un archivo de configuración, y recoger la información al inicio o bajo demanda (según la situación). Luego proporcione una clase estática con interfaz de solo lectura y nombres claros en las propiedades para exponer la información al sistema.

El uso podría verse así:

s = s.replaceAll(CharConfig.Quotation + CharConfig.Quotation, CharConfig.EmtpyString);

Otros consejos

Para el procesamiento general de cadenas , no usaría símbolos especiales. Un espacio siempre será un espacio, y es más natural leer (¡y escribir!):

s.replace("String", " ");

Que:

s.replace("String", S_SPACE);

Tendría especial cuidado en usar cosas como " \ t " para representar pestañas, por ejemplo, ya que no se pueden distinguir fácilmente de los espacios en una cadena.

En cuanto a cosas como XML_PREFIX_SEPARATOR o FILE_SEPARATOR , probablemente nunca debas tener que lidiar con constantes como esa, ya que deberías usar una biblioteca hacer el trabajo por ti. Por ejemplo, no debe escribir a mano: dir + FILE_SEPARATOR + filename , sino llamar: file_system_library.join (dir, filename) (o cualquier otro equivalente) estamos utilizando).

De esta manera, no solo tendrá una respuesta para cosas como las constantes, sino que también obtendrá un mejor manejo de varios casos extremos en los que probablemente no esté pensando en este momento

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