ऑब्जेक्ट-ओरिएंटेड एनालिसिस और डिज़ाइन का उपयोग करके एक एलेवेटर का निर्माण करना [बंद]


134

ऐसे प्रश्नों का एक समूह होता है जो ऑब्जेक्ट-ओरिएंटेड डिज़ाइन और विश्लेषण की बात होने पर साक्षात्कार और कक्षाओं में आमतौर पर उपयोग किए जाते हैं। यह उनमें से एक है; दुर्भाग्य से, कॉलेज में मेरे ओओपी प्रोफेसर ने वास्तव में इसका जवाब कभी नहीं दिया, और इसलिए मैं सोच रहा हूं।

समस्या इस प्रकार है: एक लिफ्ट बैंक का अनुकरण करने के लिए उपयोग की जाने वाली वस्तुओं / विधियों का एक मूल सेट डिज़ाइन करें। वस्तुओं और उनकी विशेषताओं / विधियों क्या हैं?

तर्क के लिए, मान लें कि हमारी इमारत में बीस मंजिल हैं; नीचे की मंजिल लॉबी है, और दूसरी मंजिल पार्किंग गैरेज से जुड़ती है (इसलिए, लोग नीचे की मंजिल या दूसरी मंजिल पर इमारत में प्रवेश / निकास करेंगे)। एक लिफ्ट बैंक है जो सभी मंजिलों की सेवा करता है; लिफ्ट बैंक में तीन लिफ्ट शाफ्ट हैं, और प्रति शाफ्ट एक लिफ्ट है।

ऑब्जेक्ट-ओरिएंटेड मॉडल में इसे मॉडल करने का सही तरीका क्या होगा?


9
यह मेरा पसंदीदा साक्षात्कार प्रश्न है। यह पूछने के लिए सरल है लेकिन आश्चर्यजनक रूप से सही पाने के लिए जटिल है। इसमें कतारों जैसी चीजें शामिल हैं और इन्हें अधिक चुनौतियों में फेंकने के लिए आसानी से बढ़ाया जा सकता है। उदाहरण के लिए, आप प्रतीक्षा समय को कम करने के लिए एल्गोरिदम को कैसे अनुकूलित करेंगे।
रोब डि मार्को

हाँ, यह एक बहुत अच्छा खुला सवाल है। कभी नहीं पूछा कि एक, दुर्भाग्य से :(
उड़ी

जवाबों:


165

पहले एक लिफ्ट क्लास है। इसमें एक दिशा (ऊपर, नीचे, स्टैंड, रखरखाव), एक वर्तमान मंजिल और दिशा में क्रमबद्ध फर्श अनुरोधों की एक सूची है। यह इस लिफ्ट से अनुरोध प्राप्त करता है।

फिर एक बैंक है। इसमें लिफ्ट हैं और फर्श से अनुरोध प्राप्त करता है। ये सभी सक्रिय लिफ्टों के लिए निर्धारित हैं (रखरखाव में नहीं)।

शेड्यूलिंग इस प्रकार होगी:

  • यदि उपलब्ध हो तो इस मंजिल के लिए एक खड़ा लिफ्ट चुनें।
  • इस मंजिल पर जाने के लिए एक लिफ्ट चुनें।
  • वरना दूसरी मंजिल पर खड़े लिफ्ट को चुनें।
  • और लिफ्ट को सबसे कम भार के साथ चुनें।

प्रत्येक लिफ्ट में राज्यों का एक सेट है।

  • रखरखाव: लिफ्ट बाहरी संकेतों (केवल अपने स्वयं के संकेतों) पर प्रतिक्रिया नहीं करती है।
  • स्टैंड: लिफ्ट एक मंजिल पर तय की गई है। यदि यह एक कॉल प्राप्त करता है। और लिफ्ट उस मंजिल पर है, जिसके दरवाजे खुले हैं। यदि यह दूसरे तल पर है, तो यह उसी दिशा में चलता है।
  • ऊपर: लिफ्ट ऊपर चलती है। हर बार जब यह एक मंजिल तक पहुंचता है, तो यह जांचता है कि क्या इसे बंद करना है। यदि ऐसा है तो यह बंद हो जाता है और दरवाजे खोलता है। यह एक निश्चित समय के लिए प्रतीक्षा करता है और दरवाजा बंद कर देता है (जब तक कि कुछ उनके माध्यम से आगे नहीं बढ़ रहा है। तब यह अनुरोध सूची से फर्श को हटा देता है और यदि कोई अन्य अनुरोध हो तो जांच करता है। यदि लिफ्ट फिर से चलना शुरू करती है। यदि यह प्रवेश नहीं करती है। राज्य का रुख।
  • नीचे: ऊपर की तरह लेकिन उल्टी दिशा में।

अतिरिक्त संकेत हैं:

  • अलार्म। लिफ्ट रुक जाती है। और अगर यह एक मंजिल पर है, तो दरवाजे खुलते हैं, अनुरोध सूची को मंजूरी दे दी जाती है, अनुरोध बैंक में वापस चले जाते हैं।
  • द्वार खुला है। यदि लिफ्ट किसी मंजिल पर है और चलती नहीं है तो दरवाजे खोलती है।
  • दरवाजा बंद हो जाता है। यदि वे खुले हैं तो दरवाजा बंद कर दिया।

संपादित करें: कुछ लिफ्ट नीचे / first_floor esp पर शुरू नहीं होती हैं। गगनचुंबी इमारतों के मामले में।

min_floor और max_floor लिफ्ट के लिए दो अतिरिक्त विशेषताएँ हैं।


16
एलेवेटर सिमुलेशन प्ले.elevatorsaga.com
समर पांडा

1
इस शेड्यूलिंग दृष्टिकोण की तरह लगता है कि कुछ अनुकूलन याद आ रहे हैं, उदाहरण के लिए, यदि एक लिफ्ट पहले से ही एक मंजिल पर जा रही है जहां एक व्यक्ति ने एक लिफ्ट का अनुरोध किया है, तो आने के लिए किसी अन्य लिफ्ट को शेड्यूल करने की आवश्यकता नहीं है।
लिरॉन याहदव

क्या अनुरोध प्राप्त करना और शेड्यूल करना तुल्यकालिक या अतुल्यकालिक होगा? यदि Async है तो हम इसे कैसे प्राप्त करेंगे?
रोहिताश्व निगम

18

डोनाल्ड नुथ की द आर्ट ऑफ़ कंप्यूटर प्रोग्रामिंग Vol.1 में एलेवेटर और डेटा-संरचनाओं का प्रदर्शन है। नुथ बहुत गहन चर्चा और कार्यक्रम प्रस्तुत करता है।

नूथ (1997) "सूचना संरचनाएं", द आर्ट ऑफ कंप्यूटर प्रोग्रामिंग वॉल्यूम। 1 पीपी .302-308


9
ऊपर Google पुस्तकों से जुड़ा हुआ है।
सिरका

2
पुस्तक का यह खंड एक विवरण सिमुलेशन कैसे चलाता है (विवरण में) का वर्णन करता है। यह वर्णन नहीं करता है कि इसे कैसे (एक ओओपी तरीके से) मॉडल किया जाए। लेकिन हाँ..ग्राह्य पुस्तक!
उपयोगकर्ता

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

चिंता की मुख्य बात यह है कि आप उस एलेवेटर को कैसे सूचित करेंगे कि उसे ऊपर या नीचे जाने की जरूरत है। और अगर आप इस व्यवहार को नियंत्रित करने के लिए एक केंद्रीकृत वर्ग के लिए जा रहे हैं और आप नियंत्रण कैसे वितरित कर सकते हैं।

ऐसा लगता है कि यह बहुत सरल या बहुत जटिल हो सकता है। यदि हम एक जगह पर लिफ्ट या एलीवेटर के लिए समय नहीं लेते हैं, तो ऐसा लगता है कि यह सरल होगा क्योंकि हमें लिफ्ट के राज्यों की जांच करने की आवश्यकता है, जैसे यह ऊपर या नीचे जा रहा है, या अभी भी खड़ा है। लेकिन अगर हम एलिवेटर को रननेबल लागू करते हैं, और लगातार एक कतार (लिंक्डलिस्ट) की जांच और सिंक्रनाइज़ करते हैं। एक नियंत्रक वर्ग बताएगा कि कतार में किस मंजिल पर जाना है। जब कतार खाली हो जाती है, तो रन () विधि प्रतीक्षा करेगी (queue.wait ()), जब कोई फर्श इस एलेवेटर को सौंपा जाता है, तो यह रन () विधि को जगाने के लिए queue.notify () कॉल करेगा, और रन () ) विधि goToFloor (queue.pop ()) को कॉल करेगी। इससे समस्या और भी जटिल हो जाएगी। मैंने इसे कागज़ पर लिखने की कोशिश की, लेकिन यह नहीं सोचता कि यह काम करता है। ऐसा लगता है कि हमें वास्तव में समसामयिकता या समयावधि को ध्यान में रखने की आवश्यकता नहीं है,

कोई उपाय?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.