使用面向对象的分析和devise对电梯进行build模
在涉及面向对象的devise和分析时,面试和课堂中似乎有一组常见的问题。 这是其中之一; 不幸的是,我的大学OOP教授从来没有给出答案,所以我一直在想。
问题如下:devise一套基本的对象/方法来模拟电梯组。 什么是对象及其属性/方法?
为了辩论,让我们假设我们的build筑有二十层; 底层是大厅,二楼连接到停车场(因此,人们将在底层或二层进出build筑物)。 有一个电梯银行服务所有的楼层; 电梯组中有三个电梯竖井,每个电梯一个电梯。
在面向对象的模型中build立这个模型的正确方法是什么?
首先是电梯课程。 它有一个方向(上,下,站,维护),当前楼层和按方向分类的楼层请求列表。 它从这个电梯收到请求。
那么有一家银行。 它包含电梯并接收来自楼层的请求。 这些被安排到所有有源电梯(不在维护)。
调度将如下所示:
- 如果可以的话,为这个楼层挑选一个电梯。
- 否则选一个电梯搬到这个楼层。
- 否则在其他楼层select一个电梯。
- 否则select负载最低的电梯。
每个电梯都有一组状态。
- 维护:电梯不对外部信号作出反应(只对自己的信号)。
- 展位:电梯固定在地板上。 如果它收到一个电话。 电梯就在那一层,门打开了。 如果在另一个楼层,则朝着这个方向移动。
- 向上:电梯向上移动。 每次到达楼层时,都会检查是否需要停止。 如果是这样,它停下来打开门。 它会等待一定的时间,然后closures门(除非有人正在通过它们),然后从请求列表中删除地板,并检查是否有另一个请求,如果是这样,电梯再次开始移动,否则进入国家立场。
- 下来:喜欢,但方向相反。
还有其他信号:
- 报警。 电梯停了。 如果在地板上,门打开,请求清单被清除,请求移回银行。
- 门打开了。 如果电梯在地板上而不移动,则打开门。
- 门closures。 如果他们打开,关上门。
编辑:有些电梯不开始在底部/ first_floor特别是。 在摩天大楼的情况下。
min_floor&max_floor是Elevator的另外两个属性。
我见过这个问题的很多变种。 其中一个主要的区别(决定了难点)是,是否有一个集中的尝试来build立一个负载均衡的“智能高效系统”(例如,在早上发送更多空闲的电梯来游说)。 如果是这样的话,那么devise将包括一个真正有趣的devise的整个子系统。
一个完整的devise在这里显然是太多了,而且有很多的参数。 广度也不清楚。 在采访中,他们会试图弄清楚你会怎么想。 但是,这些是你需要的一些东西:
-
中央控制器的表示(假设有一个)。
-
电梯的表示
-
电梯的接口单元的表示(这些可能不同于电梯到电梯)。 很显然,每个楼层都会有button。
-
每个楼层的箭头或指示符的表示(几乎是电梯模型的“视图”)。
-
人和货物的表示(对于考虑最大载荷可能是重要的)
-
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议?