我被一个对我来说有点太高级的问题困住了。我真的很想解决这个问题,并找到一个解决办法,但我不知道该如何解决。
以下是问题所在:
在酒店礼宾台写一个管理储物柜预订的程序。顾客把行李交给礼宾,然后由礼宾用你的程序来决定把袋子放在哪个柜子里。程序告诉门房要放置袋子的储物柜号码,并打印一张给顾客的票。返回时,顾客提供机票,礼宾用它查找相应的储物柜,取回袋子,并将其归还给客户。
这里有1000个小储物柜,1000个中型储物柜和1000个大储物柜(这是一家大拉斯维加斯酒店)。你可以假设所有的托运袋都符合这三种尺码之一。程序应该总是分配最小的可用储物柜,以适应这个袋子。
有人能给我一些关于如何处理这样一个问题的指导吗?我擅长编写Ruby脚本,但现在我试图真正理解OOP原则。如果您可以在类中创建前2或3个方法,让我看看您从哪里开始,这将是很有帮助的。此外,如何将此问题分解为更易于管理的块,以及如何以变量/格式存储不同类可以轻松使用的数据。
发布于 2015-05-04 12:14:12
为了对这个问题建模,我们可以使用名为Locker和Bag的类来表示域对象(即应用程序将要处理的实际对象)。
Locker对象可以有状态标志来确定它是哪种类型的储物柜(小的、中等的还是大的),Bag对象也是如此。我们的两个类可以如下所示:
class Locker
attr_reader :type, :id
attr_accessor :bag
def initialize(id, type = nil)
raise ArgumentError, "Id not present" if id.nil?
@id = id
@type = type
@bag = nil
end
def free?
!@bag
end
def can_place(bag)
return false unless free?
case bag.type
when :small
true
when :medium
@type != :small
when :large
@type == :large
else
# invalid type
false
end
end
end
class Bag
attr_reader :type
def initialize(type = nil)
@type = type
end
end每当您创建新对象(在本例中为initialize或Locker.new )时,都会调用该方法。
因此,我们有两个域对象,但我们仍然需要一些东西来运行我们的实际程序。这可以被称为任何您想要的,但为了我们的目的,我们只需按ruby命名约定将其称为locker_app。
require './locker'
require './bag'
BAG_LIMIT = 1000
lockers = []
for i in 0..BAG_LIMIT do
lockers[i] = Locker.new(i, :small)
lockers[i+BAG_LIMIT] = Locker.new(i+BAG_LIMIT, :medium)
lockers[i+2*BAG_LIMIT] = Locker.new(i+2*BAG_LIMIT, :large)
end
while true do
puts "please enter bag size"
type = gets.strip!.to_sym
bag = Bag.new(type)
start = 0
begin
case type
when :small
when :medium
start = BAG_LIMIT
when :large
start = 2*BAG_LIMIT
else
raise ArgumentError, "please select a proper size"
end
for i in start..lockers.size-1
locker = lockers[i]
if locker.free? && locker.can_place(bag)
locker.bag = bag
puts i
break
end
puts "Sorry, no available lockers" if locker == lockers.last
end
rescue ArgumentError => e
puts e.message
end
end这个简单的程序在无限循环(while true)中运行,并通过Kernel.gets方法在每次迭代中等待用户输入。然后,用户可以输入一个袋子类型(小、中或大),程序将输出储物柜的编号。
这些储物柜是在程序开始时按顺序创建的,索引为0-999,中等为10001999,2000-2999为大型的小型储物柜。然后根据袋子的类型将袋子放在储物柜里。
您可以在您自己的控制台中运行它,以通过运行ruby locker_app.rb来验证它是否工作。代码还可以查看这里。
这是一种幼稚的实现,应该把它作为一个起点。您可以从这里选择几个不同的方向(例如,使用1-index对储物柜进行编号,而不是像我的示例中的0-indexed那样),或者维护当前存储了多少袋子的列表,等等。
这种设计的基本思想是让类描述问题中的对象,然后在这些对象之间构建胶水(在本例中,locker_app就是这种胶水)。我坚信,首先创建一个只工作于的东西,然后以增量的方式使它更好。
如果你有任何问题,请不要犹豫。
https://stackoverflow.com/questions/30026345
复制相似问题