Я хочу создать объект, скажем, Круг.
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. Спасибо за Ваши ответы, комментарии и справку!
Вы обязательно захотите разделить классы 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
У класса Pie может быть счетчик, показывающий, какая его часть осталась. Метод getPieceOfPie
изменит этот счетчик. Затем метод myCurrentInventoryHas
может просмотреть каждый пирог и увидеть, какая часть этого пирога проверяется счетчиком.
Кусок пирога - это не пирог.
(говоря оо, объект должен иметь четкую ответственность, превращение объекта в пирог И срез не может быть четким распределением ответственности).
Можно ли создать объект PieSlice, и каждый Pie будет иметь массив PieSlices?