Avoid String Concatenation

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

Это «конкатенация строк», и это плохая практика.

Почему? Некоторые могут сказать, что это медленно, главным образом из-за того, что части результирующей строки копируются несколько раз. Действительно, при каждом операторе + класс String выделяет новый блок в памяти и копирует в него все, что у него есть, плюс добавляет суффикс. Это верно, но это не суть здесь.

На самом деле, я не считаю производительность в этом случае большой проблемой. Более того, были произведены несколько экспериментов, показывающих, что конкатенация не так медленна по сравнению с другими методами построения строк и иногда даже быстрее.

Некоторые говорят, что конкатенированные строки не могут быть локализованы, потому что в разных языках текстовые блоки в фразе могут находиться в разном порядке. Приведенный выше пример не может быть переведен, скажем, на русский язык, где мы хотели бы поставить имя перед “привет”. Нам придется локализовать весь блок кода, а не просто перевести фразу.

Однако, моя точка здесь другая. Я настоятельно рекомендую избегать конкатенации строк, потому что она менее читаема по сравнению с другими методами объединения текстов.

Давайте рассмотрим эти альтернативные методы. Я рекомендую три из них (в порядке предпочтения): String.format(), Apache StringUtils и Guava Joiner.

Есть также StringBuilder, но я не считаю его таким привлекательным, как StringUtils. Это полезный построитель строк, но не подходящий заменитель или инструмент для конкатенации строк, когда важна читаемость.

String.format() - мой любимый вариант. Он позволяет легко понимать и изменять текстовые фразы. Это статический вспомогательный метод, который отражает sprintf() из C. Он позволяет создавать строку с использованием шаблона и заменителей.

Когда текст становится длиннее, преимущества форматировщика становятся гораздо более очевидными. Взгляните на этот уродливый код:

Он выглядит намного красивее, правда (у jSparrow даже есть правило для этого).

Пожалуйста, обратите внимание, что я использую индексы аргументов, чтобы сделать шаблон еще более локализуемым. Допустим, я хочу перевести его на греческий. Вот как это будет выглядеть:

Я меняю порядок замен в шаблоне, но не в фактическом списке аргументов методов.

Когда текст довольно длинный (длиннее ширины вашего экрана), я рекомендую использовать утилитарный класс StringUtils из Apache commons-lang3.

Необходимость добавления дополнительной зависимости JAR в ваш путь классов может рассматриваться как недостаток этого метода (получите его последние версии в Maven Central).

Guava Joiner

Подобные функции предоставляет Joiner из Google Guava.

Это немного менее удобно, чем StringUtils, так как вам всегда приходится указывать разделитель (символ или строка, размещаемые между блоками текста).

Опять же, в этом случае требуется зависимость.

Да, в большинстве случаев все эти методы работают медленнее, чем простое объединение. Однако, я твердо верю в то, что компьютеры дешевле людей. Я имею в виду, что время, затраченное программистами на понимание и изменение некрасивого кода, намного дороже, чем стоимость дополнительного сервера, который позволит более эффективно работать красиво написанному коду.

Если вы знаете другие методы избежания конкатенации строк, пожалуйста, оставьте комментарий ниже.

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-17 at 14:48

sixnines availability badge   GitHub stars