การสร้างแบบจำลองลิฟต์โดยใช้การวิเคราะห์และออกแบบเชิงวัตถุ [ปิด]


135

มีชุดคำถามที่ดูเหมือนจะใช้กันทั่วไปในการสัมภาษณ์และชั้นเรียนเมื่อพูดถึงการออกแบบและวิเคราะห์เชิงวัตถุ นี่คือหนึ่งในนั้น น่าเสียดายที่อาจารย์ OOP ของฉันในวิทยาลัยไม่เคยให้คำตอบเลยฉันก็เลยสงสัย

ปัญหามีดังนี้: ออกแบบชุดพื้นฐานของวัตถุ / วิธีการที่จะใช้ในการจำลองธนาคารลิฟต์ อะไรคือวัตถุและคุณลักษณะ / วิธีการ?

เพื่อประโยชน์ในการโต้แย้งสมมติว่าอาคารของเรามียี่สิบชั้น ชั้นล่างสุดเป็นล็อบบี้และชั้นสองเชื่อมกับที่จอดรถ (ดังนั้นคนจะเข้า / ออกอาคารทั้งชั้นล่างสุดหรือชั้นสอง) มีลิฟต์ธนาคารหนึ่งแห่งที่ให้บริการทุกชั้น มีลิฟต์สามตัวในธนาคารลิฟต์และหนึ่งลิฟต์ต่อเพลา

อะไรคือวิธีที่ถูกต้องในการสร้างแบบจำลองนี้ในแบบจำลองเชิงวัตถุ?


9
นี่คือคำถามสัมภาษณ์ที่ฉันชอบที่สุด เป็นเรื่องง่ายที่จะถาม แต่ซับซ้อนอย่างน่าประหลาดที่จะทำให้ถูกต้อง มันเกี่ยวข้องกับสิ่งต่าง ๆ เช่นคิวและสามารถขยายได้อย่างง่ายดายเพื่อโยนความท้าทายเพิ่มเติม ตัวอย่างเช่นคุณจะเพิ่มประสิทธิภาพอัลกอริทึมอย่างไรเพื่อลดเวลารอ
Rob Di Marco

ใช่มันเป็นคำถามปลายเปิดที่ยอดเยี่ยมจริงๆ ไม่เคยถูกถามเลยน่าเสียดาย :(
Uri

คำตอบ:


168

อันดับแรกคือชั้นลิฟต์ มีทิศทาง (ขึ้นลงยืนซ่อมบำรุง) ชั้นปัจจุบันและรายการคำขอชั้นที่เรียงตามทิศทาง ได้รับคำขอจากลิฟต์นี้

จากนั้นมีธนาคารแห่งหนึ่ง มีลิฟต์และรับคำขอจากชั้น สิ่งเหล่านี้กำหนดไว้สำหรับลิฟต์ที่ใช้งานอยู่ทั้งหมด (ไม่อยู่ในระหว่างการบำรุงรักษา)

การตั้งเวลาจะเป็นดังนี้:

  • ถ้ามีให้เลือกลิฟต์แบบยืนสำหรับชั้นนี้
  • มิฉะนั้นให้เลือกลิฟต์ที่จะย้ายไปชั้นนี้
  • มิฉะนั้นให้เลือกลิฟต์ยืนที่ชั้นอื่น
  • มิฉะนั้นให้เลือกลิฟต์ที่มีน้ำหนักบรรทุกต่ำที่สุด

ลิฟต์แต่ละตัวมีชุดสถานะ

  • การบำรุงรักษา: ลิฟต์ไม่ตอบสนองต่อสัญญาณภายนอก (เฉพาะสัญญาณของตัวเอง)
  • ขาตั้ง: ลิฟต์ยึดกับพื้น หากได้รับสาย และลิฟต์อยู่ที่ชั้นนั้นประตูก็เปิดออก ถ้าอยู่ชั้นอื่นก็จะเคลื่อนไปในทิศทางนั้น
  • ขึ้น: ลิฟต์เลื่อนขึ้น ทุกครั้งที่มาถึงพื้นจะตรวจสอบว่าจำเป็นต้องหยุดหรือไม่ ถ้าเป็นเช่นนั้นให้หยุดและเปิดประตู รอระยะเวลาหนึ่งและปิดประตู (เว้นแต่บางครั้งจะเคลื่อนผ่านพวกเขาจากนั้นจะนำชั้นออกจากรายการคำขอและตรวจสอบว่ามีคำขออื่นหรือไม่หากเป็นเช่นนั้นลิฟต์จะเริ่มเคลื่อนที่อีกครั้งหากไม่ได้เข้าสู่ จุดยืนของรัฐ
  • ลง: เหมือนขึ้น แต่กลับทิศทาง

มีสัญญาณเพิ่มเติม:

  • นาฬิกาปลุก. ลิฟต์หยุด และถ้ามันอยู่บนพื้นประตูจะเปิดออกรายการคำขอจะถูกล้างคำขอจะย้ายกลับไปที่ธนาคาร
  • เปิดประตู. เปิดประตูหากลิฟต์อยู่บนพื้นและไม่เคลื่อนที่
  • ประตูปิด ปิดประตูหากเปิดอยู่

แก้ไข: ลิฟต์บางตัวไม่เริ่มต้นที่ด้านล่าง / ชั้นแรกโดยเฉพาะ ในกรณีของตึกระฟ้า

min_floor & max_floor เป็นคุณลักษณะเพิ่มเติมสองประการสำหรับลิฟต์


16
การจำลองลิฟต์play.elevatorsaga.com
Samar Panda

1
ดูเหมือนว่าวิธีการตั้งเวลานี้จะขาดการเพิ่มประสิทธิภาพบางอย่างเช่นหากลิฟต์ไปถึงชั้นที่มีคนขอลิฟต์อยู่แล้วก็ไม่จำเป็นต้องกำหนดเวลาให้ลิฟต์ตัวอื่นมา
Liron Yahdav

การรับคำขอและการจัดกำหนดการจะเป็นแบบซิงโครนัสหรือไม่พร้อมกัน? ถ้า async เราจะบรรลุสิ่งนั้นได้อย่างไร?
Rohitashwa Nigam

18

The Art of Computer Programming Vol.1 ของ Donald Knuth มีการสาธิตลิฟต์และโครงสร้างข้อมูล Knuth นำเสนอการอภิปรายและโปรแกรมอย่างละเอียดถี่ถ้วน

Knuth (1997) "โครงสร้างข้อมูล" ศิลปะการเขียนโปรแกรมคอมพิวเตอร์ฉบับ 1 น. 302-308


9
เชื่อมโยงกับ Google หนังสือด้านบน
vine'th

2
ส่วนนี้ของหนังสือเล่มนี้จะอธิบาย (โดยละเอียด) เกี่ยวกับวิธีเรียกใช้การจำลองลิฟต์ ไม่ได้อธิบายถึงวิธีการสร้างโมเดล (ด้วยวิธี OOP) แต่เออ.. หนังสือเยี่ยม!
7

17

ฉันเห็นปัญหานี้หลายรูปแบบ ความแตกต่างที่สำคัญประการหนึ่ง (ซึ่งกำหนดความยากลำบาก) คือมีความพยายามจากส่วนกลางที่จะมี "ระบบที่ชาญฉลาดและมีประสิทธิภาพ" ที่จะมีการจัดสรรภาระงานหรือไม่ (เช่นส่งลิฟต์ที่ไม่ได้ใช้งานไปที่ล็อบบี้ในตอนเช้า) หากเป็นเช่นนั้นการออกแบบจะรวมระบบย่อยทั้งหมดด้วยการออกแบบที่สนุกจริงๆ

เห็นได้ชัดว่าการออกแบบเต็มรูปแบบนั้นมีมากเกินไปที่จะนำเสนอที่นี่และมีการดัดแปลงมากมาย ความกว้างยังไม่ชัดเจน ในการสัมภาษณ์พวกเขาจะพยายามคิดว่าคุณจะคิดอย่างไร อย่างไรก็ตามนี่คือบางสิ่งที่คุณต้องการ:

  1. การเป็นตัวแทนของตัวควบคุมกลาง (สมมติว่ามีหนึ่งตัว)

  2. ตัวแทนของลิฟต์

  3. ตัวแทนของหน่วยเชื่อมต่อของลิฟต์ (ซึ่งอาจแตกต่างจากลิฟต์ถึงลิฟต์) เห็นได้ชัดว่ายังมีปุ่มโทรทุกชั้น ฯลฯ

  4. การแสดงลูกศรหรือตัวบ่งชี้ในแต่ละชั้น (เกือบจะเป็น "มุมมอง" ของแบบจำลองลิฟต์)

  5. การเป็นตัวแทนของมนุษย์และสินค้า (อาจมีความสำคัญสำหรับการแยกชิ้นส่วนในการบรรทุกสูงสุด)

  6. การเป็นตัวแทนของอาคาร (ในบางกรณีอาจมีการปิดกั้นบางชั้นในบางครั้ง ฯลฯ )




2

สิ่งที่ต้องพิจารณาในการออกแบบระบบลิฟต์

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

การกดปุ่มแต่ละครั้งจะส่งผลให้มีคำขอขึ้นลิฟต์ แต่ละคำขอเหล่านี้จะถูกติดตามที่ทั่วโลก

จำนวนลิฟต์ในอาคารจะถูกกำหนดโดยผู้ใช้ อาคารจะมีจำนวนชั้นคงที่ จำนวนผู้โดยสารที่สามารถพอดีกับลิฟต์จะได้รับการแก้ไข ผู้โดยสารจะถูกนับเมื่อออกจากลิฟต์ที่ชั้นปลายทาง ชั้นปลายทางจะถูกกำหนดโดยใช้ช่วงปัวซอง "สุ่ม" เมื่อผู้โดยสารทั้งหมดในลิฟต์ถึงชั้นปลายทางลิฟต์จะกลับไปที่ล็อบบี้เพื่อรับผู้โดยสารเพิ่มขึ้น


2

สิ่งสำคัญที่ต้องกังวลคือคุณจะแจ้งลิฟต์ว่าต้องเลื่อนขึ้นหรือลงอย่างไร และถ้าคุณกำลังจะมีคลาสแบบรวมศูนย์เพื่อควบคุมพฤติกรรมนี้และคุณจะกระจายการควบคุมได้อย่างไร

ดูเหมือนว่ามันจะง่ายมากหรือซับซ้อนมาก หากเราไม่ใช้เวลาพร้อมกันหรือเวลาที่ลิฟต์ไปยังที่แห่งหนึ่งดูเหมือนว่ามันจะง่ายเพราะเราต้องตรวจสอบสถานะของลิฟต์เช่นมันเคลื่อนที่ขึ้นหรือลงหรือหยุดนิ่ง แต่ถ้าเราทำให้ Elevator ใช้ Runnable และตรวจสอบและซิงโครไนซ์คิว (linkedList) อย่างสม่ำเสมอ คลาส Controller จะกำหนดชั้นที่จะไปในคิว เมื่อคิวว่างเมธอด run () จะรอ (que.wait ()) เมื่อชั้นถูกกำหนดให้กับลิฟต์นี้จะเรียกใช้ que.notify () เพื่อปลุกวิธีการ run () และเรียกใช้ ( ) จะเรียก goToFloor (que.pop ()) สิ่งนี้จะทำให้ปัญหาซับซ้อนเกินไป ฉันพยายามเขียนมันลงบนกระดาษ แต่ไม่คิดว่ามันจะได้ผล ดูเหมือนว่าเราไม่จำเป็นต้องคำนึงถึงปัญหาการเกิดพร้อมกันหรือเวลาที่นี่

ข้อเสนอแนะใด ๆ ?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.