使用面向对象的分析和devise对电梯进行build模

在涉及面向对象的devise和分析时,面试和课堂中似乎有一组常见的问题。 这是其中之一; 不幸的是,我的大学OOP教授从来没有给出答案,所以我一直在想。

问题如下:devise一套基本的对象/方法来模拟电梯组。 什么是对象及其属性/方法?

为了辩论,让我们假设我们的build筑有二十层; 底层是大厅,二楼连接到停车场(因此,人们将在底层或二层进出build筑物)。 有一个电梯银行服务所有的楼层; 电梯组中有三个电梯竖井,每个电梯一个电梯。

在面向对象的模型中build立这个模型的正确方法是什么?

首先是电梯课程。 它有一个方向(上,下,站,维护),当前楼层和按方向分类的楼层请求列表。 它从这个电梯收到请求。

那么有一家银行。 它包含电梯并接收来自楼层的请求。 这些被安排到所有有源电梯(不在维护)。

调度将如下所示:

  • 如果可以的话,为这个楼层挑选一个电梯。
  • 否则选一个电梯搬到这个楼层。
  • 否则在其他楼层select一个电梯。
  • 否则select负载最低的电梯。

每个电梯都有一组状态。

  • 维护:电梯不对外部信号作出反应(只对自己的信号)。
  • 展位:电梯固定在地板上。 如果它收到一个电话。 电梯就在那一层,门打开了。 如果在另一个楼层,则朝着这个方向移动。
  • 向上:电梯向上移动。 每次到达楼层时,都会检查是否需要停止。 如果是这样,它停下来打开门。 它会等待一定的时间,然后closures门(除非有人正在通过它们),然后从请求列表中删除地板,并检查是否有另一个请求,如果是这样,电梯再次开始移动,否则进入国家立场。
  • 下来:喜欢,但方向相反。

还有其他信号:

  • 报警。 电梯停了。 如果在地板上,门打开,请求清单被清除,请求移回银行。
  • 门打开了。 如果电梯在地板上而不移动,则打开门。
  • 门closures。 如果他们打开,关上门。

编辑:有些电梯不开始在底部/ first_floor特别是。 在摩天大楼的情况下。

min_floor&max_floor是Elevator的另外两个属性。

我见过这个问题的很多变种。 其中一个主要的区别(决定了难点)是,是否有一个集中的尝试来build立一个负载均衡的“智能高效系统”(例如,在早上发送更多空闲的电梯来游说)。 如果是这样的话,那么devise将包括一个真正有趣的devise的整个子系统。

一个完整的devise在这里显然是太多了,而且有很多的参数。 广度也不清楚。 在采访中,他们会试图弄清楚你会怎么想。 但是,这些是你需要的一些东西:

  1. 中央控制器的表示(假设有一个)。

  2. 电梯的表示

  3. 电梯的接口单元的表示(这些可能不同于电梯到电梯)。 很显然,每个楼层都会有button。

  4. 每个楼层的箭头或指示符的表示(几乎是电梯模型的“视图”)。

  5. 人和货物的表示(对于考虑最大载荷可能是重要的)

  6. build筑物的表示(在某些情况下,由于某些楼层有时会被阻塞等)

Donald Knuth的计算机编程艺术Vol.1有一个电梯和数据结构的演示。 Knuth提出了一个非常彻底的讨论和计划。

Knuth(1997)“信息结构”, 计算机编程艺术 Vol。 1 pp.302-308

看到:

Lu Luo, A UML Documentation for a Elevator System Distributed Embedded Systems, Fall 2000 Ph.D. Project Report Carneghie Mellon University 

链接

在devise电梯系统时需要考虑的事项,

 Elevator Floor/Location Identifier Number of steps Rotation speed Daterange InstallationDate MaintainenceDate Department Identifier AllowedWeight Detail / Description Poison Ratio (Statistics) Start Stop SetDirection SetRotationSpeed EmergencyStop = Stop + Alert EmergencyAccidentSenser Handler 

每个button的按下都会导致需要送达的电梯请求。 这些请求中的每一个都在全球范围内进行跟踪

build筑物中电梯的数量将由用户决定。 该build筑物将包含固定数量的楼层。 可以装入电梯的乘客数量是固定的。 乘客将在离开电梯到目的地楼层时被计算在内。 目标楼层将使用“随机”泊松区间来确定。 当电梯中的所有乘客都到达目的楼层时,电梯将返回到大厅接收更多的乘客

主要担心的是你如何通知电梯需要升降。 而且如果你要有一个集中的class级来控制这种行为,你怎么能分配控制。

看起来可能非常简单或者非常复杂。 如果我们不采取并发或电梯到达一个地方的时间,那么看起来很简单,因为我们只需要检查电梯的状态,就好像电梯正在上升或下降,或静止不动。 但是,如果我们使电梯实现Runnable,并不断检查并同步一个队列(linkedList)。 控制器类将分配队列中的哪个楼层。 当队列为空时,run()方法将等待(queue.wait()),当一个楼层被分配给这个电梯时,它将调用queue.notify()来唤醒run()方法,并运行)方法将调用goToFloor(queue.pop())。 这会使问题太复杂。 我试图写在纸上,但不认为它的作品。 看起来好像我们并不需要在这里考虑并发或时间问题,但我们确实需要以某种方式使用队列来分配控制权。

任何build议?