Я переключился с C ++ на Java и C # и думаю, что использование пространств имен / пакетов там намного лучше (хорошо структурировано). Затем я вернулся к C ++ и попытался использовать пространства имен таким же образом, но требуемый синтаксис в заголовочном файле ужасен.
namespace MyCompany
{
namespace MyModule
{
namespace MyModulePart //e.g. Input
{
namespace MySubModulePart
{
namespace ...
{
public class MyClass
Мне тоже кажется странным следующее (чтобы избежать глубокого отступа):
namespace MyCompany
{
namespace MyModule
{
namespace MyModulePart //e.g. Input
{
namespace MySubModulePart
{
namespace ...
{
public class MyClass
{
Есть ли более короткий способ выразить вышесказанное? Я упускаю что-то вроде
namespace MyCompany::MyModule::MyModulePart::...
{
public class MyClass
Обновить
Хорошо, некоторые говорят, что концепция использования в Java / C # и C ++ отличается. В самом деле? Я думаю, что (динамическая) загрузка классов - не единственная цель пространств имен (это очень технически обоснованная перспектива). Почему бы мне не использовать его для удобства чтения и структурирования, например, подумайте о «IntelliSense».
В настоящее время нет никакой логики / связи между пространством имен и тем, что вы можете там найти. Java и C # делают это намного лучше ... Зачем включать <iostream>
и иметь пространство имен std
? Хорошо, если вы говорите, что логика должна полагаться на заголовок для включения, почему #include не использует удобный для IntelliSense синтаксис, например #include <std::io::stream>
или <std/io/stream>
? Я думаю, что отсутствующая структуризация в библиотеках по умолчанию - это слабое место C ++ по сравнению с Java / C #.
Если уникальность острых конфликтов составляет один балл (что также относится к C # и Java), хорошей идеей будет использовать имя проекта или название компании в качестве пространства имен, вам так не кажется?
С одной стороны, сказано, что C ++ - самый гибкий ... но все сказали: «Не делай этого»? Мне кажется, C ++ может многое делать, но во многих случаях у него ужасный синтаксис даже для самых простых вещей по сравнению с C #.
Обновление 2
Большинство пользователей считают бессмысленным создавать более глубокую вложенность, чем два уровня. Хорошо, а как насчет пространств имен Windows :: UI :: Xaml и Windows :: UI :: Xaml :: Controls :: Primitives в разработке под Win8? Я думаю, что использование пространств имен Microsoft имеет смысл и действительно глубже, чем просто 2 уровня. Я думаю, что более крупные библиотеки / проекты нуждаются в более глубоком вложении (я ненавижу такие имена классов, как ExtraLongClassNameBecauseEveryThingIsInTheSameNameSpace ... тогда вы также можете поместить все в глобальное пространство имен.)
Обновление 3 - Заключение
Большинство говорит «не делай этого», но ... даже boost имеет более глубокую вложенность, чем один или два уровня. Да, это библиотека, но: Если вам нужен код многократного использования - относитесь к своему собственному коду, как к библиотеке, которую вы отдадите кому-то другому. Я также использую более глубокое вложение для целей обнаружения с использованием пространств имен.
namespace
ключевым словом?