Як правильно виносити код в різні файли

Виносити код в окрему dll має сенс тільки якщо потрібно запускати кілька примірників вашої програми, або в dll можна винести якийсь специфічний код, який залежить від типу Операційної системи або інших чинників (нп. Створення тестової бібліотеки і повноцінної)
Про розбиття одного файлу на кілька - тут @KOLANICH вірно описав. Додам, що в заголовки (.h) бажано не розміщувати нічого, крім визначення типів і класів, а також опису сигнатур функцій: тобто ні глобальних змінних, ні тел реалізацій функцій тут бути не повинно, в загальному - жодної логіки.
А також намагатися якнайменше включати заголовні файли один в одного - потім на граблі з черговістю компіляції натрапите.

System programming, Reversing Engineering, C ++

А для чого потрібно розбивати на кілька DLL. Може просто переоформити код, тобто провести рефакторинг і залишити все як є в рамках однієї DLL?

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

Розбивається шляхом мислення і задавання собі питань.
Кожен модуль зобов'язаний відповідати ствердно на питання "Він дійсно вирішує тільки одну задачу?". При цьому треба розуміти не примітивні завдання "читання з файлу" або "підрахувати ентропію", під "одним завданням" розуміє один пункт взятий з рівня абстракції.

У будь-якому випадку ідеальних методик по розподіленню немає! Вас ніхто не навчить програмувати, це процес інтерактивний, сьогодні краще ніж учора, а завтра буде ще краще ніж сьогодні;)

Експерт в суперечках зі школярами

Для початку потрібно зрозуміти ідею dll. У них є потрібно розміщувати готові самодостатні компоненти, які мають сенс і за межами вузької специфіки одного проекту або для підтримки модульності (плагіни, наприклад). Грубо кажучи, потрібно думати, чи є в цьому великий сенс? Якщо просто хочеться логічно розділити код програми, то для цього буде достатньо поділу на рівні вихідного коду. Про решту сказано вище.

Схожі статті