On 2014-09-01 23:02:49 +0200, Guillaume Betous wrote:
> Dans le story_controler :
> 
> def show
>   @events = @story.compute_events
> end
> 
> Dans le modèle :
> 
> def compute_events
>   events = self.events
>   events.each do |e|
>     if e.name == "naissance"
>       x = Event.new(:name => "majeur", :date => e.date + 18.years)
>       events << x
>     end
>   end
>   return events
> end

  Il faudrait connaître l'implémentation de events#each et events#<<
pour mieux comprendre, cela dit, deux lignes ne me paraissent pas
intuitives :

>   events = self.events

  Le `self.' me semble inutile, et au final tu assignes une variable
nommée identiquement à une méthode, ça pourrait porter à confusion.

>   events.each do |e|
[…]
>       events << x

  Du fait de la première ligne de la méthode, je suis confus sur
l'intention :-) Quel que soit le code dans #each et #<<, ça me parait
non trivial de modifier l'état d'un objet pendant que tu le parcours,
pas impossible bien sûr, mais pas forcément intuitif.


  Approche différente qui me vient en tête (pas beaucoup testée) :


class Story
  def initialize(*events)
    @events = events
  end

  def compute_events
    @events.inject([]) { |m, e| m.push e, *yield(e) }
  end
end

p Story.new(:foo, :bar).compute_events { |e| :baz if e == :bar }
=> [:foo, :bar, :baz]


  Je passe la logique de nouvel événement sous forme de bloc, mais
rien n'empêche d'utiliser une classe ou juste proc/lambda :

SOME_EVENT_GENERATOR = ->(e) { Event.new(name: '', …) if e.birth? }

story.compute_events &SOME_EVENT_GENERATOR

  Si vraiment Story doit couvrir la responsabilité de la génération
d'évènement, je l'implémenterais dans des méthodes privées, mais dans
ce dernier cas Story devient fortement couplé à un event. Il y aurait
aussi la piste d'implémenter un event#generate_events si c'est son
rôle.


-- 
Thibault Jouan

-- 
-- 
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de 
Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse 
railsfrance@googlegroups.com
Pour résilier votre abonnement envoyez un e-mail à l'adresse 
railsfrance-unsubscr...@googlegroups.com
--- 
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes 
Railsfrance.
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, 
envoyez un e-mail à l'adresse railsfrance+unsubscr...@googlegroups.com.
Pour plus d'options, visitez le site https://groups.google.com/d/optout .

Reply via email to