Lo stato globale è malvagio se non cambia comportamento?

3

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.

    
posta user112513312 13.03.2017 - 02:17
fonte

1 risposta

4

La tua biblioteca deve tenere traccia di quali oggetti vengono usati perché?

Non dovrebbe essere la responsabilità del proprietario di quegli oggetti di conoscere tali informazioni a meno che non ci sia un contesto per tutti loro?

Se gli oggetti non dipendono l'uno dall'altro, la libreria non dovrebbe aver bisogno di tenere traccia di quali sono utilizzati, è il loro lavoro proprietari.

Se esiste effettivamente un contesto, è sufficiente fornire quel contesto al mondo esterno e richiederne l'uso nelle chiamate API.

    
risposta data 13.03.2017 - 02:55
fonte

Leggi altre domande sui tag