2009-06-08 2 views
20

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

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); 

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

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

ответ

14

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

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

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

+5

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

+0

@CodingMonkey: согласовано. Сделайте жизнь так же легко для инженеров локализации, как вы можете. Вы не хотите догадки о переводе. –

+1

@MichaelPetrotta> Как бы вы стабилизировали код, чтобы эти строки {0} больше не нужны? Я лично думаю о том, чтобы не использовать 'string.Format', но использовать:' "begin {middle} end" .Replace ("{middle}", middle) '. Конечно, у этого подхода есть свои проблемы ... – Laoujin

2

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

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

+0

Да, это боль, но некоторая форма перенаправления почти необходима для локализации. Я работал на другой стороне этого забора, в локализации программного обеспечения и доверяю мне, вы * не * хотите отправить нам код. Или попробуйте объединить изменения обратно в код. –

+0

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

15

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

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

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

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

    «Значение, которое должно быть указано между {0} и {1}»

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

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

    string someString = string.Format (Properties.Resources.IntegerRangeError, minValue, maxValue);

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

3

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

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

Resharper имеет similar functionality.

+0

Это вряд ли долгосрочное решение. Ваш код по-прежнему будет заполняться 'Properties.Resources.SomeString'nnn, когда вы посещаете свой код ** после ** преобразования, например, во время обслуживания. – MickyD

+0

Этот комментарий был довольно старым. Однако 'Properties.Resources.SomeString' заключается в том, как вы могли бы получить доступ к строкам в проекте C# в то время, и локализация resource.dll во внешнем процессе была правильной. Вы не всегда хотите локализовать непосредственно двоичный файл, поэтому наличие текста в файле ресурса было ключевым. –

1

да вы можете enter image description here

новый позволяет увидеть, как

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

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

кстати я использованияКонтактная ResXManager

Смежные вопросы