Pergunta

Possíveis Duplicados:
O que há de tão ruim sobre gestações únicas?

É compreensível que muitos padrões de projeto pode em alguns casos ser abusada, e como minha mãe sempre disse:"Demasiada de uma coisa boa, nem sempre é bom!"

Estou percebendo que esses dias, eu estou usando Singletons um monte, e eu estou preocupado que eu possa estar abusando do padrão de design de mim mesmo, e a execução de mais profundo e mais profundo em uma má-prática espécie de hábito.

Estamos a desenvolver uma aplicação Flex que tem uma grande estrutura de dados hierárquica mantida na memória enquanto o usuário trabalha sobre ele.O usuário pode carregar, salvar, alterar e atualizar os dados sobre a demanda.

Esta informação é centralizado por meio de uma classe Singleton, que agrega um par de ArrayCollections, Arrays, objetos de valor e algumas outras espécies de variáveis de membro do exposto através de getters e setters.

Para obter uma referência para os nossos dados a partir de qualquer lugar no aplicativo, nós fazemos todo o Modelo.getInstance() método tipo de coisa, que eu tenho certeza que todo mundo está familiarizado com.Isso garante que sempre obtemos as nossas mãos sobre a mesma cópia dos dados, desde quando concebemos, nós, disse que só uma vez instância é permitida a existir durante o tempo de vida do aplicativo.

A partir desta central do repositório de dados, é fácil para nós, por exemplo, envio propriedade mudou de eventos, e pode ter vários componentes de INTERFACE do usuário que a referência central de dados, atualização de suas telas para refletir as alterações de dados que ocorreram.

Até agora, esta abordagem tem sido eficaz e comprovado, muito prático para as nossas circunstâncias.

Eu estou achando no entanto, que estou um pouco overeager quando a criação de novas turmas.Perguntas como uma classe deve ser um Singleton, ou deveria ser, em vez conseguiu de alguma outra forma, como, talvez, usando de uma fábrica, por exemplo, tendem, por vezes, tornar-se um pouco difícil, com um pouco de incerteza.

Onde posso desenhar a linha com gestações únicas?Há uma boa diretriz para decidir quando usar Singletons e quando ficar longe deles.

Também, alguém pode recomendar um bom livro sobre padrões de projeto?

Foi útil?

Solução

A principal coisa a se lembrar é que padrões de projeto são apenas uma ferramenta para ajudar você a entender os conceitos abstratos.Uma vez que você tem que entender, restringindo-se especificamente para uma "receita" de um livro é inútil e machuca a sua capacidade de escrever o código mais adequado para o seu propósito.

O que disse, leitura de livros como GoF irá apresentar-lhe com mais maneiras de pensar sobre os problemas, de modo que, quando chega a hora de implementar algo em seu próprio país, você vai ter um conjunto mais amplo de perspectivas para a abordagem do problema.

No seu caso, se utilizar o singleton faz sentido, em cada caso, em seguida, vá em frente.Se "uma espécie de" se encaixa e você tem que implementar-lo de alguma estranha maneira, então você precisa vir para cima com uma nova solução.Forçando um padrão que não é perfeito, é um pouco como martelar um pino quadrado em um buraco redondo.

Dado que você diz "esta abordagem tem sido eficaz e comprovado, muito prático para nossas circunstâncias," eu acho que você está indo bem.

Aqui estão alguns bons livros:

O Gang of Four Livro - o livro clássico de padrões de projeto

Head First Design Patterns - Eu já ouvi este recomendado por algumas pessoas como uma alternativa

Outras dicas

Sim, singletons são ruins.Eles são maus porque tudo o que eles fazem para você é combinar duas propriedades, cada um dos quais é ruim, cerca de 95% do tempo.(O que significa que, em média, singletons são ruins 99,75% de da tempo ;))

Um singleton, conforme definido pelo GoF, é uma estrutura de dados que:

  1. Subsídios globais de acesso a um objeto, e
  2. Impõe que somente uma instância do objeto pode existir.

O primeiro é geralmente considerado uma coisa ruim.Nós não gostamos de globals.O segundo é um pouco mais sutil, mas, em geral, praticamente não há casos onde isso é razoável de restrição para impor.

Às vezes, ela só faz sentido ter uma instância de um objeto.Caso em que você escolher para criar apenas uma.Você não precisa de um singleton para aplicá-la.

E, geralmente, mesmo quando se "faz sentido" para ter apenas uma instância, acaba por não fazer sentido depois de tudo.Mais cedo ou mais tarde, você vai precisar de mais do que um registrador.Ou mais do que um banco de dados.Ou você vai ter que recriar recursos para cada um dos seus testes de unidade, o que significa que temos de ser capazes de criá-los à vontade.É prematuramente a remoção de flexibilidade do nosso código, antes de compreender as conseqüências.

Singletons ocultar dependências e aumento de acoplamento (cada classe pode, potencialmente, dependem de um singleton, o que significa que a classe não pode ser reutilizado em outros projetos, a menos que nós também a reutilização de todos os nossos singletons), e porque estas dependências não são imediatamente visíveis (como a função/construtor com parâmetros), nós não notá-los, e geralmente não pensamos sobre ele, quando criá-los.É tão fácil simplesmente puxar um singleton, ele age quase como uma variável local e de todos, por isso, tendem a usá-los muito, uma vez que eles estão lá.E o que torna quase impossível para remover novamente.Você acaba, talvez não com o código espaguete, mas com espaguete gráficos de dependência.E mais cedo ou mais tarde, a sua fuga dependências significa que singletons iniciar, dependendo uns dos outros, e, em seguida, você começa a dependências circulares quando um é tentado inicializado.

Eles fazem com que seja extremamente difícil para a unidade de teste.(Como você testar uma função que chama as funções de um objeto singleton?Nós não queremos que o real singleton código a ser exercida, mas como podemos evitar isso?

Sim, singletons são ruins.

Às vezes, você realmente quer um mundial.Em seguida, use uma global, e não um singleton.

Às vezes, muito, muito, muito raramente, você pode ter uma situação onde a criação de várias instâncias de uma classe é um erro, onde pode não pode ser feito sem causar erros.(Sobre o único caso em que pode pensar, e até mesmo que é artificial, é se você está representando algum dispositivo de hardware.Você só tem uma GPU, então se você está indo para mapeá-lo para um objeto em seu código, ele deve fazer sentido que apenas uma instância pode existir).Mas se você se encontrar em uma situação dessas (e de novo, para dar ênfase, uma situação em que várias instâncias causar erros graves, não apenas uma situação em que "eu não consigo pensar em qualquer dos casos de uso de mais de uma instância"), em seguida, aplicar essa restrição, mas fazê-lo sem também fazer o objeto globalmente visível.

Cada uma destas duas propriedades pode ser útil, em casos raros.Mas eu não consigo pensar em um único caso em que o combinação um deles seria uma coisa boa.

Infelizmente, muitas pessoas têm a idéia de que "Singletons são OOP compatível com globals." Não, eles não são.Eles ainda sofrem os mesmos problemas globais, além de para a introdução de alguns outros, completamente alheios queridos.Não há absolutamente nenhuma razão para preferir um singleton sobre uma planície de idade global.

Os desenvolvedores de Software parecem ser bastante uniformemente divididos em dois grupos, dependendo de se elas favorecem um idealista estilo de codificação ou de um pragmatismo:

  • Idealista: Nunca use o padrão singleton.
  • Pragmática: Evitar o padrão singleton.

Pessoalmente, sou a favor de a abordagem pragmática.Às vezes faz sentido para quebrar as regras, mas só se você realmente entender o que você está fazendo e estão dispostos a aceitar os riscos associados.Se você puder responder "sim" para as perguntas abaixo sobre o seu caso de uso específico, o padrão singleton pode gerar alguns benefícios práticos.

  • É o singleton externas para o seu aplicativo?Bancos de dados, serviços de enfileiramento, e ESBs são todos perfeitamente válido exemplos de macro do padrão singleton.
  • BEIJO:É você toda a aplicação limitada para 2-3 interno singletons?
  • SECA:São os singletons inerentemente global e, por conseguinte, resultar em ter que prumo referências em quase cada objeto em seu aplicativo?(por exemplo, um registrador ou componente mediador)?
  • Faça o seu singletons dependem apenas uns com os outros, e/ou o ambiente de funcionamento?
  • Você já garantiu o start-up apropriado e desligar seqüências para cada singleton, incluindo o gerenciamento de memória considerações?Por exemplo, um "Grand Central"estilo de pool de threads pode necessitar de instância Run() e de Encerramento() métodos de main() para que as tarefas são garantidos para ser executado somente quando os objetos que operam estão em um estado válido.

Singletons não matam programas, programadores de matar programas.

Como qualquer construção de programação, quando usados de forma apropriada, você não vai atirar no próprio pé.

Os livros recomendados são bons, mas não é sempre que eles dão o suficiente de fundo que vem com a experiência em quando, você pode fazer a opção de usar o Singleton.

Que experiência só vem quando você encontrou Singleton é uma má escolha quando você precisa ter várias instâncias, e, de repente, você tem um monte de problemas para injetar as referências de objeto em qualquer lugar.

Às vezes é melhor ir adiante e ter as referências de objeto no lugar, mas o fato de que você está usando Singleton em todos os ajuda a identificar o escopo do problema, você teria de enfrentar se você tivesse que refatorá-lo para um projeto diferente.O que eu acredito que é uma coisa muito boa:i.e.basta ter uma classe em tudo (mesmo se mal projetados) dá a capacidade de ver os efeitos de uma alteração na classe.

Iniciamos um projeto onde nós estamos, basicamente, de frente para a mesma questão, que é, como acesso o modelo de, e, especialmente, o seu elemento raiz.O projeto não é um aplicativo Flex, mas um jogo!web app, mas isso não importa realmente.

Ter um único objeto exclusivo o sistema é bom, o problema é como aceder.Assim, o debate sobre singleton está relacionado com a noção de injeção de dependência (DI), e como obter os objetos.

Os principais argumentos para DI são os seguintes:

  • capacidade de teste e o escárnio
  • dissociação de instanciação de objeto de uso (o que pode levar a gestão do ciclo de vida)
  • separação de preocupações

Abordagens possíveis para a DI (ver o clássico artigo a partir de Fowler):

  • para passar de objeto em torno de parâmetros do método
  • localizador de serviço
  • DI marco

Sob esta perspectiva, o padrão singleton é apenas um tipo de serviço de localizador, e.g. Model.getInstance().

Mas para proporcionar o máximo de flexibilidade em face das alterações futuras, a referência para o objeto exclusivo deve ser passados cerca de tanto quanto possível, e obtido com Model.getInstance() somente quando necessário.Isso também irá produzir código mais limpo.

Na minha opinião o uso de Singletons diretamente os sinais de uma falha de projeto.A razão é simplesmente que eles permitem ignorar o objeto normal criação e destruição de mecanismos construído em C++.Se um objeto precisa de uma referência para outro objeto, ele deve passar uma referência a ele em cima da construção ou criar uma nova instância da internamente.Mas quando você usa um singleton você está explicitamente ofuscando a criação e a subdivisão de ciclo.Um problema relacionado é que é extremamente difícil controlar o tempo de vida de um singleton.Como resultado, muitos pacotes que incluem genérico singleton implementações também incluir desajeitado tempo de vida do objeto gestores e afins.Às vezes me pergunto se estes não existem simplesmente para gerenciar as gestações únicas.

Basicamente, se você precisa usar um objeto em muitos lugares, ele deve ser criado explicitamente ao mais alto ponto comum na pilha e, em seguida, transmitida através de referência a todos que o usa.Às vezes as pessoas usam gestações únicas, porque eles têm problemas de passar vários argumentos para novos segmentos, mas não caia para isso, definir explicitamente o seu segmento args e passá-las para o novo segmento da mesma maneira.Você verá que o programa flui muito mais limpo e não há surpresas desagradáveis devido a inicialização estática dependências errada ou desmontagem.

Singletons são, certamente, não é ruim.Eles têm seus usos, alguns deles muito bom.Singletons tendem a ser usadas por desenvolvedores inexperientes, como é muitas vezes o primeiro projeto patten, eles aprendem sobre, e é bastante simples, para que eles chuck em torno de todo o lugar, sem pensar nas implicações.

Cada vez que você quiser usar um singleton, tente pensar por que você está fazendo isso, e quais são os benefícios e os negativos dos que usam esse padrão.

Singletons fazer de forma eficaz de criar um acessíveis conjunto de 'coisas' (de dados ou métodos) e eu acho que a maioria das pessoas concordam que usar muitas variáveis globais não é uma boa ideia.O ponto inteiro de aulas e a orientação a objeto é agrupar as coisas em áreas separadas, em vez de apenas jogar tudo em uma enorme espaço global.

Um dos 'padrões' eu acho que eu tendem a preferir mais de singletons é passar objetos necessários para baixo a partir do topo.Eu criá-los uma vez durante meus aplicativos fase de inicialização, e passá-los para baixo através de todos os objetos que necessitam de acesso a eles.Ele imita o 'único-a criação de" parte de um padrão singleton, mas sem o 'global' parte.

O ponto inteiro de um singleton é que para objetos onde apenas 1 deve sempre existir.Você menciona um controle de dados conjunto de classes.Talvez considerar que, na verdade, há casos em que um aplicativo pode criar 2 conjuntos de dados de controle de classes, então, talvez, a aplicação de um singleton sobre isso não é muito certo.Em vez disso, se você criou estas classes de dados no aplicativo de inicialização, e passou-os para baixo, você seria apenas criar 1 conjunto que é o que você app atual exige, mas você deixar em aberto a possibilidade de que em algum ponto, se você precisa de um segundo conjunto, você pode facilmente criar-los.Além disso, deve dados de classes de controle realmente ser acessível globaly a partir de qualquer lugar no aplicativo.Eu acho que não, em vez disso, eles provavelmente deve ser apenas acessível a partir de um nível inferior a camada de acesso a dados.

Algumas pessoas têm recomendado o GOF livro.Eu diria, sim, que é um grande livro, mas, primeiro, tentar encontrar um livro sobre a arquitetura geral primeiro, leia a cerca de 2/3/n-tier design, encapsulamento, abstração, e este tipo de princípios primeiros.Isso vai lhe dar uma base mais sólida com a qual, para compreender o uso apropriado dos padrões do GOF falar.

[Editar:O outro momento em que um singleton variante pode ser útil é quando você desejar criar um único ponto de acesso para algo, mas o detalhe de implementação na verdade, pode ser mais de uma coisa.O autor da chamada não precisa saber, que, sob o cobre o seu pedido para o objeto singleton, na verdade, é resolvido com vários objetos disponíveis e um é retornado.Eu estou pensando em algo como um pool de threads aqui, onde o uso passa, ei, só me uma thread, eu preciso de 1, mas eu não me importo qual]

Eu sei que essa é uma velha discussão, mas ninguém parecia mencionar o padrão real que se encaixa o que o OP estava tentando fazer.O que eu acredito que ele está descrevendo uma necessidade é chamado a Padrão De Mediador.SourceMaking é um local fantástico para aprender / fazer referência a esse tipo de informação.Definitivamente o meu vá para o local para introduzir as pessoas aos padrões de software.Também, é geralmente uma boa idéia para não comprar na noção de que qualquer padrão de design é necessariamente inerentemente bom ou mal.Todos eles têm o seu uso, é só aprende quando e onde usá-los de que é o truque.As pessoas que afirmam nunca utilizar Singletons, para mim, não entendem a sua utilidade.

Não, eles não são necessariamente ruins.

Como um livro, você precisa iniciar com o clássicos.

Singletons não são "tão ruim".Se você tem um monte de Singletons relacionados e você pode substituir/consolidar um número delas, utilizando uma Fábrica, sem perder qualquer coisa que você gosta, então é aí que você deve então fazer.

Como aos livros, bem, há um tipo de canon.

O Google parece ser convencido de que Singletons são uma má idéia.

Isso não é para sugerir que tudo que o Google faz é perfeito ou que cada opinião é o fim de qualquer argumento, mas tenho ido tão longe a ponto de escrever este Singleton detector de raiz-los.Fazer a sua própria mente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top