Как правильно выносить код в разные файлы?

Доброго времени суток.
Подскажите пожалуйста, как правильно выносить код в разные файлы в c++?
Пишу программу, она уже разрослась на 3000+ строк кода и всё это в одной cpp файле!
Как мне правильно разделить код в разные файлы?

Попутный вопрос: было бы здорово вынести код в отдельные dll, но насколько это сложно и где это почитать?
  • Вопрос задан
  • 13507 просмотров
Пригласить эксперта
Ответы на вопрос 5
KOLANICH
@KOLANICH
Знаю JS, PHP, C++, C#
Несложно.
Определитесь сначала с модулями и интерфейсами.
В .h файлы выносите сигнатуры и типы, реализация - в cpp файлах, в которые приинклюжен нужный h файл.

с дллками легко - нужнен только префикс declspec(dllexport) для экспортируемых и declspec(dllimport) для импортируемых, но есть макрос, заменяющийся на это автоматом
Ответ написан
Комментировать
peleron
@peleron
Веду кружки по робототехнике
Выносить код в отдельную dll имеет смысл только если нужно запускать несколько экземпляров вашей программы, либо в dll можно вынести какой-то специфичный код, который зависит от типа Операционной системы или других факторов (нп. создание тестовой библиотеки и полноценной)
Про разбиение одного файла на несколько - тут @KOLANICH верно описал. Добавлю, что в заголовочные файлы (.h) желательно не размещать ничего, кроме определения типов и классов, а также описания сигнатур функций: т.е. ни глобальных переменных, ни тел реализаций функций тут быть не должно, в общем - ни какой логики.
А также стараться поменьше включать заголовочные файлы друг в друга - потом на грабли с очерёдностью компиляции наткнётесь.
Ответ написан
Комментировать
Kerman
@Kerman
Вам нужен рефакторинг. То, что Вы описали, говорит о том, что Ваш код далёк от совершенства.
Вам нужно для начала применить extract method, затем exctract class или подобные методы. После чего можно будет спокойно классы разнести по отдельным файлам.
Ответ написан
Комментировать
EvilsInterrupt
@EvilsInterrupt
System programming, Reversing Engineering, C++
А для чего нужно разбивать на несколько DLL ? Может просто переоформить код,т.е провести рефакторинг и оставить все как есть в рамках одной DLL?

Я бы Вам посоветовал Пока "жить" в рамках одной DLL и провести рефакторинг, тогда внешняя программа что использует вашу DLL послужит хорошим тестовым стендом и провести проверочное тестирование после рефакторинга будет значительно проще! Вторым этапом, если Вы все же решите разбить на несколько DLL Вам будет значительно проще,т.к. понятный код и он протестирован!

Разбивается путем мышления и задавание себе вопросов.
Каждый модуль обязан отвечать утвердительно на вопрос "Он действительно решает только одну задачу?". При этом надо понимать не примитивные задачи "чтение из файла" или "подсчитать энтропию", под "одной задачей" понимает один пункт взятый с уровня абстракции.

Пример:
Уровень 1: Чтение настроек
Под-уровень 1: Формирование имени файла с настройками
Под-уровень 2: Открытие и чтение из файла с настойками
Под-уровень 3: Задание глобального объекта конфигуратор соглассно прочитанным настройками
и т.д. и т.п.

В любом случае идеальных методик по разбиению нет! Вас никто не научит программировать, это процесс итеративный, сегодня лучше чем вчера, а завтра будет еще лучше чем сегодня ;)
Ответ написан
Комментировать
@Free_ze
Пишу комментарии в комментарии, а не в ответы
Для начала нужно понять идею dll. В них есть нужно размещать готовые самодостаточные компоненты, которые имеют смысл и за пределами узкой специфики одного проекта или для поддержки модульности (плагины, например). Грубо говоря, нужно думать, есть ли в этом великий смысл? Если просто хочется логически разделить код программы, то для этого будет достаточно разделения на уровне исходного кода. Об остальном сказано выше.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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