Да, я действительно это сказал. Функция
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
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" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.
Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.
Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.
Примечание. Отправлять комментарии могут только участники этого блога.