Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 319
1

Namespace. Красивая иерархия или удобное использование

04.08.2017, 22:20. Показов 1593. Ответов 8
Метки нет (Все метки)

Здравствуйте!

Для более логичного деления библиотеки использую иерархические namespace.

C++
1
2
3
4
5
6
7
8
9
10
11
12
namespace lib 
{
   
    namespace system { /*..*/ }
 
    namespace classes { /*..*/ }
 
    namespace tool { /*..*/ }
 
    /* и тд */
 
}
То есть по сути пространства имен практически полностью повторяют структуры файловой системы.
Правильно ли это? Или лучше использовать одно глобальное пространство lib ??

Если уровень вложенности большой - 2/3/4, то в cpp писать A::B::C::... не очень красиво...
Подскажите, что в таком случае верно?

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

.CPP лучше держать рядом с .H или делать ни Header/Source ?? Подскажите, как вы делаете? Что удобней и правильней?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.08.2017, 22:20
Ответы с готовыми решениями:

Использование namespace
Добрый день, есть ли разница в подходах ниже: //Foo.cpp using namespace A; Foo::Foo()

Использование using namespace std;
Я где-то слышал что использование такой диррективы на корню убивает пространство имен, но ведь...

Удобное использование SQL-запросов в коде C#
Интересует, как сделать работу с множеством мелких и не очень запросов, чтобы с ними было удобно...

Правильное использование namespace
Есть проект на чистом PHP, по долгу стажировки так надо, для лучшего понимания. Проект я сделал...

8
866 / 789 / 267
Регистрация: 27.07.2012
Сообщений: 2,226
04.08.2017, 22:43 2
Я думаю, что каких-то железобетонных правил тут не существует. Всё зависит от конкретной задачи. Вот к примеру std или boost все используемые классы и функции кладут в основное пространство имён, но сколько там вложенных нэймспейсов - одному богу известно.

На счёт как хранить сами файлы на диске - тут тоже дело вкуса. Если это библиотека для стороннего использования, то обычно там предоставляют хэдеры и уже скомпилированный код, либо все исходники и какой-нибудь скрипт, который сам всё соберёт вашим компилятором, либо же файлы-проекты под самые популярные IDE - и собирайте сами (там уже всё будет подключено). А если это ваш проект, то тут хозяин == барин, как больше нравится, так и храните.
1
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 319
05.08.2017, 05:24  [ТС] 3
Цитата Сообщение от John Prick Посмотреть сообщение
На счёт как хранить сами файлы на диске - тут тоже дело вкуса.
Мне интересно как делают другие, чтобы посмотреть некоторые идеи и найти что-то свое.
0
44 / 44 / 19
Регистрация: 04.05.2014
Сообщений: 190
05.08.2017, 12:07 4
Цитата Сообщение от Kertis138 Посмотреть сообщение
пространства имен практически полностью повторяют структуры файловой системы.
Правильно ли это?
Нет, неправильно. Пространства имён должны делить код на логические части, которые чаще всего не совпадают со структурой файловой системы.
Цитата Сообщение от Kertis138 Посмотреть сообщение
Если уровень вложенности большой - 2/3/4, то в cpp писать A::B::C::... не очень красиво...
Подскажите, что в таком случае верно?
В данном случае (при длинных namespace) следует использовать директиву using namespace, в которой задавать для длинного namespace псевдоним. Слишком длинные namespace (больше 3-4 уровней вложенностей) не рекомендуются.
Цитата Сообщение от Kertis138 Посмотреть сообщение
И насчет файловой системы: подскажите, как лучше хранить файлы? Придерживаться логической иерархии как и с namespace или же все в одну папку
Основной принцип такой: при просмотре списка файлов в файловом менеджере (в режиме таблицы), они должны помещаться на 1-2 экранах прокрутки. То есть, не более 30-50 файлов в папке. Так удобнее с ними работать. Но и когда много папок по 2-4 файла это тоже неудобно, и сложно что-то найти. Надо придерживаться середины, в зависимости от обстоятельств.
Цитата Сообщение от Kertis138 Посмотреть сообщение
.CPP лучше держать рядом с .H
Лучше .cpp и .h держать рядом, если это внутренние файлы проекта. Если .h это внешний интерфейс библиотеки и используется извне её, заголовочные файлы такого интерфейса лучше вынести в отдельную папку.
1
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 319
05.08.2017, 12:54  [ТС] 5
Цитата Сообщение от cordfield Посмотреть сообщение
Лучше .cpp и .h держать рядом, если это внутренние файлы проекта.
А папки Header/Source, который полностью идентичны, за исключением того, что в одной .H, а в другой .CPP файлы - не подойдет?
0
44 / 44 / 19
Регистрация: 04.05.2014
Сообщений: 190
05.08.2017, 13:31 6
Лучший ответ Сообщение было отмечено Kertis138 как решение

Решение

Kertis138, деление на header/source возможно, но для меня непонятны преимущества. Минусы следующие:
- Visual Studio часто не может использовать функцию "Toggle Header/Source" - быстрого перехода от заголовочного файла к реализации и обратно
- Приходится в папках header/source дублировать иерархию подпапок, если проект сложный. При этом в файловом менеджере управлять этими файлами становится трудно. Например, в стандартном проводнике, можно выделить 2 файла .h и соответствующий ему .cpp, нажать F2 и переименовать разом оба файла.
1
Любитель чаепитий
3587 / 1687 / 519
Регистрация: 24.08.2014
Сообщений: 5,709
Записей в блоге: 1
05.08.2017, 16:03 7
Цитата Сообщение от cordfield Посмотреть сообщение
В данном случае (при длинных namespace) следует использовать директиву using namespace
бред.
вообще стоит забыть про то, что такой способ существует.
он имеет место быть разве что в области видимости отдельно взятой функции.
для подобных ситуаций в c++ есть namespace aliasing.
http://en.cppreference.com/w/c... pace_alias
1
44 / 44 / 19
Регистрация: 04.05.2014
Сообщений: 190
05.08.2017, 16:42 8
GbaLog-, я так и написал, читай внимательно:
Цитата Сообщение от cordfield Посмотреть сообщение
следует использовать директиву using namespace, в которой задавать для длинного namespace псевдоним
Сам я этим не пользуюсь, поэтому забыл, что при задании псевдонима не надо писать слово using.
0
Любитель чаепитий
3587 / 1687 / 519
Регистрация: 24.08.2014
Сообщений: 5,709
Записей в блоге: 1
05.08.2017, 17:52 9
Цитата Сообщение от cordfield Посмотреть сообщение
следует использовать директиву using namespace, в которой задавать для длинного namespace псевдоним
ты знаешь разницу между using, using namespace и namespace aliasing?
у тебя чёрным по белому написано using namespace.
и using namespace уж точно не создаёт псевдоним неймспейсу.
он просто вываливает в данную область видимости все имена из конкретно взятого неймспейса.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.08.2017, 17:52

Использование using namespace в C++/CLI
Здравствуйте, есть вопрос на который не могу найти ответа.. Смотрите например в Dev C++ если писать...

Использование одинаковых классов разных namespace
Есть проект (NameSpace Work1), к которому подключена библиотека Dll (создана на основе программы с...

Sublime Text 3 как IDE для C++ (или удобное редактирование кода)
Установил Sublime Text 3. Почитал в интернете, что он хороший текстовый редактор с гибкими...

Головоломка с namespace в большом солюшине, проект подхватывает чужой namespace
Добрый вечер! Народ, подскажите, пожалуйста, что-то я никак понять не могу. Проблема в следующем:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.