Как правильно структурировать и организовать модули в C++?

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

<blockquote>Экспериментальная библиотека разделена на следующие именованные модули:<br/>
<br/>
std.regex предоставляет содержимое заголовка regex<br/>
std.filesystem предоставляет содержимое заголовка filesystem<br/>
std.memory предоставляет содержимое заголовка memory<br/>
std.threading содержит содержимое заголовков atomic, condition_variable, future, mutex, shared_mutex, и thread<br/>
std.core все остальное доступно в стандартной библиотеке C++</blockquote>

Однако при попытке использовать их мне были доступны только модули <code class="cpp">std и std.compat</code>. После небольшого поиска информации я нашел статью на Хабре, в которой говорилось об обновлениях стандартов C++23, включая следующий момент: 

<blockquote>В стандартную библиотеку добавили первый полноценный модуль. Теперь всю библиотеку можно подключить одной строчкой import std;<br/>
Если вы привыкли смешивать код на C++ с кодом на C и используете C-функции из глобального namespace, то специально для вас сделали модуль std.compat.</blockquote>

Именно эти модули я смог использовать. У меня сложилось впечатление, что список Microsoft был лишь предварительной версией, и что после утверждения стандарта, эти модули были исключены. Может быть, я что-то неправильно понял.

Также мне кажется, что эти модули еще не получили широкого применения, вероятно, из-за того, что это новая и еще не полностью опробованная функциональность. Однако мне эта новинка кажется довольно интересной. Какое у вас мнение по этому поводу?
  • 19 октября 2024 г. 19:23
Ответы на вопрос 2
Вы совершенно правы, модули в C++ представляют собой новую, улучшенную систему организации кода и управления зависимостями, которая была введена в C++20, и продолжает развиваться в C++23. Вот несколько ключевых аспектов, которые стоит учесть при структурировании и организации модулей в C++:

### 1. Основные концепции модулей

- **Инкапсуляция:** Модули позволяют изолировать реализацию от интерфейса, что повышает уровень инкапсуляции. Это помогает избежать конфликтов имен и улучшает читаемость кода.
  
- **Улучшенная производительность:** Компиляторы могут кэшировать модули, что снижает время компиляции при наличии больших проектов с множеством файлов.

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

### 2. Структурирование модулей

- **Создание модулей:** Модули можно разделить по функциональности. Например, можно создать модули для работы с сетью, базами данных, графикой и т.д. Например:
  ```cpp
  module network;
  export void connect();
  ```

- **Группировка в пространстве имен:** Однако модули не заменяют пространства имен. Это значит, что вы все еще можете использовать пространства имен внутри модулей для дальнейшей структуризации. 

- **Переиспользование:** Модули (в отличие от заголовочных файлов) могут быть легко переиспользованы между проектами, что делает их удобными для создания библиотек.

### 3. Использование стандартных библиотек и модулей

- Вы правильно отметили, что модуль `std` позволяет использовать всю стандартную библиотеку. Однако модули `std.regex`, `std.filesystem` и другие, о которых вы упомянули, скорее всего, еще не поддерживаются широко или находятся в экспериментальной стадии. Это может объяснить, почему они недоступны в вашей среде.

- **Совместимость:** Модуль `std.compat` был создан для совместимости с традиционным кодом на C и C++. Это помогает разрабатывать переходные решения в старых проектах, которые используют заголовочные файлы.

### 4. Применение в реальных проектах

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

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

### Заключение

Использование модулей в C++ может значительно улучшить структуру и читаемость вашего кода, а также упростить управление зависимостями. Тем не менее, важно следить за обновлениями стандартов и поддерживаемыми функциями в вашем компиляторе, чтобы использовать модули эффективно.
Не использую просто потому, что модули плохо устаканились. Посмотрел по MinGW — всё ещё экспериментальная функциональность. 
Для стандартных модулей : если поддерживаете Си++23, то пожалуйста. Это обычно главный источник медленной компиляции.
Для сторонних библиотек : можно прямо сейчас, если они собраны в модуль. Ни одной такой пока не видел, тем более в G++, как я сказал, это пока эксперимент.
Для собственных модулей : убедитесь, что их поддерживает система сборки. В Си++26 усилят требования к модулям, потому что взвыли разработчики этих самых систем. И, как я сказал, в G++ модули — всё ещё эксперимент.
Похожие вопросы