C ++ Progettazione di file di intestazione: proprio come definire un'API?

8

Sono una specie di novità nello sviluppo di software su larga scala in C ++, e mi stavo chiedendo dal lato del design delle cose.

Leggevo questa domanda , e ho pensato che, nel complesso, una volta che superare le definizioni costanti e altri argomenti banali, I file di intestazione C ++ sono solo definizioni API :

Definiscono ciò che altri programmatori (o te stesso da altri moduli) saranno in grado di usare (classi, funzioni pubbliche), ma nessuna classe o funzione privata dovrebbe essere definita al suo interno. È come se il file di intestazione definisse le astrazioni (interfacce ...) e il file sorgente lo implementasse. Una volta compilato il file sorgente, i dettagli dell'implementazione vengono nascosti e rimangono le intestazioni pubblicamente disponibili che definiscono cosa può fare il modulo.

Ho sentito che questa visione della separazione di file header / sorgente era molto più facile da capire e da seguire rispetto alle solite spiegazioni, dal momento che puoi semplicemente pensare "sarebbe XXX essere materiale API pubblicamente disponibile, o è un dettaglio di salsiccia" essere nascosto in un file sorgente non rivelato? "

Il mio modello mentale di file di intestazione è approssimativamente corretto? Cosa mi è mancato?

    
posta Jiby 22.09.2015 - 16:23
fonte

3 risposte

10

Non è un brutto modello mentale da usare come guida, ma sfortunatamente per ragioni storico / tecniche le intestazioni C ++ confondono interfaccia e implementazione in modi che questo semplice modello mentale non cattura completamente.

Per prendere buone decisioni di progettazione fisica quando le cose diventano un po 'più complesse, in genere è necessario capire il modo in cui le intestazioni funzionano in C ++ a un livello più dettagliato.

Per fare un esempio: dalla tua vista API, un file di intestazione non dovrebbe includere la definizione di una classe di implementazione privata. In pratica, tuttavia, tali definizioni di classe appariranno spesso in un file di intestazione poiché il compilatore dovrà conoscere le loro dimensioni se sono contenute in classi pubbliche. Esistono tecniche per rompere questo tipo di dipendenza, ma in genere impongono un costo in termini di complessità del codice, prestazioni o entrambi. Capire quando è appropriato usare una di queste tecniche richiede una comprensione più profonda di come funzionano le intestazioni in C ++.

    
risposta data 22.09.2015 - 17:37
fonte
3

Praticamente, c'è una piccola differenza tra un file di intestazione e un'interfaccia utilizzata da altre lingue per la parte principale. Ovviamente ci sono differenze nell'implementazione in quanto l'intestazione conterrà anche informazioni private, ma fondamentalmente vengono utilizzate per descrivere le funzionalità fornite dalla classe o dal modulo.

In un certo senso, è anche un modello mentale di strutture dati combinate con l'API, quindi può essere più utile quando stai facendo il tipo di progettazione iniziale che descrivi.

Idealmente un'intestazione che definisce un'API dovrebbe contenere solo l'interfaccia pura, ma poiché il C ++ non ha un ABI, questo non ha molta importanza. Se crei un sistema di livello superiore che fornisce un'interfaccia client pura, dovrai comunque utilizzare un meccanismo diverso come IDL o WSDL per definirlo comunque.

    
risposta data 22.09.2015 - 16:41
fonte
-1

Il file di intestazione come interfaccia pura funziona più o meno bene con le classi. Non appena i modelli entrano in scena, questo modello smette di funzionare in qualsiasi momento. I modelli non sono compilabili e l'intera implementazione del modello deve apparire nell'intestazione.

    
risposta data 23.09.2015 - 00:29
fonte

Leggi altre domande sui tag