Mô hình hóa thang máy bằng cách sử dụng Phân tích và Thiết kế hướng đối tượng [đóng]


134

Có một bộ câu hỏi dường như thường được sử dụng trong các cuộc phỏng vấn và các lớp học khi nói đến thiết kế và phân tích hướng đối tượng. Đây là một trong chúng; Thật không may, giáo sư OOP của tôi ở trường đại học chưa bao giờ thực sự đưa ra câu trả lời cho nó, và vì vậy tôi đã tự hỏi.

Vấn đề như sau: thiết kế một bộ đối tượng / phương thức cơ bản được sử dụng để mô phỏng ngân hàng thang máy. Các đối tượng và thuộc tính / phương pháp của họ là gì?

Để tranh luận, chúng ta hãy giả sử rằng tòa nhà của chúng ta có hai mươi tầng; tầng dưới cùng là sảnh và tầng hai kết nối với nhà để xe (do đó, mọi người sẽ vào / ra khỏi tòa nhà ở tầng dưới cùng hoặc tầng hai). Có một ngân hàng thang máy phục vụ tất cả các tầng; Có ba trục thang máy trong ngân hàng thang máy và một thang máy trên mỗi trục.

Điều gì sẽ là cách chính xác để mô hình hóa điều này trong một mô hình hướng đối tượng?


9
Đây là câu hỏi phỏng vấn yêu thích của tôi. Nó là đơn giản để hỏi nhưng phức tạp đáng ngạc nhiên để có được đúng. Nó liên quan đến những thứ như hàng đợi và có thể dễ dàng được mở rộng để vượt qua nhiều thử thách hơn. Ví dụ, làm thế nào bạn sẽ tối ưu hóa thuật toán để giảm thời gian chờ đợi.
Rob Di Marco

Phải, đó là một câu hỏi mở thực sự tuyệt vời. Không bao giờ được hỏi điều đó, thật không may :(
Uri

Câu trả lời:


165

Đầu tiên là một lớp thang máy. Nó có một hướng (lên, xuống, đứng, bảo trì), một tầng hiện tại và một danh sách các yêu cầu sàn được sắp xếp theo hướng. Nó nhận được yêu cầu từ thang máy này.

Sau đó có một ngân hàng. Nó chứa các thang máy và nhận được yêu cầu từ các tầng. Chúng được lên lịch cho tất cả các thang máy hoạt động (không bảo trì).

Việc lên lịch sẽ như sau:

  • nếu có sẵn hãy chọn một thang máy đứng cho tầng này.
  • khác chọn một thang máy di chuyển đến tầng này.
  • khác chọn một thang máy đứng trên một tầng khác.
  • khác chọn thang máy với tải thấp nhất.

Mỗi thang máy có một bộ trạng thái.

  • Bảo trì: thang máy không phản ứng với các tín hiệu bên ngoài (chỉ với tín hiệu của chính nó).
  • Đứng: thang máy được cố định trên một sàn. Nếu nó nhận được một cuộc gọi. Và thang máy ở trên tầng đó, cửa mở. Nếu nó ở trên một tầng khác, nó di chuyển theo hướng đó.
  • Lên: thang máy di chuyển lên. Mỗi lần nó đạt đến một tầng, nó sẽ kiểm tra xem nó có cần dừng lại không. Nếu vậy nó dừng lại và mở cửa. Nó đợi trong một khoảng thời gian nhất định và đóng cửa lại (trừ khi đôi khi di chuyển qua chúng. Sau đó, nó sẽ xóa sàn khỏi danh sách yêu cầu và kiểm tra xem có yêu cầu nào khác không. Nếu vậy thang máy bắt đầu di chuyển trở lại. đứng nhà nước.
  • Xuống: thích lên nhưng theo hướng ngược lại.

Có thêm tín hiệu:

  • báo thức. Thang máy dừng lại. Và nếu nó ở trên một tầng, cửa mở, danh sách yêu cầu bị xóa, các yêu cầu được chuyển trở lại ngân hàng.
  • mở cửa. Mở cửa nếu thang máy ở trên sàn và không di chuyển.
  • Đóng cửa. Đóng cửa nếu họ đang mở.

EDIT: Một số thang máy không bắt đầu ở dưới cùng / first_floor đặc biệt. trong trường hợp nhà chọc trời.

min_floor & max_floor là hai thuộc tính bổ sung cho Thang máy.


16
Mô phỏng thang máy play.elevatorsaga.com
Samar Panda

1
Có vẻ như phương pháp lập lịch trình này đang thiếu một số tối ưu hóa, ví dụ, nếu thang máy đã đi đến tầng mà một người đã yêu cầu thang máy, thì không cần phải lên lịch cho một thang máy nữa.
Liron Yahdav

Yêu cầu nhận và lập lịch sẽ là đồng bộ hay không đồng bộ? Nếu không đồng bộ thì làm thế nào chúng ta đạt được điều đó?
Rohitashwa Nigam

18

Nghệ thuật lập trình máy tính Vol.1 của Donald Knuth có trình diễn thang máy và cấu trúc dữ liệu. Knuth trình bày một cuộc thảo luận và chương trình rất kỹ lưỡng.

Knuth (1997) "Cấu trúc thông tin", Nghệ thuật lập trình máy tính Vol. 1 tr.302-308


9
liên kết với google sách ở trên.
năm11

2
Phần này của cuốn sách mô tả (chi tiết) cách chạy mô phỏng thang máy. Nó KHÔNG mô tả cách mô hình hóa nó (theo cách OOP). Nhưng vâng ... cuốn sách tuyệt vời!
dùng7

17

Tôi đã thấy nhiều biến thể của vấn đề này. Một trong những khác biệt chính (xác định độ khó) là liệu có một số nỗ lực tập trung để có một "hệ thống thông minh và hiệu quả" có thể cân bằng tải hay không (ví dụ, gửi thêm thang máy nhàn rỗi đến sảnh vào buổi sáng). Nếu đó là trường hợp, thiết kế sẽ bao gồm toàn bộ hệ thống con với thiết kế thực sự thú vị.

Một thiết kế đầy đủ rõ ràng là quá nhiều để trình bày ở đây và có rất nhiều altenative. Độ rộng cũng không rõ ràng. Trong một cuộc phỏng vấn, họ sẽ cố gắng tìm hiểu xem bạn sẽ nghĩ như thế nào. Tuy nhiên, đây là một số trong những điều bạn sẽ cần:

  1. Đại diện của bộ điều khiển trung tâm (giả sử có một).

  2. Đại diện thang máy

  3. Đại diện của các đơn vị giao diện của thang máy (chúng có thể khác nhau từ thang máy đến thang máy). Rõ ràng cũng gọi các nút trên mỗi tầng, vv

  4. Đại diện của các mũi tên hoặc chỉ báo trên mỗi tầng (gần như là "chế độ xem" của mô hình thang máy).

  5. Đại diện của một con người và hàng hóa (có thể quan trọng để bao thanh toán trong tải tối đa)

  6. Đại diện của tòa nhà (trong một số trường hợp, vì đôi khi một số tầng có thể bị chặn, v.v.)


7

Xem:

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

liên kết



2

Điều cần cân nhắc trong khi thiết kế hệ thống thang máy,

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

Mỗi nút bấm kết quả trong một yêu cầu thang máy phải được phục vụ. Mỗi yêu cầu này được theo dõi tại một địa điểm toàn cầu

Số lượng thang máy trong tòa nhà sẽ được xác định bởi người dùng. Tòa nhà sẽ chứa một số tầng cố định. Số lượng hành khách có thể phù hợp với thang máy sẽ được cố định. Các hành khách sẽ được tính khi họ rời khỏi thang máy ở tầng đích của họ. Tầng đích sẽ được xác định bằng cách sử dụng khoảng Poisson "ngẫu nhiên". Khi tất cả hành khách trong thang máy đã đến tầng đích, thang máy sẽ quay trở lại sảnh để đón thêm hành khách


2

Điều chính cần lo lắng là làm thế nào bạn sẽ thông báo cho thang máy rằng nó cần phải di chuyển lên hoặc xuống. và nếu bạn sắp có một lớp tập trung để kiểm soát hành vi này và làm thế nào bạn có thể phân phối điều khiển.

Có vẻ như nó có thể rất đơn giản hoặc rất phức tạp. Nếu chúng ta không mất thời gian hoặc thời gian để thang máy đi đến một nơi, thì có vẻ như sẽ đơn giản vì chúng ta chỉ cần kiểm tra trạng thái của thang máy, giống như nó di chuyển lên hoặc xuống, hoặc đứng yên. Nhưng nếu chúng tôi thực hiện Thang máy thực hiện Runnable, và liên tục kiểm tra và đồng bộ hóa một hàng đợi (LinkedList). Một lớp Trình điều khiển sẽ chỉ định tầng nào sẽ đi trong hàng đợi. Khi hàng đợi trống, phương thức run () sẽ đợi (queue.wait ()), khi một tầng được gán cho thang máy này, nó sẽ gọi queue.notify () để đánh thức phương thức run () và chạy ( Phương thức) sẽ gọi goToFloor (queue.pop ()). Điều này sẽ làm cho vấn đề quá phức tạp. Tôi đã cố viết nó ra giấy, nhưng không nghĩ nó hoạt động. Có vẻ như chúng ta không thực sự cần phải tính đến vấn đề đồng thời hoặc vấn đề thời gian ở đây,

Bất kì lời đề nghị nào?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.