प्रदर्शन में परिवर्तन लिस्कोव प्रतिस्थापन सिद्धांत का उल्लंघन करते हैं?


14

कहो मेरे पास:

interface Thing
{
    GetThing();
}

class FastThing : Thing 
{
    public int GetThing()
    {
        return 1;
    }
}

class SlowThing : Thing
{
    public int GetThing()
    {
        return GetThingFromDatabase();
    }
}

क्या यह लिस्कोव प्रतिस्थापन सिद्धांत का उल्लंघन है?


GetThingFromDatabase()यह विवादास्पद बनाने के लिए पर्याप्त धीमा नहीं है। Factor4096BitPublicKey();return 1;चीजों को थोड़ा और दिलचस्प बना देगा।
पैट्रिक


1
यदि आप के FastThingसाथ प्रतिस्थापित करते हैं SlowThing, तो एलएसपी लागू नहीं होता है। यदि आप एक टिप्पणी जोड़ते Thing::GetThingहैं जिसमें कहा गया है "बहुत तेज़ है", तो प्रश्न पर चर्चा की जा सकती है।
सेफालोपॉड

जवाबों:


14

यह वास्तव में निर्भर करता है। कुछ इंटरफेस में, उदाहरण के लिए, जटिलता की कमी है (ये स्पष्ट रूप से प्रोग्राम लागू नहीं किए जा सकते हैं)। सबसे बुनियादी मामला "गेटटिंग () देता है int- यानी, यह रुक जाता है" , जिस स्थिति में, जवाब "नहीं" होगा - गेटटिंग के दोनों संस्करण () पड़ाव और एक इंट वापस।

लेकिन कई इंटरफेस ने जटिलता या सपाट समय में या तो स्पष्ट रूप से प्रदर्शन की गारंटी दी है। उदाहरण के लिए, C ++ Standard में, लाइब्रेरी को ब्लॉकिंग कॉल के साथ लागू करना अवैध है, जहां मानक स्पष्ट रूप से अनुमति देता है।


3
प्रदर्शन कुछ प्रकार के चेक के माध्यम से लागू करने योग्य नहीं है। यह कार्यान्वयनकर्ता / पुस्तकालय अनुरक्षक का एक वादा है।
आहारबुद्धि

3
मैंने स्पष्ट रूप से अपने उत्तर में ऐसा कहा है?
डेडएमजी

1
मेरा कहना यह था कि जैसे ही आप मानदंड में टाइप के अलावा कुछ भी शामिल करते हैं, अब आप लिस्कोव के बारे में बात नहीं कर रहे हैं क्योंकि यह टाइप करने के लिए विशिष्ट है। हालांकि अलग-अलग प्रदर्शन करने वाली वस्तुओं को नहीं हटाने की "प्रथा" अच्छी हो सकती है, लिस्कोव के पास इसके बारे में कहने के लिए कुछ भी नहीं है।
आहारबुद्धि

7
लिस्कोव का कहना है कि व्युत्पन्न के लिए, यह एक बेस है कहीं भी प्रयोग करने योग्य होना चाहिए। अगर आधार कुछ प्रदर्शन या विशेषताओं की गारंटी देता है तो यह अच्छी तरह से सच नहीं हो सकता है। उदाहरण के लिए, यदि व्युत्पन्न ब्लॉक, गतिरोध की संभावना हो सकती है।
डेडएमजी

8

टीएल; डीआर: नहीं

"व्यवहार और बाधाओं का उपयोग कर व्यवहार" के अनुसार " सिद्धांत की औपचारिकता " यह मुख्य रूप से एक ऑब्जेक्ट प्रकार के "सुरक्षा" गुणों से संबंधित है। गुण जो केवल प्रकार की जानकारी के संदर्भ में प्रतिस्थापन क्षमता को नियंत्रित करते हैं। एक ऑब्जेक्ट प्रकार यह प्रदर्शन के लिए रूढ़िवादी है। इसलिए प्रदर्शन में अंतर Liskov प्रतिस्थापन सिद्धांत का उल्लंघन नहीं है।


3
मुझे उस कागज पर केवल एक छोटी सी नज़र थी, लेकिन क्या आप सुनिश्चित हैं कि समय की कमी को औपचारिक रूप से सिद्ध नहीं किया जा सकता है? और यहां तक ​​कि अगर लिसकोव का मतलब यह नहीं था कि शब्दों में, समय की कमी सहित शास्त्रीय एलएसपी के अच्छे विस्तार के रूप में देखा जा सकता है जो वास्तविक दुनिया की प्रोग्रामिंग के लिए प्रासंगिक हो सकता है।
डॉक्टर ब्राउन

@ डॉक ब्राउन: चाहे समय किसी वस्तु को प्रतिस्थापित करने के लिए एक विचार के रूप में उपयोगी हो या नहीं, लिस्कोव के लिए ऑर्थोगोनल है। इसे एक स्प्रेड प्रैप्ट के रूप में जोड़ सकते हैं, लेकिन यह Liskov का हिस्सा नहीं हो सकता है। यह एक बूलियन तर्क समीकरण होने और कहने जैसा है! गलत केवल तभी सही हो सकता है जब यह पर्याप्त तेज़ हो। गति का गणित या तर्क से कोई लेना-देना नहीं है।
आहारबुद्ध

Counterexample: इस कोड को जावा के EDT, या नोड के ईवेंट लूप में कहा जाता है। धीमे संस्करण का मौलिक रूप से धीमा प्रदर्शन सॉफ्टवेयर को अर्द्ध विराम देगा। मुझे लगता है कि इस प्रश्न का उचित उत्तर "शायद नहीं है लेकिन अपवाद हैं"।
user949300

6

इंटरफ़ेस क्या गारंटी देता है? चूंकि GetThingकोई गारंटी नहीं देता है, इसलिए उपप्रकारों को इसका सम्मान करने की आवश्यकता नहीं है।

यदि इंटरफ़ेस कुछ ऐसा था GetThingInLinearTimeया यदि आधार प्रकार आभासी है और डिफ़ॉल्ट कार्यान्वयन एक जटिलता है, तो उस एल्गोरिथम की जटिलता को बदतर बनाने से एलएसपी का उल्लंघन होगा


4

सॉफ्टवेयर के प्रदर्शन का लिस्कोव सबस्टीट्यूशन सिद्धांत से कोई लेना-देना नहीं है।

सिद्धांत को उपप्रकार के प्रतिस्थापन के साथ करना है, और उस वस्तु को केवल ओओपी शब्दों में प्रतिस्थापित करने का व्यवहारिक प्रभाव है।

इनपुट और आउटपुट getThing()दोनों ही मामलों के लिए समान रहते हैं, और धीमी और तेज संभावना दोनों वस्तुओं को एक ही स्थिति में डालते हैं।


1

क्या इससे कोई फर्क नहीं पड़ता कि लिस्कोव सबस्टीट्यूशन सिद्धांत खुद को विशेष रूप से क्या कहता है? यदि एक उपप्रकार सुपरपाइप के उपभोक्ता की अपेक्षाओं का उल्लंघन करता है, तो ऐसा लगता है कि एलएसपी अधिक प्रतिबंधात्मक है या नहीं, एक बुरी बात है।

इसलिए मेरे विचार में, क्या उपप्रकार के उपभोक्ता की सभी उचित अपेक्षाएँ उपप्रकार से पूरी होती हैं, एलएसपी का एक अच्छा सामान्यीकरण प्रतीत होता है।

हालाँकि, आपके द्वारा पोस्ट किए गए उदाहरण में और सामान्य रूप से जावा इंटरफेस के साथ, यह स्पष्ट नहीं है कि Thingइंटरफ़ेस के उपभोक्ता को कोई उचित उम्मीद है कि यह तेज या धीमा होना चाहिए। यदि इंटरफ़ेस के javadocs में भाषा को शामिल करने के बारे में था कि क्या ऑपरेशन तेज होने का वादा किया जाता है, तो प्रदर्शन के आधार पर समस्या के लिए एक तर्क हो सकता है। लेकिन जावा कन्वेंशन निश्चित रूप से विभिन्न कार्यान्वयन के लिए विभिन्न प्रदर्शन विशेषताओं के लिए है।


2
जहाँ तक मैं बता सकता हूँ, उदाहरण पोस्ट नहीं जावा
gnat

0

अंकल बॉब ने उसी तरह के सवाल का जवाब दिया जिसमें उन्होंने कहा था कि एलएसपी उल्लंघन के लिए 3 पक्षों की आवश्यकता होती है:

प्रकार T, उपप्रकार S और प्रोग्राम P जो T का उपयोग करता है, लेकिन S का उदाहरण दिया गया है।

मैं एक अनुमान लगाता हूं कि इस प्रश्न का एक समान ढांचा है जैसा कि उसने उत्तर दिया था, इसमें वह उस पी का उल्लेख नहीं करता है जो टी का उपयोग कर रहा है और पी क्या व्यवहार करता है।

आप उसका जवाब यहां पा सकते हैं । (आपको कुछ नीचे स्क्रॉल करने और रॉबर्ट मार्टिन नाम के उपयोगकर्ता से जवाब की तलाश करने की आवश्यकता होगी)


1
यह पूछे गए प्रश्न का उत्तर कैसे देता है?
gnat

@gnat क्योंकि पूछे गए सवाल अधूरे हैं। एक एलएसपी उल्लंघन का निर्धारण करने के लिए 3 दलों का समय लगता है। जिनमें से, उन्होंने केवल 2 पार्टियों की आपूर्ति की।
टीएमसी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.