Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Dúvida com separação de responsabilidades

Bom dia pessoal!

Estou pensando em uma modelagem OO em Ruby mas não chego a uma conclusão. O cenário é o seguinte:

Temos clientes que pagam uma mensalidade por determinado serviço. O atributo pago_até e o método pagar deveria ficar na classe Cliente?

Apesar de ele ser relacionado ao Cliente, me parece que deveria estar em outro lugar...

require 'date'

class Cliente
  attr_reader :pago_ate

  def initialize
    @pago_ate = Date.today
  end

  def pagar(meses)
    @pago_ate = @pago_ate >> meses
  end
end
6 respostas

Oi Andre,

Teria que conhecer mais da regra de negócio mas eu colocaria isso numa classe que representasse o serviço de pagamento. Nesta classe relacionaria o cliente e a mensalidade com as informações de pagamento.

Como você comentou, no cliente fica meio estranho mesmo.

Abraço!

Olá Joviane!

Esse atributo pago_ate refere-se até que mês a mensalidade do cliente está paga.

Um exemplo seria de uma academia, onde um cliente pode se matricular hoje e pagar 6 meses antecipados (ficando pago até 03/2017).

Pode acontecer também do cliente se esquecer e ser necessário emitir um relatório de clientes que estão com as mensalidades atrasadas (pago_ate 08/2016 por exemplo).

Você pode ver que com esse cenário o atributo pago_ate está altamente acoplado ao cliente mas não parece ser um atributo dele por conta do método pagar.

Seria estranho eu chamar cliente.pagar 6, porque parece que o cliente se paga?

Com essas novas informações, como você modelaria?

Bom dia! Pensei a modelagem desse caso de uma outra forma. Será que ela ficaria mais OO?

require 'date'

class Cliente
  attr_accessor :nome
  attr_reader :mensalidade

  def initialize(nome)
    @nome = nome
    @mensalidade = Mensalidade.new Date.today
  end
end

class Mensalidade
  attr_reader :pago_ate

  def initialize(pago_ate)
    @pago_ate = pago_ate
  end

  def pagar(meses)
    @pago_ate = @pago_ate >> meses
  end
end

cliente = Cliente.new "André"
cliente.mensalidade.pagar 3

Oi Andre,

Agora está melhor sim mas acho que eu trocaria o relacionamento para a mensalidade guardar a referência para o cliente e não o contrário. A meu ver, o cliente tende a ser algo mais independente que poderia ou não ter uma mensalidade mas a mensalidade obrigatoriamente pertence a um cliente.

Abraço!

Então nesse caso eu injetaria um cliente na mensalidade?

[]'s

solução!

Oi André,

Isso mesmo.

Abraço!