Моя панель исходных файлов быстро растет (с точки зрения количества файлов в моем проекте), и становится немного громоздким, чтобы быстро найти конкретный исходный файл, к которому мне нужно получить доступ в любой момент времени. Я использую Embarcadero C ++ Builder, но я столкнулся с этой проблемой и в других C ++ IDE.
В Java я часто использую пакеты для создания логических разделов моего исходного кода, особенно когда имеешь дело с большим количеством исходных файлов в одном проекте. Хотя это, конечно, не единственная цель пакетов Java, они очень удобны в этом отношении.
У кого-нибудь есть идеи о том, как я могу достичь аналогичной функциональности в C ++? Должен ли я разделить мой источник на физические папки? Предлагает ли C ++ Builder какую-то функциональность виртуальных папок / групп, которую я просто не вижу? Любые идеи ценятся и спасибо.
Я вообще рекомендую не использовать (только) IDE или синтаксис языка для организации вашего исходного кода. Во-первых, вы привязываетесь к среде: хорошо организованы в IDE, неорганизованы в файле, а затем наступает день, когда вы можете захотеть использовать разные среда…
Поэтому я обычно использую все три способа организации своего источника одновременно: я делю свой источник на функциональные модули, то есть связанные классы. Каждый модуль получает свое собственное пространство имен, физическую папку и папку IDE. (В моем случае, используя CMake а также source_group()
генерировать файлы проекта IDE, если необходимо — лично предпочитая командную строку, Vim и «make».)
Следовательно, независимо от того, смотрю ли я на проект из среды IDE, из командной строки или из журнала компилятора, foo / some_class.hpp — это foo / some_class.cpp — это foo :: some_class, сводя к минимуму путаницу вокруг.
На самом деле, моя предпочитаемая в настоящее время установка подразделяет каждый каталог модулей на <project>/<module>/<class>.hpp
или же <project>/<module>/src/<class>.hpp
в зависимости от того, используется ли класс вне его собственного модуля или нет, <project>/<module>/src/<class>.cpp
, а также <project>/<module>/test/<class>_tu.cpp
, Пространство имен <project>::<module>::<class>
, конечно.
project
|-- foo
| |-- some_class.hpp
| |-- src
| | |-- internal_class.hpp
| | |-- internal_class.cpp
| | `-- some_class.cpp
| `-- test
| |-- internal_class_tu.cpp
| `-- some_class_tu.cpp
|-- bar
| |-- ...
Идея здесь заключается в том, что «внешний» интерфейс каждого модуля (foo
) документируется заголовками в этой подпапке, детали реализации и тесты «скрыты» в соответствующих подпапках.
Но в конце концов, это очень сильно зависит от вашего вкуса, вкуса ваших со-разработчиков и масштаба вашего проекта.
Вот как я катаюсь:
PROJECT_NAME
|-- build // This is DVCS ignored but has all the built intermediates and final binaries
| |-- release // These are the different build profiles
| |-- debug
| |-- profile
| `-- coverage
|-- bin // For binary source code
| `-- hello_world
| |-- doc
| |-- inc
| |-- src
| |-- tests
| `-- build_script // Builds binary into the build folder
|-- include // Public headers for the library
| `-- these
| `-- folders
| `-- represent
| `-- namespaces
| `-- my_awesome_class.hpp
|-- lib // library source code
| |-- these
| | `-- folders
| | `-- represent
| | `-- namespaces
| | |-- inc // Private headers
| | | `-- my_private_class.hpp // internal class
| | |-- src // Source code for this namespace
| | | |-- posix
| | | | `-- my_awesome_class.cpp // posix specific source code
| | | |-- nt
| | | | `-- my_awesome_class.cpp // nt specific source code
| | | |-- my_private_class.cpp // non-visibile class
| | | `-- my_awesome_class.cpp // cross platform source code
| | |-- tests // Unit tests
| | | `-- my_awesome_class.cpp // builds a test executable for the library
| | `-- doc // Documentation for this namespace
| | `-- namespace.dox
| `-- build_script // Builds binary into the build folder
|-- doc // Documentation files
| |-- main_page.dox
| `-- namespace.dox
`-- build_script // Builds the source code into the build folder
Это представляет these::folders::represent::namespaces::MyAwesomeClass
класс, который имеет posix
а также NT
конкретный исходный код (а также общий исходный код) плюс есть частный these::folders::represent::namespaces::MyPrivateClass
который используется внутри библиотеки, заголовки не являются публичными и видимость Символы класса скрыты.
Это очень хорошо масштабируется и позволяет легко находить файлы.
Я делаю проекты, чтобы все мои файлы были легко доступны. Это самый простой способ организации, наряду с четкими именами классов / файлов.