Использование магических строк или констант в обработке знаков препинания? - PullRequest
1 голос
/ 27 ноября 2009

Мы выполняем много лексических операций с произвольными строками, которые включают произвольную пунктуацию. Я разделен относительно того, использовать ли магические символы / строки или символические константы.

Примеры следует читать как независимые от языка, хотя большинство из них - Java.

Существуют четкие примеры, когда пунктуация играет семантическую роль и должна определяться как константа:

File.separator не "/" или "\\"; // ежу понятно, так как это зависит от ОС

и я пишу XML_PREFIX_SEPARATOR = ":";

Однако, скажем, мне нужно заменить все примеры "" пустой строкой ``. Я могу написать:

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

или

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

(все обычные знаки препинания определены как S_FOO (строка) и C_FOO (символ))

В пользу магических строк / персонажей:

  1. короче
  2. Естественно читать (иногда)
  3. Названные константы могут быть не знакомы (C_APOS против '\'')

в пользу констант

  1. Труднее сделать опечатки (например, контраст "''" + '"' с S_APOS+S_APOS + C_QUOT)
  2. Устраняет проблемы с выходом. Если регулярное выражение равно "\\s+" или "\s+" или "\\\\s+"?
  3. Легко найти код для пунктуации

(Для этого есть ограничение - я бы не стал писать регулярные выражения таким образом, даже если синтаксис регулярных выражений является одной из наиболее дисфункциональных частей всего программирования.

Ответы [ 2 ]

1 голос
/ 27 ноября 2009

Для общей обработки строк я бы не использовал специальные символы. Пробел всегда будет пробелом, и читать (и писать!) Более естественно:

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

чем:

s.replace("String", S_SPACE);

Я бы позаботился о том, чтобы использовать такие вещи, как "\ t", например, для представления вкладок, поскольку их трудно отличить от пробелов в строке.

Что касается таких вещей, как XML_PREFIX_SEPARATOR или FILE_SEPARATOR, вам, вероятно, никогда не придется иметь дело с такими константами, поскольку вы должны использовать библиотеку, чтобы сделать работу за вас. Например, вы не должны писать от руки: dir + FILE_SEPARATOR + filename, а должны звонить: file_system_library.join(dir, filename) (или любой эквивалент, который вы используете).

Таким образом, у вас будет не только ответ на такие вещи, как константы, вы фактически получите намного лучшую обработку различных крайних случаев, о которых вы, вероятно, не думаете сейчас

1 голос
/ 27 ноября 2009

Если определения могут меняться со временем или между установками, я склонен помещать эти вещи в файл конфигурации и собирать информацию при запуске или по запросу (в зависимости от ситуации). Затем предоставьте статический класс с интерфейсом только для чтения и очистите имена в свойствах для предоставления информации системе.

Использование может выглядеть следующим образом:

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