Пространства имен C++, сравнение с пакетами Java

Я сделал набор Java, кодирующего недавно, и привык для очень определенных систем именования пакета с глубоким вложением, например. com.company.project.db. Это хорошо работает в Java, AS3/Flex и C#. Я видел ту же парадигму, примененную в C++ также, но я также услышал, что это плохо для просмотра пространств имен C++ как прямые дубликаты к пакетам Java.

Это верно, и почему? Как пространства имен/пакеты подобны и отличаются? Какие проблемы, вероятно, видно при использовании глубоко вложенных пространств имен?

44
задан Mr. Boy 21 January 2010 в 09:42
поделиться

5 ответов

в пространстве имен C ++ предстоит разделение доступных имен. Пакеты Java оказываются в модулях. Иерархия именования - это только один аспект этого.

Нет ничего плохого, Per-SE, с глубоко вложенными пространствами имен в C ++, за исключением того, что они не требуются, поскольку не требуется никакой модульной системы, а дополнительные слои просто добавляют шум. Обычно достаточно, чтобы иметь один или два уровня пространства имен, с нечетным дополнительным уровнем для внутренних деталей (часто только что называется деталями).

Существуют также дополнительные правила на пространства имен C ++, которые могут уловить вас, если он изменился - такой как , зависимый от аргументов , и правила вокруг разрешения на родительские уровни. Wrt Последнее, возьми:

namespace a{ namespace b{ int x; } }
namespace b{ string x; }
namespace a
{
  b::x = 42;
}

Это законно? Это очевидно, что происходит? Вам нужно знать прецедентство разрешения пространства имен, чтобы ответить на эти вопросы.

30
ответ дан 26 November 2019 в 22:16
поделиться

Вы можете иметь вложенные пространства имен в C ++.

Они не работают так же, как в Java, хотя, очевидно,. Пакеты Java действительно намного лучше определены, и нет реальной статической инициализации странности. С пространствами имен C ++ полезны, но все равно есть справедливый случай опасности.

0
ответ дан 26 November 2019 в 22:16
поделиться

В C ++ базовая единица дизайна и реализации - это класс, а не пространство имен. Пространства имен были предназначены как средство предотвращения столкновений имени в крупных библиотеках, а не для выражения концепций.

Классы имеют несколько преимуществ над пространствами имен:

  • У них могут быть конструкторы и деструкторы
  • , они могут иметь частные члены
  • , они не могут быть восстановлены

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

0
ответ дан 26 November 2019 в 22:16
поделиться

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

  1. Производительность C ++ (как-то), затронутая длинными полноэкранными указанными именами методов, например, namepace1 :: namespace2 :: namespace3 :: Classx :: Method123 ()

  2. Вы можете ударить ограничение на допустимую длину символа в Компилятор / линкер

0
ответ дан 26 November 2019 в 22:16
поделиться

Java-пакеты не вложены, они плоские. Любое явное вложение - не более чем соглашение об именовании.

Например, пакет com.company.project.db не имеет никакого отношения к com.company.project или com.company.project.db.x. Код в com.company.project.db не имеет больше доступа к коду в com.company.project.db.x, чем код в a.b.c.

19
ответ дан 26 November 2019 в 22:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: