Ho una libreria in C in cui l'API utilizza "oggetti" per interagire con l'applicazione. Questi "oggetti" sono puntatori opachi che vengono creati, distrutti e modificati tramite le chiamate API.
Questi "oggetti" non esistono in una gerarchia e le loro vite sono gestite in modo approssimativo. Di conseguenza, la libreria deve conservare pool di questi oggetti e traccia di quali vengono utilizzati e quali no. Ciò richiede che la libreria abbia una sorta di stato per la gestione di questi pool.
La mia soluzione attuale utilizza uno stato globale per gestirli, in questo modo:
initializeLibrary();
Object *obj = createObject();
//Do something with obj
destroyObject(obj);
terminateLibrary();
Tuttavia, è del tutto possibile rendere la libreria non basata sullo stato globale:
Instance *instance = initializeLibrary();
Object *obj = createObject(instance);
//Do something with obj
destroyObject(obj);
terminateLibrary(instance);
Il motivo per cui utilizzo uno stato globale è che è più semplice leggere il codice quando non sto passando attorno a una variabile di istanza ovunque. In genere, la ragione addotta per spiegare perché gli stati globali sono cattivi è che comporta un comportamento imprevedibile, ma non credo che si applichi qui.
La mia domanda è se il mio uso dello stato globale sia o meno una scelta sbagliata di design.