As classes do gerenciador podem ser um sinal de uma arquitetura ruim, por alguns motivos:
-
Identificadores sem significado
O nome
FooManager
não diz nada sobre o que a classe realmente faz , exceto que de alguma forma envolveFoo
instances. Dar à turma um nome mais significativo elucida sua verdadeira finalidade, o que provavelmente levará à refatoração. -
Responsabilidades fracionárias
De acordo com o princípio da responsabilidade única, cada unidade de código deve atender exatamente a um propósito. Com um gerente, você pode estar dividindo artificialmente essa responsabilidade.
Considere um
ResourceManager
que coordena as vidas úteis e o acesso aResource
instâncias. Um aplicativo tem um únicoResourceManager
através do qual adquireResource
instâncias. Nesse caso, não há motivo real pelo qual a função deResourceManager
instance não possa ser atendida por métodos estáticos na classeResource
. -
Abstração não estruturada
Geralmente, um gerente é apresentado para abstrair os problemas subjacentes com os objetos que gerencia. É por isso que os gerentes se prestam a abusos como band-aids para sistemas mal projetados. A abstração é uma boa maneira de simplificar um sistema complexo, mas o nome “gerenciador” não oferece nenhuma pista sobre a estrutura da abstração que ela representa. É realmente uma fábrica, um proxy ou outra coisa?
Naturalmente, os gerentes podem ser usados para mais do que apenas o mal, pelas mesmas razões. Um EventManager
- que é realmente um Dispatcher
- armazena eventos de fontes e os envia para destinos interessados. Neste caso, faz sentido separar a responsabilidade de receber e enviar eventos, porque um indivíduo Event
é apenas uma mensagem sem noção de proveniência ou destino.
Escrevemos Dispatcher
de Event
instâncias essencialmente pela mesma razão que escrevemos GarbageCollector
ou Factory
:
Um gerente sabe o que sua carga útil não precisa saber.
Essa, eu acho, é a melhor justificativa para criar uma classe de gerência. Quando você tem algum objeto de "carga útil" que se comporta como um valor, ele deve ser o mais estúpido possível para que o sistema geral permaneça flexível. Para fornecer significado a instâncias individuais, você cria um gerente que coordena essas instâncias de maneira significativa. Em qualquer outra situação, os gerentes são desnecessários.