Dividere e nascondere le intestazioni in una libreria statica

2

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 diMainClass
    • MainClass dichiarazioni di funzioni libere
    • MainClass dichiarazione di specializzazione
    • MainClass dichiarazioni di funzioni libere di specializzazione
    • % dichiarazione diAuxiliaryClass1
    • AuxiliaryClass1 dichiarazioni di funzioni libere
    • ...
    • % dichiarazione diAuxiliaryClassN
    • 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

Dove:

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
  • _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 cartella impl . 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).
posta bolov 19.04.2014 - 11:52
fonte

1 risposta

1

Puoi fare quanto segue:

  • dividi il codice in una classe per file di intestazione.

  • nel caso di modelli, l'implementazione delle funzioni di classe può / deve risiedere nello stesso file di intestazione (probabilmente non esiste uno scenario in cui si desidera includere l'intestazione, ma non quelle definizioni).

  • dipendenze (il tuo AuxiliaryClassK ) dovrebbero essere #included invece di essere definite direttamente. Ciò rende le intestazioni più piccole, promuove il riutilizzo del codice (poiché puoi includerle, e solo loro, altrove) e mantiene il tuo codice più pulito.

  • dividi il tuo codice in directory. La struttura delle directory è normalmente una questione di politica; Puoi usare l'idea della tua cartella impl o, per esempio, puoi raggrupparli come fa boost (una directory per area funzionale con tutti i file di implementazione e un file include per comodità, che puoi includere in una singola riga nel codice client ).

  • usa l'idioma pimpl per ridurre al minimo i tempi di compilazione.

Come regola, non userei i nomi dei file _Class. Sono insoliti (aumenti la misura WTF / LOC del tuo codice che non è mai buona)

    
risposta data 20.04.2014 - 07:51
fonte

Leggi altre domande sui tag