在涉及面向對象的設計和分析時,有一組問題似乎在面試和類中經常使用。這是其中之一;不幸的是,我的大學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