Il codice non-interfaccia dovrebbe essere nascosto dal client?

1

Sto lavorando su una libreria che ha diverse intestazioni che devono essere utilizzate solo dalla libreria stessa. Ho anche alcune classi e funzioni nelle intestazioni che non voglio che il client usi. Ad esempio, ho un'intestazione che contiene funzioni di debug, ma non dovrebbero essere utilizzate al di fuori della libreria in quanto potrebbero causare problemi.

Questo codice dovrebbe essere nascosto dal client? Se sì, come?

    
posta Pubby 02.11.2011 - 15:29
fonte

4 risposte

2

Un modo comune per gestirli è intestazioni pubbliche e private.

Dato che alcune cose devono apparire in un file di intestazione, sia per motivi di implementazione fisica, sia per motivi di prestazioni / inlining, devi dividere in qualche modo.

La tua intestazione pubblica include l'intestazione privata; e aggiungi commenti (s) nelle vicinanze che questo è un dettaglio implementatinn e soggetti a modifiche.

Ovviamente, hai ancora bisogno di spedire le intestazioni e saranno visibili all'utente finale, ma utilizzerebbero questi interni a proprio rischio.

    
risposta data 02.11.2011 - 16:05
fonte
1

Should this code be hidden from the client? If so, how?

Fuori rotta. Lo fai non fornendo le intestazioni. Ovvero, fornisci solo le librerie condivise e le intestazioni che dichiarano le classi che il tuo client dovrebbe utilizzare.

    
risposta data 02.11.2011 - 16:02
fonte
1

Sì, puoi farlo in C ++ usando l'idioma PIMPL . Se si utilizza questo idioma, è sufficiente lasciare che il client veda un'intestazione che definisce una semplice classe wrapper, che ha un puntatore alla classe reale come membro dei dati. Poiché si utilizza un puntatore, è necessario inoltrare solo la classe di implementazione reale nell'intestazione della classe wrapper. L'intestazione della classe di implementazione reale deve solo essere inclusa nel file .cpp del wrapper, quindi il client non la vedrà mai.

Detto questo, l'uso di PIMPL aggiunge complessità al tuo codice. Ora, se hai bisogno di una nuova funzione di membro pubblico, dovresti aggiungerla in due punti. Inoltre, dovresti passare attraverso più livelli di stack di chiamate durante il debug. Dovresti davvero pensare a lungo e duramente se nascondere alcune funzioni del tuo cliente valga questo lavoro extra.

P.S. L'idioma PIMPL ha un altro uso importante. Ti consente di rompere le dipendenze tra i componenti, riducendo l'accoppiamento rendendo più semplice la modifica del codice e riducendo in modo significativo i tempi di compilazione.

    
risposta data 02.11.2011 - 16:31
fonte
0

Se c'è qualche funzionalità che non dovrebbe essere raggiunta dal client, dovrebbe essere ben nascosta da loro.

Se stai per distribuire la tua libreria, senza alcun simbolo di debug, potresti prendere in considerazione l'idea di prendere anche la funzionalità di debug dalla tua distribuzione, invece di incapsularli.

    
risposta data 25.04.2015 - 22:07
fonte

Leggi altre domande sui tag