我遇到了一个对我来说有点过于先进的问题。我真的想解决这个问题并找到解决方案,但不知道如何去解决它。
问题在于:
在酒店礼宾服务台编写管理储物柜预订的程序。 客户留下礼品袋,然后使用您的程序来确定 在哪个储物柜放置袋子。该计划告诉门房的人数 放置行李的储物柜,并打印出一张票给顾客。 返回后,客户提供门票,礼宾人员使用该门票 查找相应的储物柜,取回行李,然后将其退还给顾客。
有1000个小储物柜,1000个中型储物柜, 和1000个大型储物柜(这是一家大型拉斯维加斯酒店)。你可以假设所有 托运行李符合这三种尺寸中的一种。该计划应该 总是分配适合袋子的最小可用储物柜。
有人可以就如何处理这样的问题给我一些指导吗?我擅长编写Ruby脚本,但现在试图真正理解OOP原则。如果您可以在类中创建前2个或3个方法,以便查看您的开始位置,将会很有帮助。此外,您如何将此问题分解为更易于管理的块,以及如何以变量/格式存储数据,以便不同的类可以轻松使用。
答案 0 :(得分:0)
为了模拟这个问题,我们可以使用名为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
方法(在我们的案例中为Bag.new
或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,介质为1000 - 1999,大型为2000 - 2999.然后根据行李类型将行李放入储物柜
您可以在自己的控制台中运行它,通过运行ruby locker_app.rb
来验证它是否有效。也可以查看代码here。
这是一个天真的实现,应该作为一个起点。您可以从这里找到几个不同的方向(例如使用1
编号的储物柜 - 索引而不是0
- 在我的示例中编入索引,或维护当前存储的行李数量列表等等。
这种设计背后的一般思想是让类描述问题中的对象,然后在这些对象之间构建粘合剂(在这个例子中,locker_app
就是粘合剂)。我坚信第一次创造正常工作的东西,然后努力提高它的效率。
如果您有任何问题,请随时询问。