用于管理储物柜预订的Ruby程序

时间:2015-05-04 09:06:49

标签: ruby class oop object data-structures

我遇到了一个对我来说有点过于先进的问题。我真的想解决这个问题并找到解决方案,但不知道如何去解决它。

问题在于:

在酒店礼宾服务台编写管理储物柜预订的程序。     客户留下礼品袋,然后使用您的程序来确定     在哪个储物柜放置袋子。该计划告诉门房的人数     放置行李的储物柜,并打印出一张票给顾客。     返回后,客户提供门票,礼宾人员使用该门票     查找相应的储物柜,取回行李,然后将其退还给顾客。

有1000个小储物柜,1000个中型储物柜, 和1000个大型储物柜(这是一家大型拉斯维加斯酒店)。你可以假设所有 托运行李符合这三种尺寸中的一种。该计划应该 总是分配适合袋子的最小可用储物柜。

有人可以就如何处理这样的问题给我一些指导吗?我擅长编写Ruby脚本,但现在试图真正理解OOP原则。如果您可以在类中创建前2个或3个方法,以便查看您的开始位置,将会很有帮助。此外,您如何将此问题分解为更易于管理的块,以及如何以变量/格式存储数据,以便不同的类可以轻松使用。

1 个答案:

答案 0 :(得分:0)

为了模拟这个问题,我们可以使用名为LockerBag的类来表示域对象(即应用程序将处理的实际对象)。

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.newLocker.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就是粘合剂)。我坚信第一次创造正常工作的东西,然后努力提高它的效率。

如果您有任何问题,请随时询问。