Ho scritto un paio di librerie da quando ho iniziato a usare C di nuovo l'anno scorso. Una cosa che deve ancora essere affrontata in entrambi è l'uso corretto degli elenchi basati su array - di seguito, ArrayLists.
Al momento tendo a fare allocazioni di array una tantum (in genere allocazione statica) basate su costanti di libreria ( define
s) che possono essere ottimizzate dall'utente prima di compilare. Di solito utilizzo array di puntatori o valori piccoli, quindi la memoria persa allocando dimensioni eccessive è di scarsa importanza.
Questo approccio va bene per molti casi ma non per tutti. Ad esempio, al momento ho bisogno di implementare il pattern Observer come parte di una di queste librerie, e sembra saggio disporre di una matrice di dimensioni dinamiche per gli elenchi degli iscritti memorizzati sul server di pubblicazione. Quindi sembra il momento giusto per configurare ArrayLists per tutti i casi, sostituendo per la maggior parte i miei vecchi array a dimensione fissa.
La mia domanda riguarda i dettagli di questo in quanto riguarda le librerie di uso generale. Ci sono molte implementazioni di ArrayList là fuori e sarebbe ingenuo da parte mia presumere che il mio sia meglio di quegli altri. Non voglio forzare la mia implementazione su nessuno; o, per dirla in altro modo, solo perché hai scelto di usare la mia biblioteca non significa che voglio che tu usi la mia ingenua lista di Array. Non solo, ma in molti casi, se la mia libreria è usata in un dato progetto, sembrerebbe naturale usare la tua implementazione ArrayList su tutto il codice in quel progetto, piuttosto che il mio per certe cose e il tuo per altre cose - dovrebbe essere uniforme.
Ecco come penso che dovrei affrontare questo in C, usando l'editore / sottoscrittore come esempio:
- Nell'intestazione, dichiarare le funzioni dell'interfaccia per includere diverse implementazioni, ad esempio, ad es.
publisher_add_subscriber()
avvolgerebbe una chiamataadd()
per alcuni ArrayList, potrebbe essere tuo, mio o di qualcun altro: il punto è che diverse implementazioni potrebbero essere scambiate dentro / fuori; - assicurati che tutte le funzioni così implementate usando la mia implementazione ArrayList predefinita non facciano parte del file sorgente principale della libreria, ma piuttosto siano conservate in un file sorgente separato in modo che sia banale reimplementarle.
Ci sono problemi evidenti con questo corso presunto? Suggerimenti o alternative?
P.S. FWIW, la mia C è molto orientata agli oggetti in natura; forse questo migliorerà le tue risposte.
P.P.S. Una risposta ovvia potrebbe sembrare: "Il tuo ArrayList è un dettaglio di implementazione e quindi dovrebbe comunque essere nascosto dietro un'interfaccia opportunamente opaca, rendendola così irrilevante." C'è del vero in questo, tranne che per due cose: (1) C espone tutti i dati, e per questo motivo mi piace avere accesso a strutture di dati simili su tutta la linea quando si sceglie di accedere agli interni; (2) si potrebbe scegliere di scambiare un'altra implementazione di ArrayList per motivi di prestazioni.