Usando o SimpleDelegator para criar decorators em Ruby

Criado em: 13/02/2013

Recentemente postei no blog da HE:labs sobre como extrair responsabilidade de models no rails utilizando-se de decorators para quem curtiu e já está utilizando decorators em suas apps apresento agora o SimpleDelegator que nos ajuda a criar nossos decorators.

Imagine que tenhamos a seguinte classe:

class Saiyajin
  attr_accessor :name

  def initialize(name)
    self.name  = name
  end
end

uma simples classe ruby, mas que poderia ser um de seus models active record por exemplo.

A nossa classe é utilizada assim:

goku = Saiyajin.new("Goku")
puts goku.name # => "Goku"

Agora iremos criar o Super Sayajin, vamos a nossa classe:

require 'delegate'

class SuperSaiyajin < SimpleDelegator

  def name
    "#{super} super saiyajin"
  end

  def power
    "It's Over 9000!"
  end
end

a nossa classe Super Sayajin poderia ser utilizada assim:

goku = SuperSaiyajin.new(goku)
puts goku.name # => "Goku super saiyajin"
puts goku.power # => "It's Over 9000!"

Criando o nosso decorator herdando de SimpleDelegator não precisamos criar um initialize e agora o nosso decorator responde a todos os métodos da classe “decorada”. Perceba que podemos utilizar o super para nos referenciarmos a métodos da classe “decorada”, como usamos em SuperSaiyajin#name.

Fica a dica do SimpleDelegator para quando formos criar nossos decorators. Se você não conhecia o SimpleDelegator ou usa outra abordagem comenta aí.

RSpec: Crie especificações executáveis em Ruby
Aprimore as suas habilidades enquanto escreve testes com o meu livro RSpec: Crie especificações executáveis em Ruby

Comentários

Comentários powered by Disqus