Библиотека Boost C++ Filesystem - дизайн

Вступление

Требования

Реальность

Объяснение

Исключенные проекты

Ссылки

Вступление

Исходной причиной начала работ над библиотекой Boost.Filesystem была ситуация с административными средствами Boost. Скрипты были написаны на языках Python, Perl, Bash, и командном языке Windows. Не было единого языка написания скриптов, знакомого и принятого всеми администраторами проекта Boost. Администраторы были опытными программистами C++ - так почему бы было не попробовать использовать C++ в качестве языка для написания скриптов?

Ключевой особенностью скриптов, отсутствующей в C++, была возможность выполнять портабельные операции с файловой системой. Библиотека  Boost.Filesystem была разработана, чтобы заполнить отсутствие таких средств.

Намерение заключается не в состязании с традиционными скриптовыми языками, а в предоставлении средств в ситуации, когда C++ уже выбран для использования.

Требования

Реальность

Объяснение

Описанные выше Требования и Реальность в значительной степени касаются дизайна интерфейса библиотеки. В частности, желание сделать писать код с скриптовом стиле требует больших усилий, чтобы гарантировать нормальную работу выражений типа exists( "foo" ).

Более детальное описание причин реализованного дизайна библиотеки читайте в разделе часто задаваемых вопросов.

В дизайн класса path положено несколько ключевых идей:

Трудной задачей оказалось создание механизма проверки ошибок. Одной из ключевых идей была такая: с именами файлов и каталогов портабельность не является универсальной истиной. Скорее, программист должен обдумать такой вопрос "Для каких ОС я хотел бы получить портабельность?". Обеспечив поддержку нескольких ответов на этот вопрос, библиотека Boost.Filesystem Library побуждает программистов задавать такой вопрос с самого начала.

Исключенные проекты

operations.hpp

Оригинальная реализация dir_it (автор - Dietmar Kühl) поддерживала работу с юникодом в именах файлов  каталогов. От этой поддержки отказались после интенсивных дискуссий среди членов Рабочей Группы Библиотеки, когда не удалось разработать портабельную семантику для юникода на системах, которые его не поддерживают. См. ЧАВО.

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

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

Еще один набор вспомогательных функций (к примеру, remove с подтверждением, рекурсией и другими опциями, плюс команда-предикат для отбора файлов, а также другие опции фильтрации) был отброшен по причине слишком сложного использования.

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

path.hpp

Было так много отвергнутых реализаций класса path, что я потерял им счет. Использующие политики шаблонные классы (policy-based class templates) разных типов, передаваемые в конструкторы во время исполнения управляющие флаги, специфичные для операций политики времени исполнения - все они были рассмотрены, зачастую реализованы и в конце концов отброшены как слишком сложные при небольших сулимых выгодах.

error checking

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

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

Конечный дизайн, который частично опирается на явном вызове функций проверки ошибок, оказался намного более простым и понятным, хотя он в некоторой степени зависит от дисциплины программиста. Но это должно позволить программисту, который нуждается в портабельность, быть уверенным, что его программа будет корректно работать на выбранных целевых платформах.

Ссылки

[IBM-01] IBM Corporation, z/OS V1R3.0 C/C++ Run-Time Library Reference, SA22-7821-02, 2001, http://www-1.ibm.com/servers/eserver/zseries/zos/bkserv/

[ISO-9660] International Standards Organization, 1988.

[MSDN] Microsoft Platform SDK for Windows, Storage Start Page, http://msdn.microsoft.com/library/en-us/fileio/base/storage_start_page.asp

[POSIX-01] IEEE Std 1003.1-2001/ISO/IEC 9945:2002 , http://www.unix-systems.org/version3/. The ISO JTC1/SC22/WG15 - POSIX homepage is http://std.dkuug.dk/JTC1/SC22/WG15/.

[URI] RFC-2396, Uniform Resource Identifiers (URI): Generic Syntax, http://www.ietf.org/rfc/rfc2396.txt

[Wulf-Shaw-73] William Wulf, Mary Shaw, Global Variable Considered Harmful, ACM SIGPLAN Notices, 8, 2, 1973, pp. 23-34


© Copyright Beman Dawes, 2002

Use, modification, and distribution are subject to the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at www.boost.org/LICENSE_1_0.txt)

последняя правка: 17.09.2005

библиотека BOOST C++ http://www.boost.org
перевод Elijah Koziev www.solarix.ru

  © Mental Computing 2010