Sto scrivendo una libreria statica per C / C ++ (progetto personale). Quando le mie intestazioni sono diventate piuttosto grandi, ho pensato che dividere le mie intestazioni sarebbe stata una buona idea.
In questo momento un'intestazione appare così:
-
MainClass.hpp :
- namespace impl: dettagli di implementazione racchiusi in un namespace
impl
- inoltrare dichiarazioni di classi dichiarate di seguito (quando necessario)
-
% dichiarazione di
MainClass
-
MainClass
dichiarazioni di funzioni libere -
MainClass
dichiarazione di specializzazione -
MainClass
dichiarazioni di funzioni libere di specializzazione -
% dichiarazione di
AuxiliaryClass1
-
AuxiliaryClass1
dichiarazioni di funzioni libere - ...
-
% dichiarazione di
AuxiliaryClassN
-
AuxiliaryClassN
dichiarazioni di funzioni libere
-
MainClass
definizione -
MainClass
definizioni di funzioni libere -
MainClass
definizione di specializzazione -
MainClass
definizione della funzione libera di specializzazione -
AuxiliaryClass1
definizione -
AuxiliaryClass1
definizioni di funzioni libere - ...
-
AuxiliaryClassN
definizione -
AuxiliaryClassN
definizioni di funzioni libere
- namespace impl: dettagli di implementazione racchiusi in un namespace
Dove:
-
AuxiliaryClassK
è una classe logicamente o strutturalmente correlata aMainClass
(ad esempio un iteratore perMainClass
, una classe nidificata inMainClass
, una classe derivata diMainClass
ecc.) -
ClassX
funzioni libere come raccomandato in Come le funzioni non membro migliorano l'incapsulamento e Monoliths "Unstrung"
Le definizioni - sono nell'intestazione perché sono modelli.
Questo sta diventando molto affollato e difficile da navigare, quindi ho pensato che la suddivisione tra più intestazioni potesse essere d'aiuto. Tuttavia non so come farlo bene.
Ecco come penso possa essere la struttura:
-
MainClass.hpp :
- dichiarazioni anticipate (quando necessario)
- definizioni di classi piccole / struct & Dichiarazioni
-
#include
le altre intestazioni
-
_Class.hpp :
-
% dichiarazione di
_Class
-
_Class
dichiarazioni di funzioni libere
-
% dichiarazione di
-
_Class.inl :
-
_Class
definizione -
_Class
definizioni di funzioni libere
-
Con un _Class
per ogni: MainClass
, MainClass
specializzazione, AuxiliaryClassK
.
Le mie domande sono:
- È ragionevole voler dividere un'intestazione (tutte sono funzionalità di
MainClass
) (ho intestazioni di oltre 1000 righe e ne prevedo anche di più lunghe) o dovrei lasciarlo così com'è? - Lo schema di divisione sopra è ok? Devo dividere ulteriormente una classe e le funzioni libere relative a quella classe? Esistono altre soluzioni per rendere il codice più gestibile?
- Come nascondere le altre intestazioni (non nel senso di offuscare / rendere il codice non disponibile, ma evitare di esporre le intestazioni che gli utenti vedono (ad esempio in una GUI con completamento automatico)? Dovrebbero includere ed essere a conoscenza solo di
MainClass.hpp
Vedere le altre intestazioni senza essere chiaro che si tratta di intestazioni dietro le quinte produrrà inutili confusioni.Un'idea è di aggiungere un prefisso come_
(carattere di sottolineatura) o di inserirli in una cartellaimpl
. non si tratta di nascondere le classi (lo faccio con uno spazio dei nomi), ma di nascondere la divisione dietro un'intestazione che dovrebbero usare).