Nesneye Dayalı Analiz ve Tasarım Kullanarak Bir Asansörü Modelleme [kapalı]


134

Nesneye yönelik tasarım ve analiz söz konusu olduğunda görüşmelerde ve sınıflarda yaygın olarak kullanılan bir dizi soru vardır. Bu onlardan biri; ne yazık ki, üniversitedeki OOP profesörüm aslında hiçbir zaman cevap vermedi ve ben de merak ettim.

Sorun şu şekildedir: bir asansör bankasını simüle etmek için kullanılacak temel bir nesne / yöntem kümesi tasarlayın. Nesneler ve öznitelikleri / yöntemleri nelerdir?

Tartışma uğruna, binamızın yirmi katı olduğunu varsayalım; alt kat lobidir ve ikinci kat otoparka bağlanır (bu nedenle insanlar binaya alt kat veya ikinci kattan girer / çıkarlar). Tüm katlara hizmet veren bir asansör bankası vardır; asansör bankasında üç asansör boşluğu ve mil başına bir asansör vardır.

Bunu nesne yönelimli bir modelde modellemenin doğru yolu ne olabilir?


9
Bu benim en sevdiğim röportaj sorum. Sormak basit ama doğru olması şaşırtıcı derecede karmaşık. Kuyruklar gibi şeyleri içerir ve daha fazla zorlukla başa çıkmak için kolayca genişletilebilir. Örneğin, bekleme sürelerini azaltmak için algoritmayı nasıl optimize edersiniz?
Rob Di Marco

Evet, bu gerçekten harika bir açık uçlu soru. Asla sorulmadı, ne yazık ki :(
Uri

Yanıtlar:


165

İlk olarak bir asansör sınıfı var. Bir yönü (yukarı, aşağı, ayakta durma, bakım), mevcut bir zemine ve yönde sıralanmış zemin isteklerinin bir listesine sahiptir. Bu asansörden talep alıyor.

Sonra bir banka var. Asansörleri içerir ve katlardan istekleri alır. Bunlar tüm aktif asansörler için planlanmıştır (bakımda değil).

Programlama aşağıdaki gibi olacaktır:

  • eğer varsa bu kat için ayakta duran bir asansör seçin.
  • bu kata çıkan asansörü seçin.
  • başka bir yerde ayakta asansörü seçin.
  • aksi takdirde en düşük yüke sahip asansörü seçin.

Her asansörün bir dizi durumu vardır.

  • Bakım: asansör harici sinyallere tepki vermez (sadece kendi sinyallerine).
  • Stand: Asansör bir yere sabitlenmiştir. Bir çağrı alırsa. Ve asansör o katta, kapılar açılıyor. Başka bir katta ise, o yönde hareket eder.
  • Yukarı: asansör yukarı hareket eder. Bir yere her ulaştığında durması gerekip gerekmediğini kontrol eder. Eğer öyleyse durur ve kapıları açar. Belirli bir süre bekler ve kapıyı kapatır (eğer bir şey hareket etmedikçe. Daha sonra zemini istek listesinden kaldırır ve başka bir istek olup olmadığını kontrol eder. Eğer asansör tekrar hareket etmeye başlar. devlet standı.
  • Aşağı: yukarı gibi ama ters yönde.

Ek sinyaller var:

  • alarmı. Asansör durur. Ve eğer bir kattaysa, kapılar açılır, istek listesi temizlenir, istekler bankaya geri taşınır.
  • kapı açık. Asansör yerde ve hareket etmiyorsa kapıları açar.
  • Kapı kapanıyor. Açıklarsa kapıyı kapattılar.

EDIT: Bazı asansörler alt / first_floor esp. gökdelenler durumunda.

min_floor ve max_floor, Elevator için iki ek özelliktir.


16
Asansör simülasyonu play.elevatorsaga.com
Samar Panda

1
Bu planlama yaklaşımında bazı optimizasyonlar eksik gibi görünüyor, örneğin, bir asansör zaten bir kişinin asansör talep ettiği bir yere gidiyorsa, başka bir asansörün gelmesini planlamaya gerek yoktur.
Liron Yahdav

Alma isteği ve zamanlaması senkron veya asenkron olur mu? Zaman uyumsuz olsaydı bunu nasıl başardık?
Rohitashwa Nigam

18

Donald Knuth'un Bilgisayar Programlama Sanatı Cilt 1, asansör ve veri yapılarının bir gösterisine sahiptir. Knuth çok kapsamlı bir tartışma ve program sunar.

Knuth (1997) "Bilgi Yapıları", Bilgisayar Programlama Sanatı Vol. 1 s.302-308


9
yukarıdaki google kitaplarına bağlandı.
vine'th

2
Kitabın bu bölümünde asansör simülasyonunun nasıl çalıştırılacağı (ayrıntılı olarak) açıklanmaktadır. Nasıl modelleneceğini tarif etmez (OOP şeklinde). Ama evet .. büyük kitap!
kullanici7

17

Bu sorunun birçok çeşidini gördüm. Başlıca farklılıklardan biri (zorluğu belirleyen), yük dengelemesine (örneğin, sabah lobisine daha fazla boş asansör göndermek) "akıllı ve verimli bir sisteme" sahip olmak için merkezi bir girişim olup olmadığıdır. Bu durumda, tasarım gerçekten eğlenceli bir tasarıma sahip bütün bir alt sistemi içerecektir.

Tam bir tasarım burada sunulmak için çok fazla ve birçok alternatif var. Genişlik de net değil. Bir röportajda, nasıl düşüneceğinizi anlamaya çalışacaklar. Ancak, bunlar ihtiyacınız olan şeylerden bazıları:

  1. Merkezi kontrolörün temsili (bir tane varsayalım).

  2. Asansör temsili

  3. Asansörün arayüz ünitelerinin temsili (bunlar asansörden asansöre farklı olabilir). Açıkçası, her katta vb. Düğmeleri arayın.

  4. Her katta okların veya göstergelerin temsili (asansör modelinin neredeyse bir "görünümü").

  5. Bir insanın ve yükün temsili (azami yüklerde faktoring için önemli olabilir)

  6. Binanın temsili (bazı durumlarda, belirli katlar zaman zaman engellenebileceğinden, vb.)


7

Görmek:

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

bağlantı



2

Asansör Sistemini Tasarlarken Dikkat Edilmesi Gerekenler ,

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

Her düğmeye basıldığında, sunulması gereken bir asansör talebi ortaya çıkar. Bu isteklerin her biri küresel bir yerde izlenir

Binadaki asansör sayısı kullanıcı tarafından belirlenecektir. Bina sabit sayıda kat içerecektir. Asansöre sığabilecek yolcu sayısı sabitlenecektir. Yolcular asansörü hedef katlarında bıraktıkça sayılacaktır. Hedef kat "rastgele" bir Poisson aralığı kullanılarak belirlenecektir. Asansördeki tüm yolcular hedef katlarına ulaştığında, asansör daha fazla yolcu almak için lobiye geri dönecektir


2

Endişelenmeniz gereken en önemli şey, asansöre yukarı veya aşağı hareket etmesi gerektiğini nasıl bildireceğinizdir. ve ayrıca bu davranışı kontrol etmek için merkezi bir sınıfa sahip olacaksanız ve kontrolü nasıl dağıtabiliyorsanız.

Çok basit veya çok karmaşık olabilir. Eşzamanlılık veya bir asansörün bir yere gelmesi için zaman almazsak, basit gibi görünüyor çünkü asansör durumlarını kontrol etmemiz gerekiyor, örneğin yukarı veya aşağı hareket ediyor veya hareketsiz duruyor. Ancak Elevator'u Runnable uygulamasını yaparsak ve bir kuyruğu sürekli olarak kontrol edip senkronize edersek (LinkedList). Bir Controller sınıfı kuyrukta hangi kata gidileceğini belirler. Kuyruk boş olduğunda, run () yöntemi bekleyecektir (queue.wait ()), bu asansöre bir kat atandığında, run () yöntemini uyandırmak için queue.notify () öğesini çağırır ve ( ) yöntemi goToFloor (queue.pop ()) yöntemini çağırır. Bu, sorunu çok karmaşık hale getirecektir. Kağıda yazmaya çalıştım, ama işe yaradığını sanmıyorum. Burada eşzamanlılık veya zamanlama sorununu gerçekten hesaba katmamız gerekmiyor gibi görünüyor,

Herhangi bir öneri?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.