Да, в значительной степени.
Я думаю, что разработчики в статически типизированных языках имеют нездоровый страх перед чем-либо вообще динамичным. Практически каждая строка кода в динамически типизированном языке фактически является строковым литералом, и с ними все в порядке годами. Например, в JavaScript это технически:
var x = myObject.prop1.prop2;
Эквивалентно этому:
var x = window["myObject"]["prop1"]["prop2"]; // assuming global scope
Но это определенно не стандартная практика в JavaScript, чтобы сделать это:
var OBJ_NAME = "myObject";
var PROP1_NAME = "prop1";
var PROP2_NAME = "prop2";
var x = window[OBJ_NAME][PROP1_NAME][PROP2_NAME];
Это было бы просто смешно.
Это все еще зависит, хотя, например, если строка используется во многих местах и ее довольно громоздко / некрасиво набирать («имя» против «my-custom-property-name-x»), то, вероятно, стоит сделать константа, даже в пределах одного класса (в этот момент, вероятно, хорошо быть внутренне непротиворечивым внутри класса и сделать все остальные строковые константы тоже).
Кроме того, если вы действительно намерены взаимодействовать с вашей библиотекой другими внешними пользователями с помощью этих констант, то также неплохо определить общедоступные константы и документ, который пользователи должны использовать для взаимодействия с вашей библиотекой. Тем не менее, библиотека, которая взаимодействует с помощью магических строковых констант, обычно является плохой практикой, и вам следует подумать о том, чтобы спроектировать свою библиотеку таким образом, чтобы вам не приходилось использовать магические константы для взаимодействия с ней.
Я думаю, что в приведенном вами конкретном примере строки относительно просты для ввода, и, по-видимому, нет никаких внешних пользователей вашего API, которые могли бы работать с ним, используя эти строковые значения (т.е. они предназначены только для внутренних данных). манипуляция), читаемый код гораздо ценнее, чем код, пригодный для рефакторинга, поэтому я бы просто поместил литералы прямо в строку. Опять же, это предполагает, что я понимаю ваш конкретный вариант использования.
Одна вещь, которую никто, казалось, не заметил, это то, что как только вы определяете константу, ее объем становится чем-то, что нужно поддерживать и обдумывать. Это на самом деле имеет стоимость, это не бесплатно, как кажется, все думают. Учтите это:
Должно ли оно быть частным или публичным в моем классе? Что, если какое-то другое пространство имен / пакет нуждается в том же значении, я должен теперь извлечь константу в некоторый глобальный статический класс констант? Что, если мне теперь это нужно в других сборках / модулях, я могу извлечь его дальше? Все это делает код все менее читаемым, сложным в обслуживании, менее приятным для работы и более сложным. Все во имя рефакторизации?
Обычно эти "великие рефакторинги" никогда не происходят, и когда они это делают, они все равно требуют полного переписывания со всеми новыми строками. И если вы использовали какой-то общий модуль до этого великого рефакторинга (как в предыдущем абзаце), у которого не было этих новых строк, которые вам сейчас нужны, что тогда? Добавляете ли вы их в один и тот же общий модуль констант (что если у вас нет доступа к коду для этого общего модуля)? Или вы оставляете их локальными для вас, и в этом случае теперь существует несколько разбросанных репозиториев строковых констант, все на разных уровнях, с риском дублирования констант по всему коду? Как только вы дойдете до этой точки (и поверьте мне, что я видел это), рефакторинг станет спорным, потому что пока вы получите все ваши использования ваших констант, вы пропустите другие использования людьми их констант, даже если эти константы имеют то же логическое значение, что и ваши константы, и вы фактически пытаетесь изменить их все.