Pergunta

Nós fazemos um monte de processamento lexical com cordas arbitrárias que incluem pontuação arbitrária. Eu estou dividida quanto à possibilidade de usar magia caracteres / strings ou constantes simbólicas.

Os exemplos devem ser lidos como independente de linguagem, embora a maioria são Java.

Existem exemplos claros onde a pontuação tem um papel semântico e devem ser identificadas como uma constante:

File.separator não "/" ou "\\"; // um acéfalo como é OS-dependente

e eu escrevo XML_PREFIX_SEPARATOR = ":";

No entanto, digamos que eu preciso para substituir todos os exemplos de "" com uma string vazia ``. Eu posso escrever:

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

ou

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

(I definiram toda a pontuação comum, como S_FOO (string) e C_FOO (char))

Em favor de cordas mágicas / caracteres:

  1. É mais curto
  2. É natural para ler (às vezes)
  3. As constantes nomeadas pode não estar familiarizado (C_APOS vs '\'')

Em favor de constantes

  1. É mais difícil fazer erros (por exemplo "''" + '"' contraste com S_APOS+S_APOS + C_QUOT)
  2. Ele remove problemas escapando Se um regex ser "\\s+" ou "\s+" ou "\\\\s+"?
  3. É fácil de pesquisar o código de pontuação

(Há um limite para isso -.. Eu não iria escrever expressões regulares desta forma mesmo que a sintaxe regex é uma das partes mais cognitivamente disfuncional de toda a programação Acho que precisamos de uma sintaxe melhor)

Foi útil?

Solução

Se as definições podem mudar ao longo do tempo ou entre instalações, que tendem a colocar essas coisas em um arquivo de configuração, e pegar as informações na inicialização ou sob demanda (dependendo da situação). Em seguida, forneça uma classe estática com nomes de interface somente leitura e claras sobre as propriedades para expor as informações para o sistema.

Uso poderia ser assim:

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

Outras dicas

Para processamento geral corda , eu não iria usar símbolos especiais. Um espaço é sempre vai ser um espaço, e é apenas mais natural para ler (e escrever!):

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

Do que:

s.replace("String", S_SPACE);

Gostaria de ter um cuidado especial para usar coisas como "\ t" para representar abas, por exemplo, uma vez que eles não podem ser facilmente distinguidos dos espaços em uma string.

Como para coisas como XML_PREFIX_SEPARATOR ou FILE_SEPARATOR , você deve provavelmente nunca tem que lidar com constantes como que, desde que você deve usar uma biblioteca para fazer o trabalho para você. Por exemplo, você não deve ser mão-escrito: dir + FILE_SEPARATOR + filename, mas sim ser chamado:. file_system_library.join(dir, filename) (ou qualquer equivalente você está usando)

Desta forma, você não só tem uma resposta para coisas como as constantes, você vai realmente ficar muito melhor manipulação de vários casos de ponta que você provavelmente não está pensando agora

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top