#cpp
Почему std один namespace на всю стандартную библиотеку? Почему, например, не сделали для алгоритмов отдельный std::algorithm?
Ответы
Ответ 1
Изначально пространства имён создавались для разрешения конфликтов. Пространство имён — это не декорация кода, не атрибут, не метка и даже не путь к файлу. Пространство имён — это в первую очередь цельное объединение кода, в котором не предполагается конфликтов. Также пространства имён используются для того, чтобы избежать засорения списка доступных сущностей в коде (важно при использовании автодополнения кода). Джависты изуродовали пространства имён, у них папки — это пространства имён, а файлы — классы. В результате библиотеки обрастают глубокими иерархиями пространств имён, и даже базовое использование библиотеки может требовать десяток пространств. PHP-шники пошли по пути Java, причём изначально возможности включения пространств имён были ограничены, да и сейчас не лучшие. Результатом всего этого является абсолютная необходимость использовать сложные IDE, иначе невозможно запомнить, где какой класс находится. Что же в C++? В C++ стандартная библиотека достаточно минималистичная, а доступные в конкретном файле классы и функции зависят от включаемых заголовочных файлов, поэтому проблемы засорения списка доступных имён нет. Кроме того, C++ создавался во времена, когда сильно умных IDE не было, поэтому приходилось помнить, что где находится. Засорять память пространствами имён в дополнение к заголовочным файлам — излишне. В целом, пока библиотека не натыкается на конфликты, и не возникает других причин использовать дополнительные пространства имён, достаточно только одного пространства. Для сравнения, в boost каждая библиотека в своём пространстве, потому что библиотеки существуют по отдельности, возможны конфликты как между библиотеками, так и со стандартной библиотекой.Ответ 2
На самом деле внутри пространства имен std:: могут быть определены другие пространства имен, как, например, namespace std { namespace placeholders { //... } } в заголовочном файлеили namespace std { namespace rel_ops { //... } } в заголовочном файле или namespace std { namespace chrono { //... } } в заголовочном файле или такие встроенные пространства имен как inline namespace literals { //... } inline namespace chrono_literals { //... } Кроме того разрешается стандартные имена языка C помещать в глобальное пространство имен. Так что если возникает какая-то коллизия стандартных имен, или другие проблемы, то стандарт C++ вводит новые пространства имен, чтобы избежать такие проблемы. Для алгоритмов не было необходимости объявлять отдельное пространства имен внутри пространства std , так как пока с этим никакой проблемы не возникало. Алгоритмы очень часто используется, поэтому заключение их в какое-то вложенное пространство имен усложняло бы написание кода. Рассмотрите, например std::algorithm::set_symmetric_difference( std::begin( a ), std::end( a ), std::begin( b ), std::end( b ), std::begin( c ) ); Получается очень длинная строка.:)
Комментариев нет:
Отправить комментарий