Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 215
Текст из файла (страница 215)
— Пословица Учет культурных различий — класс 1оса1е — именованные локализации— создание локализаций — копирование и сравнение локализаций— локализации й(оба1~) и с1авв1с() — сравнение строк — класс (псе1 — доступ " фасетам локализаций — простой определяем»ай пользователем фасет— стандартные фасеты — сравнение строк — ввод/вывод чисел — ввод/вывод денег — ввод/вывод дат и времени — низкоуровневые операции со временем— класс Па1е — классификация символов — преобразование кода символа— каталоги сообщений — советы — упражнения. Г.1. Учет культурных различий Объект 1оса1е (локализация) определяет набор культурных (нацпональных) особенностей, таких как способ сравнения строк, удобный для чтения формат вывода чисел и представление симврлов во внешней памяти. Понятие локализации расширяемо, так что программист может добавлять в локализацию новые фасеты' ((асе1) для отражения местных особенностей, не поддерживаемых стандартной библиотекой непосредственно, как, например, почтовые индексы и телефонные номера.
Основной задачей использования локализаций в стандартной библиотеке является управление отображением информации, записываемой в поток вывода (ов(геат), и форматамп, воспринимаемыми потоком ввода (1в1геат). В разделе ~ 2 В7 описано, как можно изменить локализацию для потока. В данном приложении рассказывается, как локализация конструируется из фасетов, и объясняются механизмы, посредством которых локализация воздействует на свой поток.
В приложении речь также идет об определении фасета, перечисляются стандартные фасеты, определяющие специфические свойства потока, изложены технологии реализации и использования локализаций и фасетов. При описании ввода~вывода ' Слово вфасет» означает грань яли аспект чего-либо, В контексте информационных технологий термин вфасет» означает совокупность сведений, которую при классификации удобно рассматривать как единое целое. Заинтересованный читатель может отыскать дальнейшие сведения о фасетной классификация пиформацци в Интернете илп в специализированной литературе. — Примеч, ред. 948 Приложение Г Локализация дат рассматриваются срелства стандартной библиотеки для представления даты н времени.
Обсуждение локализаций и их фасетов организовано следующим образом: 9 Г.1. Вводит основные илеи представления культурных различий с помощью локализаций. 6 Г.2, Описывает класс 1оса1е (локализация). Ь Г.З. Описывает класс )асе1 (фасет локализации), 6 Г.4. Содержит обзор стандартных фасегов с указанием деталей каждого из них: 9 ГА.1. Сравнение строк. з Г.4.2. Ввол н вывод числовых значений. 9 ГА.З. Ввод и вывод денежных значений.
9 ГАА. Ввод и вывод дат п времени. 9 Г.4.5. Класснфикацнялспмволов. 9 ГА.6. Преобразования кодов сигиволов, 8 ГА.7. Каталоги сообщений. Понятие локализапни не является «собственностью» С+» — в большинстве опе- рационных систем и сред разработки приложений имеются подобные понятия. В принципе, локализация используется в системе всеми программами совместно, неза- висимо от того, на каком языке программирования они написаны.
Таким образом. идею локализации стандартной библиотеки можно рассматривать в качестве стан- дартного и переносимого способа доступа из программ на С»«к информации, имею- щей существенно различное представление в различных системах. Среди прочего, класс 1оса1е С»+ является общим интерфейсом к системной информации, представ- ленной несовместимым образом в различных системах. Г.1.1. Программирование культурных различий Подумаем о написании программы, которой придется пользоваться в нескольких странах. Стиль написания подобных программ часто называют «ннтернационализацией» (делая акпент на использовании программы во многих странах) или «локализацией» (упирая на адаптацию программы к местным условиям).
Многие объекты, которыми манипулирует программа, в различных странах принято выводить по-разному. Мы можем написать процедуры ввода/вывода с учетом этих требований. Например: ооЫрппс аа/е(сопя()ла1ей ей // вывод в подходлщел~ форлате ( ящ/Гсд(тЬеге ат 7) ( // определенный пользователем индикатор с»пиля саяеВК: // например, 7. тиг)я/999 соиГ «й.дау() « '. ' «ЙЬ топгЬ(с( топеЬ()) « ' «ссуеагЦ Ьгеай; саяе с/К: //например, 7/3/ )999 соиГ «Ил(ау() « ' / «д.топ/Ь() « " / ' «д.уеаг(); Ьгеай; саяе (Л.
// например, 3/7/(999 соиЕ «д топГЬ() « /' «д.с(ау() « '/' «д уеас() Ьгеай; // -. Г1, Учет культурных различий 949 Такой подход решает задачу. Однако это скверный стиль, причем нам придется последовательно его придерживаться, чтобы корректно адаптнронать весь вывод к местным особенностям.
Хуже того, если мы захотим добавить новый способ записи даты, придется модифицировать код. Казалось бы, с проблемой можно справиться путем создания иерархии классов (9 12 2А). Однако сама информация в 0а1е не зависит от того, в каком виде мы хотим ее видеть. Поэтому нам пе подходит иерархия типов !ла1е, наподобие с!5 !ла1е, ЬК Юа1е и ЯР Ва1е. Мы хотели бы располагать разнообразными способами вывода дат: «вывод в американском стиле», «вывод н английском стиле».
«вывод в японском стиле» и т. дл см. 9 П4А,5. Подход «пусть пользователь пишет функции ввода/вывода, учитывающие культурные различия» порождает и другие трудности: [1[ Без помощи стандартной библиотеки программист, пишущий приложение, не может изменить «ннешний внд» встроенных типов достаточно простым, переносимым и эффективным способом. [2! Поиск каждой операции ввода/вывода (и каждой операции, готовящей данные для ввода/вывода с учетом местных особенностей) в большой программе не всегда осуществим. [3[ Иногда у нас нет возможности переписать программу с учетом новых соглашений, но даже если бы и была, мгя бы предпочли иное решение, не требующее переписывания кода.
[4[ Слишком накладно заставлять всех пользователей разрабатывать и реализовывать учет культурных особенностей. [5[ Различные программисты по-разному будут реализовывать низкоуровневые национальные особенности, и программы, работающие с одной и той же информацией, будут отличаться без существенных на то причин. Таким образом, программистам, сопровождающим код из различных источников, придется изучить множество программных соглашений. Довольно утомительно и сопряжено с ошибками.
Стандартная библиотека предоставляет расширяемый способ учета национальных соглашений. На эту схему работы опирается библиотека потоков ввода/вывода (9 21.7), обрабатывая как встроенные, так и определяемые пользователем типы. Например, рассмотрим простой цикл копирования пар (Ва1е, с(оиб!е[, которые могут представлять собой последовательные измерения нли транзакции: оо!д срд(!в!сват& ип ов1геат& ов( О копировамие потока пар (дата, число) ( !!аге с1, с!оид!е оо!ите, тол!! е (!в» д» оо! ите( ов «Ы « ' ' «оо!оте «за'; > Само собой разумеется, реальная программа выполнила бы какие-нибудь операции над записями н, в идеале, хоть чуть-чуть позаботилась бы об обработке ошибок.
Как заставить эту программу прочитать файл, соответствующий французским соглашениям (для отделения дробной части используется запятая; например, !2,5 означает «двенадцать с половиной»), и переписать его н американском формате? Мы можем определить локализации и операции ввода/вывода так, чтобы функцию срд(( можно было применить для преобразования между двумя форматами: Приложение Г Локализация 950 оо!а Я!з/геалпй/!гл, ое!геатй !ои! ( Яп.!тбие(!оса!е~'еп ((3 )1( )ои!, ни Ьие~!оса!юг" /1 сру//(п,тои!); !з!геатй71п2, оз!геатй~ои!21 О американский английскш/ О французский 7/ ипение на американском английсколь О запись на французскол~ ~т2 !гпбие~!оса!е/"~т" /1 !ои!2!тЬие(!оса!е/'еп ((3"/( сру///п2,7ои/21 77 французский 7/ американский английский 77 чтение на французскояс О запись на американскоял английском Пусть имеются потоки; Арг/2, 1999 Арг (3, (999 Арг(4, /999 1000.3 345.45 9б88.321 3 (и//е/ (950 10,3 Зри!!е/ 1951 /34,45 3/гй//е( (952 57,9 на выходе программы будет: /2 асьl 1999 /000,3 ! 3 аии! /999 345,45 /4 аип(1999 9б88.321 .(и(у 3, 1950 яи/у 3, 195/ .Ыу 3, 1952 (0.3 /34.45 б7.9 Оставшаяся часть данного приложения в основном описывает механизмы, делающие возможной подобную схему работы, и обьясняет, как их применять.
Отметим, что у болыпинства програмл!истов нет ни малейших причин разбираться в деталях локализаций. Многие программисты никогда явно не будут работать с !оса!е, а большинство из тех, что все-таки будут, просто извлекут стандартную локализацию и закрепят (пшЬце) ее за потоком (9 21.7). Механизмы создания локализаций и обеспечения простоты их использования представляют из себя небольшой язык программирования.
Если программа или система оказались успешны, они будут использованы людьми с потребностями и склонностями, которые проектировщики и программисты не предвидели. Большинство успешных программ будут исполнятся в странах, где (естественные) языки и наборы символов отличаются от тех, что знакомы проектировшикам и программистам. 1Пирокое использование программы является признаком успеха.
так что проектирование и программирование, нацеленные на преодоление языковых и культурных барьеров, являются подготовкой к успеху. Концепция локализации (интернационализации) проста. Но практические ограничения изрядно запутывают проектирование и реализацию !оса!е; (1~ В локализации пнкапсулированы культурные особенности, такие как форма отображения дат. Подобные соглашения неуловимым и несистематическим об- 951 Г2. Класс!оса)е разом отличаются друг от друга, Эти правила не имеют ничего общего с языками программирования, поэтому язык программирования не может их стандартнзовать. (2] Концепция локализации должна быть расширяемой, потому что невозможно перечислить все особенности, присущие разным культурам, н представляющие интерес для различных пользователей С+-ь.