2009-01-29 72 views
107

在涉及面向对象的设计和分析时,有一组问题似乎在面试和类中经常使用。这是其中之一;不幸的是,我的大学OOP教授从来没有给出答案,所以我一直在想。使用面向对象的分析和设计对电梯进行建模

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

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

什么是在面向对象模型中建模的正确方法?

+7

这是我最喜欢的面试问题。询问起来很简单,但要想得到正确的结果却非常复杂。它涉及诸如队列之类的事情,并且可以很容易地扩展以投入更多的挑战。例如,如何优化算法以减少等待时间。 – 2009-01-29 20:38:08

+0

是的,这是一个非常好的开放式问题。从来没有问过那个,不幸的是:( – Uri 2009-01-29 20:43:19

+0

好笔记 - http://massivetechinterview.blogspot.in/2015/07/thought-works-object-oriented-design.html – roottraveller 2017-09-27 13:18:08

回答

136

首先有一个电梯课。它有一个方向(上,下,站,维护),当前楼层和按方向排序的楼层请求列表。它收到来自这台电梯的请求。

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

调度会像:

  • 如果有挑选该楼层的电梯站立。
  • 其他人挑选移动到这个楼层的电梯。
  • 其他人在其他楼层挑选电梯。
  • 否则选择负载最低的电梯。

每台电梯都有一组状态。

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

有额外的信号:。

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

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

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

17

我见过这个问题的很多变种。主要区别之一(决定了难点)在于是否有一些集中的尝试来建立一个能够实现负载平衡的“智能高效系统”(例如,在早上发送更多闲置的电梯进行游说)。如果是这样的话,那么设计将包括一个带有真正有趣设计的整个子系统。

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

  1. 中央控制器的表示(假设有一个)。电梯电梯的接口单元的

  2. 交涉的

  3. 交涉(这些可以是从 电梯不同电梯)。很明显,也可以在每个楼层呼叫按钮等。

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

  5. 表示的人类和货物(可能是在最大负载保重要)的建设

  6. 表示(在某些情况下,某些楼层有时可能会被阻止,等等)

15

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

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

5

参见:

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

link

2

一点是要考虑当Designing的电梯系统,

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 

每个按钮按下都会产生一个电梯请求,该请求必须被提供。每个请求都在全球范围内进行跟踪

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

1

主要担心的是您如何通知电梯需要上下移动。并且如果您将要有一个集中的班级来控制这种行为,并且您如何分配该控件。

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

有什么建议吗?