Memodelkan elevator menggunakan Analisis dan Desain Berorientasi Objek [tutup]

135

Ada serangkaian pertanyaan yang tampaknya umum digunakan dalam wawancara dan kelas dalam hal desain dan analisis berorientasi objek. Ini salah satunya; sayangnya, profesor OOP saya di perguruan tinggi tidak pernah benar-benar memberikan jawaban untuk itu, jadi saya bertanya-tanya.

Masalahnya adalah sebagai berikut: rancang satu set dasar objek / metode yang akan digunakan untuk mensimulasikan bank elevator. Apa objek dan atribut / metodenya?

Demi argumen, mari kita asumsikan bahwa gedung kita memiliki dua puluh lantai; lantai paling bawah adalah lobi, dan lantai dua terhubung ke garasi parkir (oleh karena itu, orang akan masuk / keluar gedung di lantai bawah atau lantai dua). Ada satu lift bank yang melayani semua lantai; ada tiga poros lift di bank lift, dan satu lift per poros.

Apa cara yang benar untuk memodelkan ini dalam model berorientasi objek?

Kate Bertelsen
sumber
9
Ini adalah pertanyaan wawancara favorit saya. Ini mudah untuk ditanyakan tetapi ternyata rumit untuk mendapatkan yang benar. Ini melibatkan hal-hal seperti antrian dan dapat dengan mudah diperpanjang untuk memberikan lebih banyak tantangan. Misalnya, bagaimana Anda mengoptimalkan algoritme untuk mengurangi waktu tunggu.
Rob Di Marco
Ya, itu pertanyaan terbuka yang sangat bagus. Sayangnya tidak pernah ditanya yang itu :(
Uri

Jawaban:

168

Pertama ada kelas lift. Ini memiliki arah (atas, bawah, berdiri, pemeliharaan), lantai saat ini dan daftar permintaan lantai yang diurutkan sesuai arah. Itu menerima permintaan dari lift ini.

Lalu ada bank. Ini berisi lift dan menerima permintaan dari lantai. Ini dijadwalkan untuk semua elevator aktif (tidak dalam pemeliharaan).

Penjadwalannya akan seperti:

  • jika tersedia pilih lift berdiri untuk lantai ini.
  • kalau tidak pilih lift yang pindah ke lantai ini.
  • jika tidak, pilih lift berdiri di lantai lain.
  • jika tidak pilih lift dengan beban terendah.

Setiap elevator memiliki sekumpulan status.

  • Pemeliharaan: elevator tidak bereaksi terhadap sinyal eksternal (hanya pada sinyalnya sendiri).
  • Berdiri: lift dipasang di lantai. Jika menerima panggilan. Dan lift ada di lantai itu, pintunya terbuka. Jika berada di lantai lain, ia bergerak ke arah itu.
  • Naik: lift naik. Setiap kali mencapai lantai, ia memeriksa apakah perlu berhenti. Jika demikian itu berhenti dan membuka pintu. Itu menunggu untuk jangka waktu tertentu dan menutup pintu (kecuali ada sesuatu yang bergerak melalui mereka. Kemudian menghapus lantai dari daftar permintaan dan memeriksa apakah ada permintaan lain. Jika demikian lift mulai bergerak lagi. Jika tidak, itu akan memasuki berdiri negara.
  • Bawah: seperti naik tapi dengan arah sebaliknya.

Ada sinyal tambahan:

  • alarm. Lift berhenti. Dan jika di lantai, pintunya terbuka, daftar permintaan dihapus, permintaan dipindahkan kembali ke bank.
  • pintu terbuka. Membuka pintu jika lift ada di lantai dan tidak bergerak.
  • pintu tertutup. Tutup pintu jika terbuka.

EDIT: Beberapa elevator tidak mulai dari bawah / first_floor esp. dalam kasus gedung pencakar langit.

min_floor & max_floor adalah dua atribut tambahan untuk Elevator.

Toon Krijthe
sumber
16
Simulasi lift play.elevatorsaga.com
Samar Panda
1
Sepertinya pendekatan penjadwalan ini melewatkan beberapa optimasi, misalnya jika elevator sudah menuju lantai dimana seseorang telah meminta elevator, maka tidak perlu menjadwalkan elevator lain untuk datang.
Liron Yahdav
Apakah permintaan penerimaan dan penjadwalan akan sinkron atau asinkron? Jika asinkron lalu bagaimana kita mencapai itu?
Rohitashwa Nigam
18

The Art of Computer Programming Vol.1 karya Donald Knuth menampilkan demonstrasi elevator dan struktur datanya. Knuth menyajikan diskusi dan program yang sangat menyeluruh.

Knuth (1997) "Struktur Informasi", Seni Pemrograman Komputer Vol. 1 hlm. 302-308

vine'th
sumber
9
ditautkan ke buku google di atas.
vine'th
2
Bagian buku ini menjelaskan (secara rinci) bagaimana menjalankan simulasi elevator. Ini TIDAK menjelaskan bagaimana memodelkannya (dengan cara OOP). Tapi ya..buku bagus!
pengguna7
17

Saya telah melihat banyak varian dari masalah ini. Salah satu perbedaan utama (yang menentukan tingkat kesulitannya) adalah apakah ada upaya terpusat untuk memiliki "sistem yang cerdas dan efisien" yang akan memiliki penyeimbangan beban (misalnya, mengirim lebih banyak lift yang menganggur ke lobi di pagi hari). Jika demikian, desain akan menyertakan keseluruhan subsistem dengan desain yang sangat menyenangkan.

Desain lengkap jelas terlalu banyak untuk disajikan di sini dan banyak alternatif lainnya. Luasnya juga tidak jelas. Dalam sebuah wawancara, mereka akan mencoba mencari tahu bagaimana Anda akan berpikir. Namun, berikut beberapa hal yang Anda perlukan:

  1. Representasi dari pengontrol pusat (dengan asumsi ada satu).

  2. Representasi lift

  3. Representasi unit antarmuka elevator (ini mungkin berbeda dari elevator ke elevator). Jelas juga tombol panggil di setiap lantai, dll.

  4. Representasi panah atau indikator di setiap lantai (hampir seperti "pemandangan" dari model elevator).

  5. Representasi manusia dan kargo (mungkin penting untuk memperhitungkan beban maksimal)

  6. Representasi dari bangunan (dalam beberapa kasus, karena lantai tertentu terkadang dapat diblokir, dll.)

Uri
sumber
7

Lihat:

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

tautan

Arun
sumber
2

Hal yang Perlu Dipertimbangkan Saat Mendesain Sistem Lift,

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

Setiap penekanan tombol menghasilkan permintaan elevator yang harus dilayani. Setiap permintaan ini dilacak di tempat global

Jumlah elevator di dalam gedung akan ditentukan oleh pengguna. Bangunan itu akan berisi sejumlah lantai tetap. Jumlah penumpang yang dapat masuk ke dalam lift akan ditetapkan. Penumpang akan dihitung saat mereka meninggalkan lift di lantai tujuan mereka. Lantai tujuan akan ditentukan menggunakan interval Poisson "acak". Ketika semua penumpang di lift telah mencapai lantai tujuan mereka, lift akan kembali ke lobi untuk menjemput lebih banyak penumpang

pengguna2603625
sumber
2

Hal utama yang perlu dikhawatirkan adalah bagaimana Anda memberi tahu lift bahwa lift perlu naik atau turun. dan juga jika Anda akan memiliki kelas terpusat untuk mengontrol perilaku ini dan bagaimana Anda bisa mendistribusikan kontrol.

Sepertinya ini bisa sangat sederhana atau sangat rumit. Jika kita tidak mengambil konkurensi atau waktu elevator untuk sampai ke suatu tempat, maka sepertinya akan mudah karena kita hanya perlu memeriksa keadaan elevator, seperti apakah elevator bergerak naik atau turun, atau diam. Tetapi jika kita membuat Elevator mengimplementasikan Runnable, dan terus-menerus memeriksa dan menyinkronkan antrian (linkedList). Kelas Pengendali akan menetapkan lantai mana yang harus masuk dalam antrian. Ketika antrian kosong, metode run () akan menunggu (queue.wait ()), ketika sebuah lantai ditetapkan ke elevator ini, ia akan memanggil queue.notify () untuk membangunkan metode run (), dan menjalankan ( ) akan memanggil goToFloor (queue.pop ()). Ini akan membuat masalah menjadi terlalu rumit. Saya mencoba menulisnya di atas kertas, tetapi tidak berpikir itu berhasil. Sepertinya kami tidak perlu mempertimbangkan masalah konkurensi atau waktu di sini,

Ada saran?

pengguna3216886
sumber