在面向对象的设计和分析方面,有一组似乎常用于访谈和课程的问题。这是其中之一;不幸的是,我在大学的OOP教授实际上从未给出答案,所以我一直在想。
问题如下:设计一组用于模拟电梯组的基本对象/方法。什么是对象及其属性/方法?
为了争论,让我们假设我们的建筑有二十层;底层是大厅,二楼连接到停车场(因此,人们将进入/离开底层或二楼的建筑物)。有一个电梯银行为所有楼层提供服务;电梯组中有三个电梯井,每个电梯有一个电梯。
在面向对象模型中对此进行建模的正确方法是什么?
答案 0 :(得分:161)
首先是电梯类。它有一个方向(向上,向下,站立,维护),当前楼层和按方向排序的楼层请求列表。它收到这台电梯的请求。
然后有一家银行。它包含电梯并接收楼层的要求。这些计划安排在所有活动电梯上(不在维护中)。
安排如下:
每部电梯都有一组状态。
还有其他信号:
编辑: 有些电梯不是从底部/ first_floor esp开始的。在摩天大楼的情况下。
min_floor& max_floor是Elevator的另外两个属性。
答案 1 :(得分:18)
Knuth(1997)“Information Structures”,计算机编程艺术 Vol。 1 pp.302-308
答案 2 :(得分:17)
我见过这个问题的很多变种。其中一个主要差异(确定难度)是是否有一些集中尝试具有负载平衡的“智能和有效系统”(例如,在早上发送更多闲置电梯到大厅)。如果是这种情况,设计将包括一个非常有趣的设计的整个子系统。
完整的设计在这里显然太多了,并且有许多替代品。广度也不明确。在一次采访中,他们会试着弄清楚你会怎么想。但是,这些是您需要的一些东西:
中央控制器的表示(假设有一个)。
电梯的表示
电梯接口单元的表示(这些可能与...不同) 电梯到电梯)。显然,还要在每个楼层呼叫按钮等。
每层楼的箭头或指示器的表示(几乎是电梯模型的“视图”)。
代表人类和货物(对于最大载荷的分解可能很重要)
建筑物的代表(在某些情况下,某些楼层可能会被封锁等)
答案 3 :(得分:7)
请参阅:
Lu Luo, A UML Documentation for a Elevator System
Distributed Embedded Systems, Fall 2000
Ph.D. Project Report
Carneghie Mellon University
答案 4 :(得分:4)
答案 5 :(得分: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
每次按下按钮都会产生必须提供的电梯请求。这些请求中的每一个都在全球范围内进行跟踪
建筑物内的电梯数量将由用户决定。该建筑将包含固定数量的楼层。能够装入电梯的乘客数量将是固定的。当乘客离开电梯到目的地楼层时,他们将被计算在内。将使用“随机”泊松间隔确定目的地楼层。当电梯中的所有乘客都到达目的地楼层时,电梯将返回大厅以接载更多乘客
答案 6 :(得分:2)
主要担心的是如何通知电梯需要向上或向下移动。如果您打算使用集中式类来控制此行为,又如何分发控件。
看起来它可能非常简单或非常复杂。如果我们不采取并发或电梯到达一个地方的时间,那么它似乎很简单,因为我们只需要检查电梯的状态,如是向上或向下移动,还是静止不动。但是如果我们使Elevator实现Runnable,并不断检查和同步一个队列(linkedList)。 Controller类将指定要进入队列的楼层。当队列为空时,run()方法将等待(queue.wait()),当为该电梯分配一个楼层时,它将调用queue.notify()来唤醒run()方法,并运行( )方法将调用goToFloor(queue.pop())。这将使问题变得复杂。我试着把它写在纸上,但不要认为它有效。看起来我们并不需要在这里考虑并发或计时问题,但我们确实需要使用队列来分发控件。
有什么建议吗?