Когда мы сможем найти практическое применение иерархическим пространствам имен в C++?

StackOverflow https://stackoverflow.com/questions/117110

  •  02-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

plugins::v1::function

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top