首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于管理储物柜预订的Ruby程序

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

Stack Overflow用户
提问于 2015-05-04 09:06:48
回答 1查看 125关注 0票数 0

我被一个对我来说有点太高级的问题困住了。我真的很想解决这个问题,并找到一个解决办法,但我不知道该如何解决。

以下是问题所在:

在酒店礼宾台写一个管理储物柜预订的程序。顾客把行李交给礼宾,然后由礼宾用你的程序来决定把袋子放在哪个柜子里。程序告诉门房要放置袋子的储物柜号码,并打印一张给顾客的票。返回时,顾客提供机票,礼宾用它查找相应的储物柜,取回袋子,并将其归还给客户。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-04 12:14:12

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

Locker对象可以有状态标志来确定它是哪种类型的储物柜(小的、中等的还是大的),Bag对象也是如此。我们的两个类可以如下所示:

代码语言:javascript
复制
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

每当您创建新对象(在本例中为initializeLocker.new )时,都会调用该方法。

因此,我们有两个域对象,但我们仍然需要一些东西来运行我们的实际程序。这可以被称为任何您想要的,但为了我们的目的,我们只需按ruby命名约定将其称为locker_app

代码语言:javascript
复制
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就是这种胶水)。我坚信,首先创建一个只工作于的东西,然后以增量的方式使它更好。

如果你有任何问题,请不要犹豫。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30026345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档