Когда у нас есть практическое использование для иерархических пространств имен в C ++? - PullRequest
5 голосов
/ 22 сентября 2008

Я могу понять использование для одного уровня пространств имен. Но 3 уровня пространства имен. Выглядит безумно Есть ли практическое применение для этого? Или это просто заблуждение?

Ответы [ 9 ]

9 голосов
/ 22 сентября 2008

Иерархические пространства имен имеют применение в том смысле, что они допускают все более и более уточненные определения. Конечно, один поставщик может создать два класса с одинаковыми именами. Часто первый уровень занимает название компании, второй указывает продукт, третий (и, возможно, больше) предоставляет домен.

Существуют и другие способы разделения пространства имен. Одна популярная ситуация - размещение базовых классов для фабричного шаблона в его собственном пространстве имен, а затем производные фабрики в своих собственных пространствах имен по поставщикам. Например. System.Data, System.Data.SqlClient и System.Data.OleDbClient.

2 голосов
/ 22 сентября 2008

Очевидно, это вопрос мнения. Но это действительно сводится к организации. Например, у меня есть проект, который имеет плагин API, который имеет функции / объекты, которые выглядят примерно так:

plugins::v1::function

Когда выйдет 2.0, они будут помещены в подпространство имен v2. Я планирую только исключать, но никогда не удалять участников v1, которые должны поддерживать обратную совместимость в будущем. Это только один из примеров «вменяемого» использования. Я думаю, что некоторые люди будут отличаться, но, как я уже сказал, это вопрос мнения.

1 голос
/ 22 сентября 2008

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

1 голос
/ 22 сентября 2008

Я работаю над приложением XXX в моей компании, гг, и пишу графическую подсистему. Поэтому я использую yyy :: xxx :: gui в качестве пространства имен.

1 голос
/ 22 сентября 2008

Большие кодовые базы будут нуждаться в этом. Посмотрите на повышение для примера. Я не думаю, что кто-то назвал бы код повышения «безумным».

Если учесть тот факт, что на любом одном уровне иерархии люди могут постигать только где-то очень приблизительно порядка 10 предметов, то два уровня дают вам максимум 100. Достаточно большому проекту понадобится больше, так что он может легко закончить на 3 уровнях.

0 голосов
/ 23 сентября 2008

Чем больше кодовая база, тем больше потребность в иерархических пространствах имен. По мере того, как ваш проект становится все больше и больше, вы обнаружите, что вам нужно разбить его на части, чтобы было легче находить материал.

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

0 голосов
/ 23 сентября 2008

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

0 голосов
/ 23 сентября 2008

Я согласен на заявки. Большинство людей, которые используют несколько уровней пространств имен (по моему опыту), происходят из фона Java или .NET, где шум значительно меньше. Я считаю, что хорошие префиксы классов могут заменять несколько уровней пространств имен.

Но я видел хорошее использование нескольких уровней пространства имен в boost (и других библиотеках). Все находится в пространстве имен boost, но библиотекам разрешено (рекомендуется?) Находиться в их собственном пространстве имен. Например - пространство имен boost :: this_thread. Это позволяет такие вещи, как ...

boost::this_thread::get_id()
boost::this_thread::interruption_requested()

"this_thread" - это просто пространство имен для коллекции бесплатных функций. Вы могли бы сделать то же самое с классом и статическими функциями (то есть способом определения свободной функции в Java), но зачем делать что-то неестественное, если у языка есть естественный способ сделать это?

0 голосов
/ 22 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...