Domanda

Facciamo molta elaborazione lessicale con stringhe arbitrarie che includono punteggiatura arbitraria. Sono diviso se usare caratteri / stringhe magiche o costanti simboliche.

Gli esempi dovrebbero essere letti come indipendenti dalla lingua sebbene la maggior parte sia Java.

Vi sono chiari esempi in cui la punteggiatura ha un ruolo semantico e dovrebbe essere identificata come costante:

File.separator non " / " o " \\ " ; // un gioco da ragazzi in quanto dipende dal sistema operativo

e scrivo XML_PREFIX_SEPARATOR = ": " ;

Comunque diciamo che devo sostituire tutti gli esempi di " " con una stringa vuota ``. Posso scrivere:

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

o

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

(Ho definito tutte le punteggiatura comuni come S_FOO (stringa) e C_FOO (carattere))

A favore di stringhe / personaggi magici:

  1. È più corto
  2. È naturale leggere (a volte)
  3. Le costanti con nome potrebbero non essere familiari ( C_APOS vs '\' ')

A favore delle costanti

  1. È più difficile fare errori di battitura (ad esempio contrasto " '' " + '"' con S_APOS + S_APOS + C_QUOT )
  2. Elimina i problemi di escape Se una regex deve essere " \\ s + " o " \ s + " o " \\\ \ s + "?
  3. È facile cercare la punteggiatura nel codice

(C'è un limite a questo: non scriverei regex in questo modo anche se la sintassi regex è una delle parti più cognitive dal punto di vista funzionale di tutta la programmazione. Penso che abbiamo bisogno di una sintassi migliore.)

È stato utile?

Soluzione

Se le definizioni possono cambiare nel tempo o tra le installazioni, tendo a mettere queste cose in un file di configurazione e raccogliere le informazioni all'avvio o su richiesta (a seconda della situazione). Quindi fornire una classe statica con interfaccia di sola lettura e nomi chiari sulle proprietà per esporre le informazioni al sistema.

L'utilizzo potrebbe essere simile al seguente:

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

Altri suggerimenti

Per l'elaborazione generale delle stringhe , non userei simboli speciali. Uno spazio sarà sempre uno spazio, ed è semplicemente più naturale leggere (e scrivere!):

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

Than:

s.replace("String", S_SPACE);

Presterei particolare attenzione ad usare cose come " \ t " per rappresentare le schede, ad esempio, poiché non possono essere facilmente distinte dagli spazi in una stringa.

Per quanto riguarda cose come XML_PREFIX_SEPARATOR o FILE_SEPARATOR , probabilmente non dovresti mai avere a che fare con costanti del genere, dato che dovresti usare una libreria fare il lavoro per te. Ad esempio, non dovresti scrivere a mano: dir + FILE_SEPARATOR + nomefile , ma piuttosto chiamare: file_system_library.join (dir, nomefile) (o qualunque equivalente tu stai usando).

In questo modo, non solo avrai una risposta per cose come le costanti, ma otterrai anche una gestione molto migliore di vari casi limite a cui probabilmente non stai pensando in questo momento

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top