DEV Community

loading...
Cover image for Ruby e o Anti-Pattern: Singleton.

Ruby e o Anti-Pattern: Singleton.

devneto profile image Miguel ・2 min read

O que é Design Pattern?

De forma abstrata o Design Pattern é um conjunto de ideias sistemáticas de como resolver um problema que podem ser usadas em muitas situações semelhantes. Se tratam de um conjunto de boas práticas que o desenvolvedor pode utilizar como ferramenta para arquitetar uma aplicação.

Singleton, o anti-pattern.

O Singleton, classificado como um padrão criacional tem como objetivo garantir que uma classe possua apenas uma instância, provendo a mesma ao restante da aplicação.

Baseado nesse princípio podemos definir que o Singleton possui a missão de:

  • Criar uma unica instância;
  • Retornar um objeto.

Alt Text

"Nem tudo são flores."

Ao observamos a definição do mesmo, fica evidente que ele acaba por violar o princípio da responsabilidade única(Single Responsability Principle) que provem que uma classe deve possuir apenas e exclusivamente uma responsabilidade.

Outro grande problema é que o padrão necessita de uma tratativa quando estamos trabalhando em um sistema multi thread para garantir que as demais threads não criem um mesmo objeto.

Comumente o padrão é utilizado para garantirmos um estado global para aplicação, pense em um modelo de chat construído em cima de uma tecnologia de sockets, o Singleton tem a função de criar uma instancia de socket única e distribuir essa mesma conexão para os clientes que irão utilizar a aplicação.

Como criar um Singleton?

A criação de um Singleton se resume em dois aspectos:

  • Tornar o construtor padrão privado;
  • Criar um método de criação estático que funcione como construtor.

Analise o código:

class SpiderMan
  @instance = new

  private_class_method :new 
  #O private_class_method torna o método correspondente ao 
  method_id passado como privado.

  def self.instance
    @instance
  end

  #Criamos um método de criação estático que retorna a 
  própria instância.

end

MilesMorales = SpiderMan.instance
PeterParker = SpiderMan.instance

puts MilesMorales.equal?(PeterParker)
#true
Enter fullscreen mode Exit fullscreen mode

A vantagem de ter um Singleton é saber que ele sempre vai retornar um valor esperado e que sua instanciação irá ocorrer apenas uma vez, tendo ganho de performance. Porem sempre tome cuidado ao implementar o mesmo.

Singleton != classes Singleton.

Algumas literaturas possuem o conceito de classes Singleton, contudo não se deve confundir esses dois conceitos, pois o Singleton se trata de um Design Pattern ou Anti-Pattern e classes Singleton são relacionadas a classes anônimas que o Ruby associa após a criação da classe principal.


Obrigado por me deixar fazer parte do seu tempo! 🥰


Referências:


image

image

image

Discussion (0)

pic
Editor guide