Sto costruendo una libreria piccola (pochi kLOC) che elabora i dati di streaming in C ++. Dai dati in streaming (inclusi nei pacchetti) la libreria compila un database pezzo dopo pezzo e, naturalmente, deve riportare tali informazioni all'applicazione host.
Poiché questa è la mia prima libreria, non sono sicuro di come procedere con l'interfaccia API. AFAIK Ho la scelta tra l'utilizzo di un "Interfaccia" CPP o callback in stile C. Questa domanda non riguarda solo l'aspetto della programmazione, ma anche l'aspetto della gestione dell'API della libreria tra le versioni:
Perché dovrei usare un'interfaccia?
- Le interfacce vengono dichiarate una volta e le modifiche alle API si riflettono direttamente in quella classe
- È impossibile dimenticare un metodo o un evento dato che la libreria non viene compilata
- È un C ++ "più pulito" rispetto ai callback in stile C
- Sono sicuro di quello che sto facendo all'interno della libreria e nascondo cose "forse complesse" dietro un valore di ritorno
Utilizzo di un'interfaccia
class InterfaceClass {
public:
virtual bool isDataBlockComplete(...) = 0;
virtual bool isDataBaseUpdated(...) = 0;
virtual bool hasEventCompleted(...) = 0;
[..]
}
/* User code */
class SomeClass : InterfaceClass { [..] }
bool SomeClass::hasEventCompleted(...){ /* check */ }
SomeClass *instance = new SomeClass();
InterfaceClass *instance = new InterfaceClass();
if(instance->hasEventCompleted) [..]
for(i = 0; i < instance->getQueueSize(); i++ ) [..]
Perché dovrei usare callback in stile C?
- Possono essere registrati e aggiornati durante il runtime
- Gli eventi possono essere "sottoscritti" in questo modo
- Aiuta a fornire un C-wrapper in un secondo momento
- È molto più veloce perché è necessario scrivere meno codice e amp; testato da me
Uso di callback
class InterfaceClass {
public:
registerCallback( void *f, tEvent event);
deregisterCallback(tEvent event);
}
/* User code */
void myfunc(){ .. }
instance->registerCallback(&myfunc, SOME_EVENT);
/* Gets called by the governor / observer of library */
Quindi questa non è una questione di preferibilità, ma quale "stile" da utilizzare per una biblioteca. Non ho trovato nulla in rete (tutto sembra ruotare attorno agli aspetti tecnici dell'uso di classi astratte virtuali o su come implementare i callback ma nessuno in realtà discute di quello che ho chiesto sopra) nonostante una ricerca approfondita (forse una scelta sbagliata di combinazioni di parole).
Quale stile è più adatto per questo tipo di libreria e perché? In che modo le librerie "professionali" comunicano con le applicazioni principali? (Forse troppo ampio per SE, ma provando comunque:))