Sto avviando un progetto parallelo in C che richiede che più backend di archiviazione siano guidati da una particolare logica. Questi back-end di archiviazione sarebbero collegati ciascuno con la decisione di quale utilizzare per l'utilizzo specificato in fase di runtime.
Quindi, ad esempio, se invoco il mio programma con un set di parametri, eseguirò le operazioni in memoria, ma se modifico la configurazione del programma, scriverebbe su disco.
L'idea di fondo è che ogni back-end di storage dovrebbe implementare lo stesso protocollo. In altre parole, la logica per le operazioni di esecuzione dovrebbe avere bisogno di sapere su quale back-end funziona.
Attualmente il modo in cui ho pensato di fornire questa indiretta è di avere un struct
di puntatori di funzione con la logica che chiama questi puntatori di funzione. Essenzialmente la struttura contiene tutte le operazioni necessarie per implementare la logica di livello superiore E.g.
struct Context {
void (* doPartOfDoOp)(void)
int (* getResult)(void);
}
//logic.h
void doOp(Context * context) {
//bunch of stuff
context->doPartOfDoOp();
}
int getResult(Context * context) {
//bunch of stuff
return context->getResult();
}
Le mie domande sono se questo modo di risolvere il problema è comprensibile a un programmatore C? Sono uno sviluppatore Java per mestiere, ma mi piace usare C / ++. Essenzialmente la struttura Context fornisce un'interfaccia come livello di riferimento indiretto. Tuttavia mi piacerebbe sapere se esiste un modo più idiomatico per raggiungere questo obiettivo.