понедельник, 13 декабря 2010 г.

SetLocaleInfo действительно плохо пахнет

Это перевод SetLocaleInfo really stinks. Автор: Майкл Каплан.

Да, я действительно это сказал. Функция SetLocaleInfo, которая появилась в NT 3.1 просто воняет.

Почему я так пренебрежительно говорю о функции, которая существует столько времени?

Ну, давайте начнём снаружи и двинемся вглубь...

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

(Конечно же есть и исключения, когда приложение делает такое изменение по указке пользователя. Так что может быть это не вина оружия, когда кто-то стреляет в другого человека. Если этот человек прицелился и выстрелил в другого человека, то это только его вина. Но оружие всё равно позволило совершить это преступление. Ведь оно могло стрелять водичкой!)

Ладно, давайте пока забудем про это. она также воняет из-за способа документирования. Документация перечисляет 32 типа LOCALE_*, которые могут быть изменены:
  • LOCALE_ICALENDARTYPE
  • LOCALE_ICURRDIGITS
  • LOCALE_ICURRENCY
  • LOCALE_IDIGITS
  • LOCALE_IDIGITSUBSTITUTION
  • LOCALE_IFIRSTDAYOFWEEK
  • LOCALE_IFIRSTWEEKOFYEAR
  • LOCALE_ILZERO
  • LOCALE_IMEASURE
  • LOCALE_INEGCURR
  • LOCALE_INEGNUMBER
  • LOCALE_IPAPERSIZE
  • LOCALE_ITIME
  • LOCALE_S1159
  • LOCALE_S2359
  • LOCALE_SCURRENCY
  • LOCALE_SDATE
  • LOCALE_SDECIMAL
  • LOCALE_SGROUPING
  • LOCALE_SLIST
  • LOCALE_SLONGDATE
  • LOCALE_SMONDECIMALSEP
  • LOCALE_SMONGROUPING
  • LOCALE_SMONTHOUSANDSEP
  • LOCALE_SNATIVEDIGITS
  • LOCALE_SNEGATIVESIGN
  • LOCALE_SPOSITIVESIGN
  • LOCALE_SSHORTDATE
  • LOCALE_STHOUSAND
  • LOCALE_STIME
  • LOCALE_STIMEFORMAT
  • LOCALE_SYEARMONTH
А затем она перескакивает к полному списку всех LCType. Что это? Дразнилка?

OK, давайте проигнорируем и это тоже и посмотрим на LCType. Тринадцать из них являются числами, но вам всё ещё нужно передавать их как строки. В GetLocaleInfo у вас есть флаг LOCALE_RETURN_NUMBER, чтобы вернуть данные в виде числа, но где же флаг LOCALE_SPECIFY_NUMBER? Не ищите его - его нет.

Давайте закроем глаза и на это и посмотрим теперь на параметр LCID. Функция проверяет, что это настоящий LCID (так что вы не можете передать абы что). Но после проверки функция просто игнорирует его и устанавливает значения для текущей пользовательской локали по умолчанию - единственной локали, которая сохраняет настройки пользователя. Тогда зачем нужно указывать LCID, если он не будет использоваться? Потому что эта функция - отстой, вот почему.

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

В итоге: пожалуйста, не используйте SetLocaleInfo. Это плохая, плохая функция.

This post brought to you by "ק" (U+05e7, a.k.a. HEBREW LETTER QOF)
Потому что этот пост является קשר לפסח в в ожидании праздников, которые начинаются менее чем за 24 часа с этого момента)

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

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