在涉及面向对象的设计和分析时,有一组问题似乎在面试和类中经常使用。这是其中之一;不幸的是,我的大学OOP教授从来没有给出答案,所以我一直在想。使用面向对象的分析和设计对电梯进行建模
问题如下:设计一套基本的对象/方法来模拟电梯库。什么是对象及其属性/方法?
为了争辩,让我们假设我们的建筑物有二十层;底层是大厅,二楼连接到停车场(因此,人们将在底层或二层进入/离开建筑物)。有一家电梯银行为所有楼层提供服务;电梯组中有三个电梯竖井,每个电梯一个电梯。
什么是在面向对象模型中建模的正确方法?
在涉及面向对象的设计和分析时,有一组问题似乎在面试和类中经常使用。这是其中之一;不幸的是,我的大学OOP教授从来没有给出答案,所以我一直在想。使用面向对象的分析和设计对电梯进行建模
问题如下:设计一套基本的对象/方法来模拟电梯库。什么是对象及其属性/方法?
为了争辩,让我们假设我们的建筑物有二十层;底层是大厅,二楼连接到停车场(因此,人们将在底层或二层进入/离开建筑物)。有一家电梯银行为所有楼层提供服务;电梯组中有三个电梯竖井,每个电梯一个电梯。
什么是在面向对象模型中建模的正确方法?
首先有一个电梯课。它有一个方向(上,下,站,维护),当前楼层和按方向排序的楼层请求列表。它收到来自这台电梯的请求。
然后有一家银行。它包含电梯并接收来自楼层的请求。这些被安排到所有有源电梯(不在维护中)。
调度会像:
每台电梯都有一组状态。
有额外的信号:。
编辑: 某些电梯不开始在底部/ first_floor特别是。在摩天大楼的情况下。
min_floor & max_floor是Elevator的另外两个属性。
我见过这个问题的很多变种。主要区别之一(决定了难点)在于是否有一些集中的尝试来建立一个能够实现负载平衡的“智能高效系统”(例如,在早上发送更多闲置的电梯进行游说)。如果是这样的话,那么设计将包括一个带有真正有趣设计的整个子系统。
一个完整的设计在这里显然是太多了,并且有很多参数。广度也不清楚。在一次采访中,他们会试图弄清楚你会怎么想。然而,这些是你需要的一些东西:
中央控制器的表示(假设有一个)。电梯电梯的接口单元的
交涉的
交涉(这些可以是从 电梯不同电梯)。很明显,也可以在每个楼层呼叫按钮等。
每层楼上的箭头或指示符的表示(几乎是电梯模型的“视图”)。
表示的人类和货物(可能是在最大负载保重要)的建设
表示(在某些情况下,某些楼层有时可能会被阻止,等等)
唐纳德克努特的计算机编程艺术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
一点是要考虑当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
每个按钮按下都会产生一个电梯请求,该请求必须被提供。每个请求都在全球范围内进行跟踪
建筑物中的电梯数量将由用户确定。该建筑物将包含固定数量的楼层。可以装入电梯的乘客人数将被固定。在他们离开电梯到目的地楼层时,乘客将被计数。目标楼层将使用“随机”泊松区间来确定。当电梯中的所有乘客都到达目的楼层时,电梯将返回到大厅接送更多的乘客
主要担心的是您如何通知电梯需要上下移动。并且如果您将要有一个集中的班级来控制这种行为,并且您如何分配该控件。
它看起来可能非常简单或非常复杂。如果我们不采取并发或电梯到达某个地方的时间,那么它看起来很简单,因为我们只需要检查电梯的状态,就像电梯正在上升或下降,或者静止不动。但是如果我们使Elevator实现Runnable,并且不断检查并同步一个队列(linkedList)。 Controller类将分配队列中的哪个楼层。当队列为空时,run()方法将等待(queue.wait()),当一个楼层被分配给这个电梯时,它将调用queue.notify()来唤醒run()方法,并运行)方法将调用goToFloor(queue.pop())。这会使问题变得过于复杂。我试图写在纸上,但不认为它的作品。看起来我们并不需要在这里考虑并发或时间问题,但我们需要以某种方式使用队列来分发控制。
有什么建议吗?
这是我最喜欢的面试问题。询问起来很简单,但要想得到正确的结果却非常复杂。它涉及诸如队列之类的事情,并且可以很容易地扩展以投入更多的挑战。例如,如何优化算法以减少等待时间。 – 2009-01-29 20:38:08
是的,这是一个非常好的开放式问题。从来没有问过那个,不幸的是:( – Uri 2009-01-29 20:43:19
好笔记 - http://massivetechinterview.blogspot.in/2015/07/thought-works-object-oriented-design.html – roottraveller 2017-09-27 13:18:08