Подтвердить что ты не робот

Должны ли мы хранить строки формата в ресурсах?

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

string someString = string.Format("{0}{1}{2}: Some message. Some percentage: {3}%", token1, token2, token3, number); 

Вместо жесткого кода строка, я думал переместить ее в ресурсы проекта:

string someString = string.Format(Properties.Resources.SomeString, token1, token2, token3, number); 

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

Как мне обойти это? Является ли строка жесткого кодирования необходимым злом в этом случае?

4b9b3361

Ответ 1

Я думаю, что это необходимое зло, которое я часто использовал. Что-то вонючее, что я делаю, это:

// "{0}{1}{2}: Some message. Some percentage: {3}%"
string someString = string.Format(Properties.Resources.SomeString
                                  ,token1, token2, token3, number);

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

Ответ 2

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

Если вы используете строки ресурсов, нужно иметь в виду несколько вещей.

  • Вводите строки формата, когда это возможно, в набор строк ресурсов, которые вы хотите локализовать. Это позволит переводчику переупорядочить позицию форматированных элементов, чтобы они лучше соответствовали контексту переведенного текста.

  • Избегайте наличия строк в ваших токенах формата, которые находятся на вашем языке. Лучше использовать это для чисел. Например, сообщение:

    "Указанное вами значение должно быть между {0} и {1}"

    отлично, если {0} и {1} - числа, такие как 5 и 10. Если вы форматируете строки, такие как "пять" и "десять", это затруднит локализацию.

  • Вы можете решить проблему чтения, о которой вы говорите, просто называя свои ресурсы хорошо.

    string someString = string.Format(Свойства .Resources.IntegerRangeError, minValue, maxValue);

  • Оцените, генерируете ли вы видимые строки пользователя с правильным уровнем абстракции в вашем коде. В целом я склонен группировать все видимые пользователем строки в коде, максимально приближенном к пользовательскому интерфейсу. Если какой-либо код ввода-вывода низкого уровня должен содержать ошибки, он должен делать это с исключениями, которые вы обрабатываете в своем приложении и согласованных сообщениях об ошибках. Это также объединит все ваши строки, требующие локализации, вместо того, чтобы их перенести на весь ваш код.

Ответ 3

Одна вещь, которую вы можете сделать, чтобы помочь добавить жестко закодированные строки или даже ускорить добавление строк в файл ресурсов, - это использовать CodeRush Xpress, который вы можете скачать бесплатно здесь: http://www.devexpress.com/Products/Visual_Studio_Add-in/CodeRushX/

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

У Resharper есть аналогичная функциональность.

Ответ 4

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

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

Ответ 5

да, вы можете введите описание изображения здесь

new позволяет видеть, как

String.Format(Resource_en.PhoneNumberForEmployeeAlreadyExist,letterForm.EmployeeName[i])

это даст мне динамическое сообщение каждый раз

кстати, я использую ResXManager