在面向对象的设计和分析方面,似乎有一些问题在访谈和课堂上很常用。这就是其中之一;不幸的是,我在大学的OOP教授实际上并没有给出答案,所以我一直在想。
问题如下:设计一组基本的对象/方法,用于模拟电梯组。对象及其属性/方法是什么?
为了争辩,让我们假设我们的建筑物有20层。底层是大厅,而第二层是与停车场相连的(因此,人们将进入或离开位于底层或第二层的建筑物)。有一个供所有楼层使用的电梯排;电梯列中有三个电梯井,每个井轴有一个电梯。
在面向对象的模型中对此建模的正确方法是什么?
在面向对象的设计和分析方面,似乎有一些问题在访谈和课堂上很常用。这就是其中之一;不幸的是,我在大学的OOP教授实际上并没有给出答案,所以我一直在想。
问题如下:设计一组基本的对象/方法,用于模拟电梯组。对象及其属性/方法是什么?
为了争辩,让我们假设我们的建筑物有20层。底层是大厅,而第二层是与停车场相连的(因此,人们将进入或离开位于底层或第二层的建筑物)。有一个供所有楼层使用的电梯排;电梯列中有三个电梯井,每个井轴有一个电梯。
在面向对象的模型中对此建模的正确方法是什么?
Answers:
首先是电梯课程。它有一个方向(上,下,站,维护),当前楼层和按该方向排序的楼层请求列表。它从该电梯接收请求。
然后有一家银行。它包含电梯,并接收来自楼层的请求。这些被安排到所有活动的电梯中(不在维护中)。
调度将类似于:
每个电梯都有一组状态。
还有其他信号:
编辑:一些电梯不开始在bottom / first_floor esp。如果是摩天大楼。
min_floor和max_floor是Elevator的两个附加属性。
唐纳德·克努斯(Donald Knuth)的《计算机编程艺术》第1卷演示了电梯和数据结构。Knuth提出了非常详尽的讨论和计划。
Knuth(1997),“信息结构”,《计算机编程艺术》第一卷。1第302-308页
我已经看到了这个问题的许多变体。主要区别之一(确定难度)是是否存在集中尝试,以建立具有负载均衡功能的“智能高效系统”(例如,早上将更多的闲置电梯送到大堂)。如果是这种情况,那么设计将包括一个具有真正有趣设计的整个子系统。
完整的设计显然太多了,这里有很多替代品。广度也不清楚。在采访中,他们将尝试弄清楚您的想法。但是,这些是您需要做的一些事情:
中央控制器的表示形式(假设有一个)。
电梯代表
电梯接口单元的表示(每个电梯的接口单元可能不同)。显然,也请呼叫每层上的按钮,等等。
每个楼层上的箭头或指示器的表示(几乎是电梯模型的“视图”)。
人和货物的表示形式(对于考虑最大负载可能很重要)
建筑物的外观(在某些情况下,某些楼层有时可能会被遮挡,等等)
设计电梯系统时应考虑的事项
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())。这将使问题过于复杂。我试图将其写在纸上,但认为它没有用。看来我们实际上并不需要考虑并发或时序问题,
有什么建议吗?