Методы программирования Ruby: простой все же не так управление простым объектом

Я хочу создать объект, скажем, Круг.

class Pie 
  def initialize(name, flavor) 
    @name = name 
    @flavor = flavor 
  end 
end

Но Круг может быть разделен на 8 частей, половину или просто целый Круг. Ради аргумента я хотел бы знать, как я мог дать каждому объекту Круга цену на 1/8, 1/4 или на целое. Я мог сделать это путем выполнения:

class Pie 
  def initialize(name, flavor, price_all, price_half, price_piece) 
    @name = name 
    @flavor = flavor 
    @price_all = price_all
    @price_half = price_half
    @price_piece = price_piece
  end 
end 

Но теперь, если бы я создал бы пятнадцать объектов Круга, и я вынул бы случайным образом некоторые части где-нибудь при помощи метода такой как

getPieceOfPie(pie_name)

Как я смог бы сгенерировать значение всех доступных кругов, которые целы и остающиеся части? В конечном счете с помощью метода, такого как:

   myCurrentInventoryHas(pie_name)
   # output: 2 whole strawberry pies and 7 pieces.

Я знаю, я - Ruby nuby. Спасибо за Ваши ответы, комментарии и справку!

5
задан Pascal Cuoq 12 April 2010 в 23:26
поделиться

4 ответа

Вы обязательно захотите разделить классы Pie и PiePiece

class Pie
  attr_accessor :pieces
  def initialize
    self.pieces = []
  end

  def add_piece(flavor)
    raise "Pie cannot have more than 8 pieces!" if pieces.count == 8
    self.pieces << PiePiece.new(flavor)
  end

  # a ruby genius could probably write this better... chime in if you can help
  def inventory
    Hash[pieces.group_by(&:flavor).map{|f,p| [f, p.size]}]
  end

end

class PiePiece
  attr_accessor :flavor
  def initialize(flavor)
    self.flavor = flavor
  end
end

образец кода

p = Pie.new
p.add_piece(:strawberry)
p.add_piece(:strawberry)
p.add_piece(:apple)
p.add_piece(:cherry)
p.add_piece(:cherry)
p.add_piece(:cherry)

p.inventory.each_pair do |flavor, count|
  puts "Pieces of #{flavor}: #{count}"
end

# output
# Pieces of strawberry: 2
# Pieces of apple: 1
# Pieces of cherry: 3
2
ответ дан 14 December 2019 в 13:31
поделиться

У класса Pie может быть счетчик, показывающий, какая его часть осталась. Метод getPieceOfPie изменит этот счетчик. Затем метод myCurrentInventoryHas может просмотреть каждый пирог и увидеть, какая часть этого пирога проверяется счетчиком.

1
ответ дан 14 December 2019 в 13:31
поделиться

Кусок пирога - это не пирог.

(говоря оо, объект должен иметь четкую ответственность, превращение объекта в пирог И срез не может быть четким распределением ответственности).

0
ответ дан 14 December 2019 в 13:31
поделиться

Можно ли создать объект PieSlice, и каждый Pie будет иметь массив PieSlices?

3
ответ дан 14 December 2019 в 13:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: