Dwa modele - gdzie metoda

Hej,

Mam dwie klasy: gra i gracz.

class Game
  has_many :players, :inverse_of => :game
  belongs_to :active_player, :class_name => 'Player'
end

Zastanawiam się gdzie umieścić metodę wyznaczającą kolejnego gracza… Czy tu:

class Game
  def next_player
    players.find(active_player.position+1)
  end
end

Czy tu:

class Player
  def next
    game.players.find(position+1)
  end
end

Macie jakieś reguły, wskazówki? Niby prawie na jedno wychodzi, ale ostatnio często mi się zdarzają takie przypadki.

Semantyka oby wywołań jest inna - Game#next_player bazuje na active_player, a Player#next w ogóle nie bierze tego pod uwagę. Zostawiłbym oba, a w Game#next_player odwołał się do Player#next.

Widzę tu jednak zasadniczy błąd - pozycja zawodnika powinna być zupełnie niezależna od jego id.

Jasne, powinno być find_by_position. Do tego modulo. Ale pisałem to na sucho, chodziło o ideę :slight_smile: Może to faktycznie trochę niefortunny przykład, ale czasami są takie sytuacje, gdzie metoda działa na dwóch powiązanych obiektach i nie bardzo wiadomo gdzie pasuje lepiej.

Może to powinna być metoda osobnego modelu nie dziedziczącego z AR::Base.

[code]class Gameplay
def initialize(current_player, game) # a może (players, game)
end

def next_player
end
end[/code]
Jednak moim zdaniem bardziej pasuje to do Gry. Jeśli grasz w jakąś grę (szachy, monopoly, pokera) to raczej nie jest właściowością gracza wiedzieć kto jest następnym graczem. Raczej jest to właściwość gry (jest jakiś zbiór graczy, którzy grają w takim a takim momencie, wg takiego a takiego algorytmu). Szczególnie wydaje mi się to widoczne w grach, w któryc kierunek grania może się zmieniać na skutek jakiegoś posunięcia gracza np. makao.

Zauważ, że naturalnym jest dla gry, że zna swoich graczy i aktualnego gracza (jej stan) a mniej naturalnym jest ta znajomość z punktu widzenia gracza samego w sobie. On by mógł pewnie grać i działać nawet nie wiedząc często ilu jest uczestników.