使用面向对象的分析和设计对电梯进行建模

时间:2009-01-29 20:30:39

标签: oop design-patterns language-agnostic

在面向对象的设计和分析方面,有一组似乎常用于访谈和课程的问题。这是其中之一;不幸的是,我在大学的OOP教授实际上从未给出答案,所以我一直在想。

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

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

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

7 个答案:

答案 0 :(得分:161)

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

然后有一家银行。它包含电梯并接收楼层的要求。这些计划安排在所有活动电梯上(不在维护中)。

安排如下:

  • 如果可以的话,为这个楼层选择一个站立的电梯。
  • 否则选择一个移动到这个楼层的电梯。
  • 否则在另一层楼上挑一个站立的电梯。
  • 否则选择负载最低的电梯。

每部电梯都有一组状态。

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

还有其他信号:

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

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

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

答案 1 :(得分:18)

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

Knuth(1997)“Information Structures”,计算机编程艺术 Vol。 1 pp.302-308

答案 2 :(得分:17)

我见过这个问题的很多变种。其中一个主要差异(确定难度)是是否有一些集中尝试具有负载平衡的“智能和有效系统”(例如,在早上发送更多闲置电梯到大厅)。如果是这种情况,设计将包括一个非常有趣的设计的整个子系统。

完整的设计在这里显然太多了,并且有许多替代品。广度也不明确。在一次采访中,他们会试着弄清楚你会怎么想。但是,这些是您需要的一些东西:

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

  2. 电梯的表示

  3. 电梯接口单元的表示(这些可能与...不同) 电梯到电梯)。显然,还要在每个楼层呼叫按钮等。

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

  5. 代表人类和货物(对于最大载荷的分解可能很重要)

  6. 建筑物的代表(在某些情况下,某些楼层可能会被封锁等)

答案 3 :(得分:7)

请参阅:

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

link

答案 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())。这将使问题变得复杂。我试着把它写在纸上,但不要认为它有效。看起来我们并不需要在这里考虑并发或计时问题,但我们确实需要使用队列来分发控件。

有什么建议吗?