Programmazione C - Vantaggi e svantaggi dell'utilizzo di puntatori opachi per la gestione della struttura

2

Quali sono i principali vantaggi e svantaggi di me che utilizzo i puntatori opachi per tutte le mie strutture? Ho pensato di usare questo approccio e qui ci sono alcuni pensieri banali che ho:

Vantaggi banali: l'implementazione della struttura è nascosta, richiedendo a chi utilizza i miei moduli di utilizzare solo le funzioni implementate disponibili (creando utilizzando le fabbriche e le firme di gestione / modifica dei dati nella struttura).

Svantaggi banali: non è possibile accedere ai campi della struttura direttamente, il che implica la necessità di implementare tutti i tipi di funzioni per recuperare i valori e solo quelli che lo sviluppatore vuole.

Quindi il principale vantaggio sembra essere anche il mio principale svantaggio?

Esiste un approccio migliore per archiviare l'accoppiamento inferiore e una maggiore coesione tra l'uso delle strutture nei miei moduli C?

    
posta Pedro Freitas 08.03.2017 - 17:46
fonte

1 risposta

3

Uno dei principali svantaggi: l'uso di un puntatore opaco impedisce di allocare le strutture dallo stack. Quindi, se hai una chiamata di funzione in cui hai bisogno di una struttura per la durata della chiamata ma non ne hai bisogno dopo che la funzione è tornata, sei ancora costretto a usare malloc () per la struttura.

Non farlo! malloc () è molto, molto più lento dell'allocazione dello stack. Non solo, ma anche malloc () è soggetto a perdite di memoria. Se invece si definisce la struttura nel file di intestazione, è possibile allocare la struttura dallo stack per il caso di esempio.

Naturalmente, avere la struttura nel file di intestazione consente di utilizzarla in modo errato rompendo l'astrazione. Pertanto, è tua responsabilità definire le funzioni che operano sulla struttura e assicurarti che tutti utilizzino costantemente tali funzioni e non l'accesso diretto ai membri.

Per questo motivo, definisco quasi sempre le strutture nei file di intestazione. Definisco anche le funzioni che operano sulla struttura, le funzioni di inizializzatore / finalizzatore e una macro preprocessore STRUCTURE_INIT che può essere utilizzata al posto di una chiamata di funzione per inizializzare la struttura (se possibile).

Inoltre, se la struttura è definita in un file di intestazione, è possibile utilizzare le funzioni statiche in linea. Sono molto più veloci delle chiamate alle funzioni reali, pur non avendo gli svantaggi delle macro del preprocessore.

    
risposta data 08.03.2017 - 18:43
fonte

Leggi altre domande sui tag