Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 215
Текст из файла (страница 215)
2. Следование стандарту само по себе не гарантирует переносимости; зС.2. 3. Избегайте неопределенного поведения (включая нестандартные расширения); 5С.2. 4. Локализуйте поведение, зависящее от реализации; 8С.2. 5. Используйте ключевые слова и диграфы в системах, в которых отсутствуют 1, 1, 1, ], ~ и .', а где отсутствует ~ — применяйте триграфы; 8С.З.1. 6. Для расширения круга восприятия текста программы используйте лишь символы А)ч 51; ЗС.З.З. 7. Числовому представлению символов предпочитайте езсаре-последовательности; 5С.3.2. 8. Не полагайтесь на знаковый или беззнаковый характер типа сйаг; ВС.3.4.
9. Если не уверены в типе целого литерала, явно применяйте необходимый суффикс; зС.4. 10. Избегайте неявных преобразований типа, приводящих к потере информации; $С.6. 11. Массивам предпочитайте тип вестона, ЗС.7. 12. Избегайте объединений; ЗС.8.2. 13. Применяйте битовые поля для представления частей заданной извне раскладки памяти; 8С.8.1. 14.
Выбирая между разными способами использования памяти, сопоставляйте друг с другом их достоинства и недостатки; вС.9. 15. Не засоряйте глобальное пространство имен; 8С.10.1. 16. Если требуется лишь ограниченная область видимости (модуль), а не тип, используйте пространства имен, а не классы; зС.10.3. 1006 Приложение С Технические подробности 17. Не забывайте определять статические члены классовых шаблонов; 8С.13.1. 18. Явно маркируйте типы в членах параметров шаблона с помошью ключевого слова 01аелялте; 8С.!3.5.
19. Если возникла необходимость в явной квалификации аргументами шаблона, применяйте ключевое слово гетир!ате для явного обозначения шаблонных членов класса; 8С.13.6. 20. Определяйте шаблоны, минимизируя их зависимость от контекста конкретизации; 8С.13.8. 21. Если конкретизация шаблона занимает слишком много времени, попробуйте конкретизировать их явным образом; 8С.13.10. 22. Если нужна предсказуемая последовательность компиляции частей программы, попробуйте применить явную конкретизацию; 8С.13.!О. Приложение 0 Локализация Находясь в Риме — поступай как Римлянин. — Поговорка Национальные особенности — класс 1оса1е — именованные локализации — создание локализаций — копирование и сравнение локализаций — контексты локализации б1ойИ ( ) и с!агз!с ( ) — класс /асег — доступ к фасетам локализаций— простой пользовательский фасет — стандартные фасеты — сравнение строк— ввод/вывод чисел — ввод/вывод денежных величин — ввод/вывод дат и времени — низкоуровневые операции со временем — класс Роге — классификация символов — преобразование кодов символов — сообщения — советы — упражнения.
0.1. Национальные особенности Объекты типа!оса!е (объекты локального контекста) призваны учитывать местные и национальные особенности программ, такие как сравнение и сортировка строк, формат вывода чисел и представление символов на внешних носителях. Для более глубокой локализации программ можно расширять!оса!е новыми фасетами (~осе!)), отражающими дополнительные национальные особенности, которые исходно не включены в стандартную библиотеку, например, почтовые индексы или телефонные номера. Объекты локализации в стандартной библиотеке в основном применяются для управления отображением выводимых в поток овггеат данных, а также для контроля формата данных, вводимых в рамках потока 1зггеат.
В разделе 521.7 рассказано, как изменить локализацию для потока; в данном приложении рассматривается, как объекты локализации конструируются из фасетов, а также объясняются механизмы влияния локализации на поток. Также здесь рассматривается определение фасетов, перечисляются стандартные фасеты, задающие специфические свойства потоков, изложены технологии реализации и приме- 1 Фасет — грань, аспект чего-либо.
— Прим. ред. 1ООВ Приложение(з. Локализация пения объектов 1оса1е и уасег. Стандартные библиотечные средства для представления даты н времени рассматриваются в контексте ввода/вывода. Весь этот материал организован следующим образом: ° в(3.1. Описывает основные идеи, касающиеся локализации программ под национальные особенности с помощью объектов 1оса1е. ° взз.2. Представляет класс 1оса1е.
° в0.3. Представляет класс!асег. ° вьз.4. Содержит обзор стандартных фасетов с описанием каждого из них: ° в().4.1. Сравнение строк. ° вО.4.2. Ввод и вывод числовых значений. ° в1).4.3. Ввод и вывод финансовой информации. ° з(3.4.4. Ввод и вывод дат и времени. ° вгз.4.5. Классификация символов. ° в1Э.4.6. Преобразование кодов символов. ° В1Э.4.7. Сообщения. Общее понятие локализации программ не относится непосредственно к языку С++.
Операционные системы и среды разработки также оперируют понятием локализации. В принципе, локализация системы относится ко всем программам независимо от того, на каком языке они написаны. Таким образом, понятие контекста локализации стандартной библиотеки С++ можно рассматривать как стандартный и переносимый способ доступа к информации, имеющей существенно различное представление в разных системах. 0.1.1. Программирование национальных особенностей Рассмотрим вопрос о написании программ, которые могут использоваться в разных странах. Особенности написания таких программ часто называют интернационализацией (!пгегпабопа1!са!юп) — когда внимание фокусируется на попытках обеспечить применение программы в нескольких странах), или локализацией (1оса11гагюп) — когда внимание фокусируется на попытке обеспечить наилучшую адаптацию программы к конкретным локальным (национальным) особенностям.
Многие объекты, которыми программа манипулирует, в разных странах принято выводить по-разному. Мы можем справиться с этой проблемой, учтя эти особенности в наших процедурах ввода/вывода: а) 77 рг!пг (п гйе арргорнаге)огтаг У пользовательский индикатор стиля !!например, 7 ! 37 !999 I " «ь(.топей () « " I " «И.уеаг() г 77 например, 377/! 999 иойг рнпг йазе (сопи Роге ь ( зиасй(пйеге ат !) ( сазе РК: сои! «й. йау ( ) « " Ьгеай; сазе ()К: сои! «й.аау() « " Ьгеайг сазе (7Я: !!например, 7, тигез !999 «Ый тогаЬ (а'.
топей () ) « " " «И.уеаг (); 0.1. Национальные особенности 1009 сот «4.тоигЬ () « "/" «Ф.еау() « "/" «Й.уеаг() г Ьгеал; У... Этот подход решает задачу. Однако он достаточно неуклюж, к тому же его нужно последовательно применять ко всему выводу, чтобы полностью выполнить адаптацию под локальные условия. Но хуже всего то, что если нам понадобится новый способ вывода даты, придется модифицировать исходный код.
Казалось бы, с проблемой можно справиться, создав иерархию классов (э12.2.4). Однако информация в 2)аге не зависит от способа, котором мы хотим ее выводить. Следовательно, нам не подходит иерархия типов 2гаге, например, УЯ Фаге, 1/К йие и ХР Иаге. Скорее, нам нужны разные способы вывода дат: например„вывод в американском стиле, вывод в британском стиле или вывод в японском стиле; см. эР.4.4.5. Иные проблемы возникают в рамках подхода «пусть пользователь сам пишет функции ввода/вывода, которые учитывают необходимые национальные особенности»: 1. Без помощи стандартной библиотеки прикладной программист вряд ли легко сможет изменить представление встроенных типов эффективным и переносимым образом. 2.
Нахождение каждой операции ввода/вывода (и каждой операции подготовки ввода/вывода с учетом национальных особенностей) в большой программе не всегда достижимо. 3. Иногда у нас нет возможности переписать программу для учета нового соглашения — а если и есть, то вряд ли это для нас будет приятным занятием. 4. Заставлять всех пользователей реализовывать учет разных национальных особенностей весьма накладно.
5. Разные программисты будут по-разному реализовывать низкоуровневые средства учета национальных особенностей, так что программы, работающие с одинаковой информацией будут различаться по случайным причинам. Из-за этого программистам, поддерживающим код, полученный из разных источников, придется знакомиться с самыми разными программными решениями, что не только утомительно, но и чревато ошибками. Как следствие, стандартная библиотека обеспечивает расширяемый способ учета национальных соглашений.
На эту схему работы опирается библиотека ввода/вывода (521.7) как для встроенных типов, так и для типов, определяемых пользователем. Рассмотрим для примера простой цикл копирования пар (Ваге, ИоиЫе), которые могут представлять совокупность измерений или транзакций: го(4 ору(1тгеата 1е, отгеата ое) Усору Щаге,доиЫе) тгеат ( )Зисе А еоиЫе го!итет влг(е(0»4»го1ите) ое «Ф « ' '«го1ите « ' ти'; зозо Приложение ().
Локализация Само собой разумеется. что настоящая программа будет что-нибудь делать с записями, а также будет более внимательна к обработке ошибочных ситуаций. Как заставить эту программу прочитать файл с французскими соглашениями (дробная часть отделяется с помощью запятой; например, !2,5 означает «двенадцать с половиной») и записать его в американском формате? Для этого мы можем предоставить объекты локального контекста и операции ввода/вывода так, что функция сру () будет выполнять преобразование между указанными соглашениями: го!43'(1ззгеат а 1т, отгеазп а моиз, изгеат ь Яп2, оззгеат а 3оиз2) ( 1зп.)тЬие(1оса(е ("еп 1/Б") ); //американский английский 3оиз.