Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Design Discussion

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 27. Boost.Program_options

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Design Discussion

Этот раздел посвящен некоторым вопросам дизайна.

Unicode Support

Поддержка Unicode была одной из функций, специально запрошенных во время официального обзора. На протяжении всего этого документа «Unicode support» является синонимом «wchar_t» поддержки, предполагая, что «wchar_t» всегда использует кодировку Unicode. Кроме того, говоря о «ascii» (в нижнем регистре), мы имеем в виду не строгое 7-битное кодирование ASCII, а скорее «char» строки в локальном 8-битном кодировании.

Как правило, «поддержка Unicode» может означать много вещей, но для библиотеки Program_options это означает, что:

  • Каждый парсер должен принять либо<char*>, либо<wchar_t*>, правильно разделить ввод на имена и значения опций и вернуть данные.

  • Для каждой опции должна быть возможность указать, использует ли преобразование из строки в значение ascii или Unicode.

  • Библиотека гарантирует, что:

    • ввод acii передается на значение acii без изменения.

    • Ввод Unicode передается на значение Unicode без изменения

    • ввод ascii передается значению Unicode, а ввод Unicode, передаваемый значению ascii, преобразуется с использованием аспекта codecvt (который может быть указан пользователем).

Важный момент заключается в том, что можно иметь некоторые «варианты ascii» вместе с «вариантами Unicode». Для этого есть две причины. Во-первых, для данного типа у вас может не быть кода для извлечения значения из строки Unicode, и не стоит требовать, чтобы такой код был написан. Во-вторых, представьте библиотеку многоразового использования, которая имеет некоторые опции и предоставляет описание опций в своем интерфейсе. Есливсеопции являются либо ascii, либо Unicode, и библиотека не использует никаких строк Unicode, то автор, вероятно, будет использовать опции ascii, делая библиотеку непригодной для использования внутри приложений Unicode. По сути, необходимо было бы предоставить две версии библиотеки — Ascii и Unicode.

Еще один важный момент заключается в том, что струны асци передаются без изменений. Другими словами, невозможно просто преобразовать асции в Unicode и обрабатывать Unicode дальше. Проблема в том, что механизм преобразования по умолчанию — аспект<codecvt>— может не работать с 8-битным входом без дополнительной настройки.

Поддержка Unicode, описанная выше, не является полной. Например, мы не поддерживаем имена опций Unicode. Поддержка Unicode является сложной и требует решения Boost. Даже сравнение двух произвольных строк Unicode нетривиально. Наконец, использование Unicode в именах опций связано с интернационализацией, которая имеет свои сложности. Например, если имена опций зависят от текущего местоположения, то все части программы и другие части, которые используют название, также должны быть интернационализированы.

Основной вопрос при реализации поддержки Unicode заключается в том, использовать ли шаблоны и<std::basic_string>или использовать некоторое внутреннее кодирование и преобразовывать между внутренним и внешним кодированием на границах интерфейса.

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

Для компонента парсеров у нас есть три варианта:

  • Используйте полностью шаблонную реализацию: при заданной строке определенного типа парсер вернет экземпляр<parsed_options>со строками того же типа (т.е. класс<parsed_options>будет шаблонизирован).

  • Используйте внутреннее кодирование: то же самое, что и выше, но строки будут преобразованы во внутреннее кодирование и из него.

  • Используйте и частично раскройте внутреннее кодирование: то же самое, что и выше, но строки в<parsed_options>экземпляре будут во внутреннем кодировании. Это позволяет избежать конверсии, если экземпляр<parsed_options>передается непосредственно другим компонентам, но также может быть опасным или запутанным для пользователя.

Второе решение кажется лучшим — оно не сильно увеличивает размер кода и чище третьего. Чтобы избежать дополнительных конверсий, версия Unicode<parsed_options>также может хранить строки во внутреннем кодировании.

Для компонента описания опций у нас нет особого выбора. Поскольку не желательно, чтобы все опции использовали асции или все из них использовали Unicode, а скорее имели некоторые асции и некоторые опции Unicode, интерфейс<value_semantic>должен работать с обоими. Единственный способ — передать дополнительный флаг, указывающий, используют ли строки асци или внутреннюю кодировку. При необходимости<value_semantic>можно преобразовать в другое кодирование.

Для компонента хранения единственной функцией является<store>. Для ввода Unicode функция<store>должна преобразовывать значение во внутреннее кодирование. Он также должен информировать класс<value_semantic>об используемом кодировании.

Наконец, какую внутреннюю кодировку мы должны использовать? Альтернативы:<std::wstring>(с использованием кодирования UCS-4) и<std::string>(с использованием кодирования UTF-8). Разница между альтернативами заключается в:

  • Скорость: UTF-8 немного медленнее

  • Пространство: UTF-8 занимает меньше места, когда вход асций

  • Размер кода: UTF-8 требует дополнительного кода преобразования. Однако он позволяет использовать существующие парсеры без их преобразования в<std::wstring>, и такое преобразование, вероятно, создаст ряд новых инстанциаций.

Явного лидера нет, но последний пункт кажется важным, поэтому UTF-8 будет использоваться.

Выбор кодирования UTF-8 позволяет использовать существующие парсеры, поскольку 7-битные асции сохраняют свои значения в UTF-8, поэтому поиск 7-битных строк прост. Однако есть две тонкие проблемы:

  • Мы должны предположить, что буквальные символы используют кодирование асци и что входы используют кодирование Unicode.

  • За символом Unicode (скажем, «=») может следовать «составляющий символ», и комбинация не совпадает с просто «=», поэтому простой поиск «=» может найти неправильный символ.

Ни одна из этих проблем не является критической на практике, так как асции являются почти универсальным кодированием, и поскольку создание символов, следующих за «=» (и других символов, имеющих особое значение для библиотеки), вряд ли появится.


PrevUpHomeNext

Статья Design Discussion раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 27. Boost.Program_options может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Chapter 27. Boost.Program_options ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:49:18/0.0080249309539795/0