Le classi Manager possono essere un segno di una cattiva architettura, per alcuni motivi:
-
Identificatori senza significato
Il nome FooManager
non dice nulla su ciò che la classe effettivamente , tranne che in qualche modo coinvolge Foo
istanze. Dare alla classe un nome più significativo chiarisce il suo vero scopo, che probabilmente porterà al refactoring.
-
Responsabilità frazionali
Secondo il principio della responsabilità unica, ogni unità di codice dovrebbe servire esattamente a uno scopo. Con un manager, potresti dividere artificialmente questa responsabilità.
Considera un ResourceManager
che coordina le durate di e l'accesso alle istanze Resource
. Un'applicazione ha un singolo ResourceManager
attraverso il quale acquisisce Resource
istanze. In questo caso non c'è una vera ragione per cui la funzione di un'istanza ResourceManager
non può essere servita da metodi statici nella classe Resource
.
-
Astrazione non strutturata
Spesso viene introdotto un manager per astrarre i problemi sottostanti con gli oggetti che gestisce. Questo è il motivo per cui i manager si prestano ad abusare come cerotti per sistemi mal progettati. L'astrazione è un buon modo per semplificare un sistema complesso, ma il nome "manager" non offre alcun indizio sulla struttura dell'astrazione che rappresenta. È davvero una fabbrica, un proxy o qualcos'altro?
Ovviamente, i manager possono essere usati non solo per il male, per le stesse ragioni. Un EventManager
, che è in realtà un Dispatcher
, inserisce gli eventi dalle origini e li invia agli obiettivi interessati. In questo caso ha senso separare la responsabilità di ricevere e inviare eventi, perché un singolo Event
è solo un messaggio senza nozioni di provenienza o destinazione.
Scriviamo un Dispatcher
di Event
istanze essenzialmente per lo stesso motivo in cui scriviamo GarbageCollector
o Factory
:
Un manager sa quale sia il suo carico utile da non conoscere.
Questa, penso, è la migliore giustificazione per creare una classe manageriale. Quando si dispone di un oggetto "payload" che si comporta come un valore, dovrebbe essere il più stupido possibile in modo che il sistema generale rimanga flessibile. Per fornire un significato alle singole istanze, si crea un gestore che coordina quelle istanze in modo significativo. In qualsiasi altra situazione, i gestori non sono necessari.