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?
sumber
Jawaban:
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:
Setiap elevator memiliki sekumpulan status.
Ada sinyal tambahan:
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.
sumber
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
sumber
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:
Representasi dari pengontrol pusat (dengan asumsi ada satu).
Representasi lift
Representasi unit antarmuka elevator (ini mungkin berbeda dari elevator ke elevator). Jelas juga tombol panggil di setiap lantai, dll.
Representasi panah atau indikator di setiap lantai (hampir seperti "pemandangan" dari model elevator).
Representasi manusia dan kargo (mungkin penting untuk memperhitungkan beban maksimal)
Representasi dari bangunan (dalam beberapa kasus, karena lantai tertentu terkadang dapat diblokir, dll.)
sumber
Lihat:
tautan
sumber
Jawaban Rinci:
http://www.angelfire.com/trek/software/elevator.html
sumber
Hal yang Perlu Dipertimbangkan Saat Mendesain Sistem Lift,
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
sumber
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?
sumber