在涉及面向对象的设计和分析时,有一组似乎在面试和课程中常用的问题.这是其中之一; 不幸的是,我在大学的OOP教授实际上从未给出答案,所以我一直在想.
问题如下:设计一组用于模拟电梯组的基本对象/方法.什么是对象及其属性/方法?
为了论证,让我们假设我们的建筑有二十层; 底层是大厅,二楼连接到停车场(因此,人们将进入/离开底层或二楼的建筑物).有一个电梯银行为所有楼层提供服务; 电梯组中有三个电梯井,每个井有一个电梯.
在面向对象模型中对此进行建模的正确方法是什么?
首先是电梯类.它有一个方向(向上,向下,站立,维护),当前楼层和按方向排序的楼层请求列表.它接收来自这个电梯的请求.
然后有一家银行.它包含电梯并接收楼层的要求.这些计划安排在所有有效电梯上(不在维护中).
安排如下:
如果有的话,为这个楼层选择一个站立式电梯
否则选择一个移动到这个楼层的电梯.
否则在另一层楼上挑一个站立的电梯.
否则选择负载最低的电梯.
每个电梯都有一组状态.
维护:电梯不对外部信号作出反应(仅对其自身的信号).
站立:电梯固定在地板上.如果它接到电话.电梯就在那个楼层,门打开了.如果它在另一层,它会向那个方向移动.
向上:电梯向上移动.每次到达楼层时,都会检查是否需要停止.如果是这样,它会停止并打开门.它会等待一段时间并关闭门(除非有人正在通过它们.然后它从请求清单中移除地板并检查是否有另一个请求.如果是这样,电梯再次开始移动.如果没有,它进入国家立场.
向下:喜欢向上,但反向.
还有其他信号:
报警.电梯停了下来.如果它在地板上,门打开,请求清单被清除,请求被移回银行.
门打开了.如果电梯在地板上而不移动,则打开门.
门关上了.如果它们打开就关上门.
编辑:有些电梯不从底部/ first_floor esp开始.在摩天大楼的情况下.
min_floor和max_floor是Elevator的另外两个属性.
唐纳德克努特的计算机程序设计艺术Vol.1展示了电梯和数据结构.Knuth提出了一个非常彻底的讨论和计划.
Knuth(1997)"Information Structures",The Art of Computer Programming 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
链接