2017-01-17 7 views
5

यह 100% सैद्धांतिक प्रश्न है, और शायद राय आधारित है।एक पेशेवर साक्षात्कार पर अप्रत्याशित उत्तर

एक पेशेवर साक्षात्कार में मुझे भाषण में लाइन के अनुसार लाइन का विश्लेषण करने के लिए दो class es के बहुत भयानक लिखित और अनुचित रूप से स्वरूपित कोड के साथ एक मुद्रित पृष्ठ मिला। आइए इन डेटा संरचनाओं को A और B पर कॉल करें। अपेक्षित व्यवहार के बारे में कोई समस्या कथन या कोई जानकारी नहीं थी।

हालांकि उनके एक प्रश्न ने वास्तव में मुझे बंद कर दिया।

एल्गोरिदम के संदिग्ध व्यवहार और कई संभावित और वास्तविक त्रुटियों की पहचान करने के बाद, उन्होंने मुझे एक और त्रुटि की पहचान करने के लिए कहा। मैंने कई अन्य स्पष्ट समस्याओं की पहचान की, लेकिन मुझे नहीं पता था कि वे मुझसे क्या चाहते हैं। खैर, जब उन्होंने मुझे जवाब बताया तो यह मेरा दिमाग उड़ा दिया।

template <typename T> 
class A 
{ 
public: 

    // elements are dynamically allocated on the heap 

    const T& getValue(unsigned i) const // I'm not even sure it was const 
    { 
     // return element at position 'i' 
    } 

    virtual void setValue(unsigned i, const T &value) 
    { 
     // sets the element at position 'i' 
    } 
}; 

template <typename T> 
class B: public A<T> 
{ 
public: 

    virtual void setValue(unsigned i, const T &value) 
    { 
     // set the element at position 'i' using A<T>::setValue() 
     // then sort all elements in descending order 
    } 
}; 

ठीक है, समाधान एक संकलन, क्रम, या तार्किक त्रुटि नहीं है: A और B का सरलीकृत संस्करण निम्नलिखित (मैं केवल तरीकों जो उनके विचार का हिस्सा हैं छोड़कर चला गया)। इनके संभावित जोखिम भी नहीं।त्रुटि निम्न है:B::setValue एक तत्व रखने के बाद डेटा को टाइप करता है, तो आप यह जांच नहीं सकते कि किसी दिए गए स्थान पर आपके द्वारा उपयोग किए जाने वाले डेटा वही है जो आपने उस स्थिति में संग्रहीत किया है। हालांकि A के साथ आप यह कर सकते हैं। A और B के बीच यह बेजोड़ व्यवहार एक त्रुटि के रूप में माना जाता है (और उन्होंने कहा कि यह एक त्रुटि नहीं है, लेकिन फिर भी यह एक त्रुटि है)।

मुझे लगता है कि यह पूरी तरह से एक डिज़ाइन विकल्प है (चूंकि B का पूरा बिंदु सॉर्ट किए गए डेटा को बनाए रखना है) और मैं यह नहीं कहूंगा कि यह एक त्रुटि है, विशेष रूप से किसी समस्या कथन या अपेक्षित व्यवहार पर कोई जानकारी के बिना। यह पॉलिमॉर्फिज्म के विचार या अवधारणा का भी उल्लंघन नहीं करता है।

क्या आप इसे एक त्रुटि के रूप में पहचानेंगे?

+0

कोई भी परीक्षण करना चाहेगा कि कोई तत्व सॉर्ट करने के बाद भी एक ही स्थिति में है या नहीं? – user463035818

+0

'ए :: सेटवैल्यू (1, 5) 'टाइप' शून्य 'है, जिसके लिए कोई' == 'अभिव्यक्ति नहीं है। –

+0

मुझे लगता है कि उनका मतलब है कि इसका वर्ग के बाहर परीक्षण नहीं किया जा सकता है (क्योंकि उन्होंने ऐसा करने के लिए कोई सहायक विधि प्रदान नहीं की है)। – plasmacel

उत्तर

9

हम तय कर सकता है कि यह वर्ग A के इंटरफेस का हिस्सा है और A::getValue की अधिक विशेष रूप से एक पोस्ट शर्त है, कि A::getValue एक ही मूल्य है कि (तुरंत) था पहले से ही सूचकांक में A::setValue द्वारा आवंटित लौट जाना चाहिए।

यदि ऐसी पोस्ट शर्त निर्दिष्ट है, तो पोस्ट की स्थिति का उल्लंघन करने वाली एक व्युत्पन्न कक्षा Liskov Substitution Principle का उल्लंघन करेगी। यह एक डिजाइन त्रुटि होगी।


यह व्यायाम में निर्दिष्ट नहीं था कि इस तरह की पोस्ट स्थिति मौजूद है या फिर मौजूद होना चाहिए। और पोस्ट की स्थिति के बिना, कोई डिज़ाइन त्रुटि नहीं है (कम से कम उस त्रुटि को नहीं जिसे मैं चर्चा कर रहा हूं)।

चाहे (संभावित रूप से आपके साक्षात्कारकर्ताओं द्वारा माना जाता है) पोस्ट की स्थिति पदानुक्रम के डिजाइनर तक मौजूद होनी चाहिए। जो आपके साक्षात्कार में था। चाहे पोस्ट हालत पदानुक्रम के लिए अच्छी डिजाइन है, कक्षाओं मॉडलिंग के आधार पर निर्भर करेगा। यदि A मॉडल std::array जैसे कुछ मॉडल हैं - और यही वह जैसा दिखता है - तो पोस्ट की स्थिति निश्चित रूप से मेरी राय में एक अच्छी डिज़ाइन पसंद है।

+0

यदि कोई इंटरफ़ेस उचित रूप से टिप्पणी में खतरनाक व्यवहार के बारे में उचित चेतावनी देने के बिना पाठक की उचित अपेक्षा का उल्लंघन करता है, तो यह निश्चित रूप से एक त्रुटि है। यह ऐसा कुछ है जिसे आप कोडेबेस में बर्दाश्त नहीं कर सकते हैं, क्योंकि यह आवश्यक रूप से सड़क के नीचे और त्रुटियों का कारण बन जाएगा। बेशक, यदि यह विरासत कोड है कि आप तुरंत अपने आप को साफ नहीं कर सकते हैं, तो बस "यहां ड्रैगन बनें" डालने की अनुमति है! साइन इन करें, लेकिन इससे त्रुटि कम गलती नहीं होती है। – cmaster

संबंधित मुद्दे