É uma prática / design ruim de codificação criar uma classe que será instanciada apenas uma vez?
Eu tenho algumas variáveis e funções que podem ser agrupadas em uma classe para "parecerem boas" (por falta de uma descrição melhor), pois elas são um pouco relacionadas, mas podem ser apenas variáveis globais e funções globais.
(Btw, estou usando JavaScript, AngularJS, Express, MongoDB.)
design
design-patterns
Alice
fonte
fonte
Respostas:
Uma única instância para uma classe faz sentido se o objeto representar um único recurso, como uma conexão Ethernet ou o gerenciador de tarefas do sistema operacional, por exemplo.
As funções são colocadas em uma classe apenas se elas agirem sobre as variáveis das instâncias dessa classe; caso contrário, o mantenedor ficará confuso sobre a intenção dessa classe.
Geralmente, existe um bom motivo para o seu aplicativo ter variáveis globais. Tente encontrar o objetivo comum deles e crie uma classe em torno desse objetivo. Isso não apenas tornará o design claro, mas também sua mente.
fonte
Não há problema em escrever uma classe que acaba sendo instanciada apenas uma vez.
Se juntar algumas variáveis e funções dentro de uma classe faz sentido, tem valor semântico ou torna o código mais fácil de ler e manipular, então os mantenedores serão gratos.
O que pode estar muito errado, porém, é reforçar a singularidade por dentro.
Muitas pessoas tendem a disparar o padrão singleton assim que pensam que precisam apenas de uma instância de algo. Veja, por exemplo, como você não descreveu seu contexto em profundidade, mas a maioria das respostas já sugere que você use um singleton. E então o design pode ser danificado, porque se você precisar de outra instância em algum momento por qualquer motivo, a classe impedirá que você faça isso sem alterar muito código.
Portanto, como conclusão, uma instância é boa, mas saiba se:
fonte
Dictionary<TKey,KTValue>
sejam distintos. Se todas as instâncias de umaDictionary<TKey,KTValue>
instância usam o mesmoIEqualityComparer
, não há ambiguidade, mas se elas podem usar comparadores diferentes que definem diferentes relações de equivalência, não sei se é possível definira.ContentsDistinctFrom(b)
com sensibilidade para sempre igualb.ContentsDistinctFrom(a)
.Não, mesmo que apenas instanciado uma vez, você precisa de uma classe para isso. Mas não pense que você sempre precisará apenas de uma instância, agora e no futuro.
Suponha que você faça um jogo e tenha uma classe de jogadores:
Você instancia uma classe de jogador no seu jogo e usa sempre o mesmo objeto. Nada de errado com isso.
No entanto, não faça dele um Singleton! Hoje você cria seu jogo e pensa: "Bem, sempre será um jogo para um jogador. Vou usar um Singleton para meu jogador". Mas na versão 2, você pode implementar o modo multiplayer - e então está enfrentando problemas. Você precisará reescrever e adaptar muito código, porque seu design não suporta instanciar vários players.
O mesmo é com caches. Ou madeireiros. Ou interfaces de rede. Hoje, você acha que precisará apenas de um, sempre, com certeza. Mas em uma versão futura você precisará adicionar um segundo. Esteja ciente desta situação.
fonte
Existem classes singleton e esse é um padrão de design comum.
Também existem classes que nunca são instanciadas. Se você possui funções que NÃO operam em nenhum estado persistente (por exemplo, elas recebem a entrada e a transformam), geralmente você pode usar um método estático. Em algumas linguagens (como Java), esses métodos estáticos seriam declarados em uma classe, mas a própria classe nunca será instanciada.
fonte
O padrão singleton é comum. Ele permite impor uma instância única da classe.
Mas, para alguns, é muito comum, por isso se torna um antipadrão. A razão para isso é porque é praticamente igual ao estado global. E qualquer estado global é difícil de zombar, testar e depurar. Mas, ao mesmo tempo, ter que passar explicitamente essa instância em qualquer lugar do código pode fazer com que o código fique muito inchado. Mas isso fará você pensar na arquitetura adequada. Se várias classes usarem esse único singleton, você pode pensar que elas estão relacionadas de alguma forma e criar ancestral comum para elas, que encapsularão essa instância para elas.
fonte
É ruim supor que algo seja universalmente ruim. No seu caso, talvez seja uma boa ideia, mas, como você está usando uma linguagem que não é OO, é mais apropriado provavelmente usar apenas métodos e variáveis soltas e colocá-los em uma biblioteca comum que você inclui no seu outro trabalho.
fonte
Você está fazendo duas perguntas em uma.
fonte