Come creare una classe manager senza variabili globali né singleton?

7

Vorrei implementare un tipo di classe manager nella mia applicazione. Si occuperà di caricare le trame, elaborarle, distribuirle ecc ...

All'inizio volevo creare una variabile globale che contenga semplicemente un'istanza della mia classe manager. Ho trovato questa domanda: link . Tuttavia, sembra che gli utenti raccomandino di non utilizzare mai le variabili globali.

Bene allora, una volta ho sentito parlare di Singletons, quindi potevo usarlo invece. Voglio dire, creare solo un'istanza della mia classe manager sembra buona. Tuttavia, ho trovato questa altra domanda: Quando è appropriato Singleton? , che in pratica mi dice che Singletons sono, nella maggior parte degli scenari, una sorta di anti-pattern.

Ora sono un po 'perso - quale altro approccio posso adottare per creare la mia classe manager, il cui unico requisito è quello di essere accessibile da qualsiasi luogo?

    
posta Omega 17.12.2012 - 20:13
fonte

3 risposte

13

Suggerisco di esaminare l'utilizzo di un iniezione di dipendenza per ottenere inversion of control .

Il tuo "Manager" non sarebbe un Singleton tradizionale, ma ne creerai solo uno attraverso la configurazione del framework. Anche il "Manager" non sarebbe globale, ma ogni componente che avrebbe bisogno di usarlo lo avrebbe assegnato.

    
risposta data 17.12.2012 - 20:27
fonte
4

whose only requirement is to be accessible from anywhere?

Hai davvero letto queste due domande?

Avere qualcosa accessibile da qualsiasi luogo è il trabocchetto di design n. 1. Lega strettamente il tuo manager al tuo codice, impedendo che sia flessibile come deve essere, rendendo il codice difficile da testare, difficile da eseguire il debug, difficile da rendere simultaneo ...

No. Se devi avere un gestore (personalmente non credo strongmente nel link, ma vale la pena notare) quindi l'app dovrebbe crearne una e passarla a qualsiasi cosa abbia bisogno di una factory / manager per le tue trame / ecc.

    
risposta data 17.12.2012 - 20:20
fonte
4

it will be in charge of loading textures, processing them, distributing them

Bene, non conosco la tua applicazione, ma questo suona difficilmente come una cosa di cui hai bisogno ovunque nella tua applicazione, specialmente quando la tua applicazione è stratificata. Ne avrai bisogno da qualche parte nella tua applicazione, ed è qui che devi passarlo, non di meno, non di più.

Inoltre, queste tre responsabilità possono essere meglio suddivise in tre classi: una per caricare le trame, una per elaborarle e una per distribuirle. L'ultimo è probabilmente l'unico alcuni di cui potrebbe essere necessario accedere ad altre parti dell'applicazione dall'esterno.

Vorrei anche prendere in considerazione la creazione di un'interfaccia per il tuo "gestore di texture", chiamiamola ITextureManager . Le classi / oggetti che necessitano dell'accesso al gestore dovrebbero ricevere un'istanza ITextureManager attraverso il loro costruttore. In seguito, potresti prendere in considerazione l'uso di un framework DI, come suggerito da @ smp7d, ma in realtà ciò non fa realmente la differenza sulla tua domanda - se non sei in grado di disaccoppiare il tuo codice da una classe manager "manualmente", hai vinto avere più successo quando si tenta di utilizzare il framework DI.

    
risposta data 17.12.2012 - 23:56
fonte

Leggi altre domande sui tag