Eu sei que ter variáveis globais ou classes singleton cria casos que podem ser difíceis de testar / gerenciar e eu fui impedido de usar esses padrões no código, mas muitas vezes você precisa enviar.
Existem casos em que variáveis globais ou singletons são realmente úteis no desenvolvimento de jogos?
software-engineering
design-patterns
Ólafur Waage
fonte
fonte
Definitivamente uma lista não exaustiva, mas aqui vai:
Contras
Prós ou contras
Prós
Usamos muito uma "estrutura de singletons globais" em nossos títulos portáteis. Os títulos de PC e console tendem a confiar neles menos; mudaremos mais para uma arquitetura orientada a eventos / de mensagens. Dito isto, os títulos de pc / console ainda costumam usar um TextureManager central; como geralmente envolve um único recurso compartilhado (a memória de textura), isso fez sentido para nós.
Se você mantiver sua API relativamente limpa, talvez não seja muito difícil refatorar (ou entrar!) Em um padrão singleton quando você precisar ...
fonte
Eles podem ser muito úteis, especialmente durante a criação de protótipos ou a implementação experimental, mas, em geral, preferimos passar referências para estruturas como gerente, dessa forma, pelo menos você tem algum controle sobre de onde eles são acessados. O maior problema com globals e singletons (na minha opinião) é que eles não são muito compatíveis com multithread, e o código que os utiliza é muito mais difícil de portar para a memória não compartilhada, como as SPUs.
fonte
Eu diria que o design singleton em si não é útil. As variáveis globais podem definitivamente ser úteis, mas prefiro vê-las ocultas atrás de uma interface bem escrita, para que você não esteja ciente da existência delas. Com singletons, você está definitivamente ciente de sua existência.
Costumo usar variáveis globais para coisas que precisam acessar todo o mecanismo. Minha ferramenta de desempenho é um bom exemplo que eu uso em todo o mecanismo para chamar. As chamadas são simples; ProbeRegister (), ProbeHit () e ProbeScoped (). Seu acesso real é um pouco mais complicado e usa variáveis globais para algumas de suas coisas.
fonte
O principal problema com os globais e mal implementados singletons são erros obscuros de construção e desconstrução.
Portanto, se você trabalha com primitivas que não têm esses problemas ou estão muito conscientes do problema com um ponteiro. Então eles podem ser usados com segurança.
Globais têm seu lugar, o mesmo que gotos, e não devem ser descartados imediatamente, mas usados com cuidado.
Há uma boa explicação sobre isso no Guia de estilos do Google C ++
fonte
Globais são úteis ao prototipar rapidamente um sistema que requer algum estado entre as chamadas de função. Depois de estabelecer que o sistema funciona, mova o estado para uma classe e transforme as funções em métodos dessa classe.
Singletons são úteis para causar problemas a você e aos outros. Quanto mais estado global você apresentar, maiores serão os problemas com correção, manutenção, extensibilidade, concorrência de código, etc. Apenas não faça isso.
fonte
Costumo recomendar o uso de algum tipo de contêiner de DI / IoC com gerenciamento de vida útil personalizado em vez de singletons (mesmo se você usar um gerenciador de vida útil de "instância única"). Pelo menos, é fácil trocar a implementação para facilitar o teste.
fonte
Se você deseja que os recursos de economia de memória de um singleton possam experimentar o padrão de design flyweight?
http://en.wikipedia.org/wiki/Flyweight_pattern
No que diz respeito aos problemas de vários segmentos mencionados acima, deve ser bastante simples, com alguma previsão, implementar um mecanismo de bloqueio de recursos que possam ser compartilhados entre os segmentos. http://en.wikipedia.org/wiki/Read/write_lock_pattern
fonte
Singletons são uma ótima maneira de armazenar um estado compartilhado em um protótipo inicial.
Eles não são uma bala de prata e vêm com alguns problemas, mas são um padrão muito útil para determinados estados de interface do usuário / lógica.
Por exemplo, no iOS, você usa singletons para obter o [UIApplication sharedApplication], no cocos2d você pode usá-lo para obter referências a determinados objetos como [CCNotifications sharedManager] e, pessoalmente, geralmente começo com um singleton [Game sharedGame] onde posso estado de armazenamento compartilhado entre vários componentes diferentes.
fonte
Uau, isso é interessante para mim, pois nunca tive um problema pessoal com o padrão singleton. Meu projeto atual é um mecanismo de jogo em C ++ para o Nintendo DS e estou implementando muitos utilitários de acesso a hardware (por exemplo, VRAM Banks, Wifi, os dois mecanismos gráficos) como instâncias singleton, porque pretendem envolver C global funções na biblioteca subjacente.
fonte
Somente quando você tem um item que possui apenas um controlador, mas é tratado por vários módulos.
Como, por exemplo, a interface do mouse. Ou interface de joystick. Ou leitor de música. Ou leitor de som. Ou a tela. Ou o gerenciador de arquivos salvos.
fonte
Globais são muito mais rápidos! Portanto, ele se encaixaria perfeitamente para um aplicativo com alto desempenho, como um jogo.
Singletons são uma IMO global melhor e, portanto, a ferramenta certa.
Use com moderação!
fonte