Question

Nous effectuons beaucoup de traitements lexicaux avec des chaînes arbitraires incluant des signes de ponctuation arbitraires. Je suis divisé quant à l’utilisation de caractères / chaînes magiques ou de constantes symboliques.

Les exemples doivent être lus indépendamment du langage, même si la plupart sont en Java.

Il existe des exemples clairs où la ponctuation a un rôle sémantique et doit être identifiée comme une constante:

File.separator n'est pas "/" ou "," \\ "; ; // une évidence, car il dépend du système d'exploitation

et j'écris XML_PREFIX_SEPARATOR = "::" ;

Toutefois, supposons que je doive remplacer tous les exemples de "" " par une chaîne vide ``. Je peux écrire:

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

ou

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

(J'ai défini toutes les ponctuations courantes comme S_FOO (chaîne) et C_FOO (char))

En faveur des chaînes / caractères magiques:

  1. c'est plus court
  2. Il est naturel de lire (parfois)
  3. Les constantes nommées peuvent ne pas être familières ( C_APOS vs '\' ')

En faveur des constantes

  1. Il est plus difficile de faire des fautes de frappe (par exemple, contraste "'" "+ <" code> avec S_APOS + S_APOS + C_QUOT )
  2. Cela supprime les problèmes évidents Si une expression rationnelle est "\\ s +" ou "\ s +" ou "\\\ \ s + " ?
  3. Il est facile de rechercher le code de ponctuation

(Il y a une limite à cela. Je n'écrirais pas les expressions rationnelles de cette façon, même si la syntaxe des expressions rationnelles est l'une des parties les plus dysfonctionnelles sur le plan cognitif de toute programmation. Je pense que nous avons besoin d'une meilleure syntaxe.)

Était-ce utile?

La solution

Si les définitions peuvent changer avec le temps ou entre les installations, j’ai tendance à les mettre dans un fichier de configuration et à collecter les informations au démarrage ou à la demande (selon la situation). Ensuite, fournissez une classe statique avec une interface en lecture seule et des noms clairs sur les propriétés permettant d’exposer les informations au système.

L’utilisation pourrait ressembler à ceci:

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

Autres conseils

Pour le traitement général des chaînes , je n’utiliserais pas de symboles spéciaux. Un espace sera toujours un espace, et il est juste plus naturel de lire (et d'écrire!):

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

que:

s.replace("String", S_SPACE);

Je prendrais un soin particulier à utiliser des éléments tels que " \ t " pour représenter des tabulations, par exemple, car elles ne peuvent pas être facilement distinguées des espaces dans une chaîne.

En ce qui concerne des éléments tels que XML_PREFIX_SEPARATOR ou FILE_SEPARATOR , vous ne devriez probablement jamais avoir à traiter de telles constantes, car vous devriez utiliser une bibliothèque faire le travail pour vous. Par exemple, vous ne devriez pas écrire à la main: dir + FILE_SEPARATOR + nom de fichier , mais plutôt appeler: fichier_système_bibliothèque.join (rép, nom de fichier) (ou tout autre équivalent utilisez).

De cette façon, vous aurez non seulement une réponse pour des choses comme les constantes, mais vous obtiendrez en réalité une bien meilleure gestion des différents cas critiques auxquels vous ne pensez probablement pas pour le moment

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top