2011-10-31 6 views
6

गहरे लाल रंग का कुछ अन्य OOP भाषाओं के लिए अलग अलग है? क्या इसके लिए इसका कोई प्रतिस्थापन है?रूबी लोग क्यों कहते हैं कि उन्हें इंटरफेस की आवश्यकता नहीं है? (: पीएचपी जैसे) है कि इंटरफेस बेकार बना देता है

संपादित करें:

कुछ स्पष्टीकरण:

  • अन्य भाषाओं में (जैसे: पीएचपी), तो आप ऐसा नहीं "जरूरत" इंटरफेस (वे कोड के स्तर पर अनिवार्य नहीं हैं)। सॉफ़्टवेयर के आर्किटेक्चर को बेहतर बनाने के लिए आप अनुबंध बनाने के लिए उनका उपयोग करते हैं। इसलिए, रूबी में पुष्टि 'आपको इंटरफेस की आवश्यकता नहीं है/अन्य भाषाओं में आपको इंटरफेस की आवश्यकता है क्योंकि XXX' गलत है।

  • नहीं, mixins इंटरफेस नहीं हैं, वे पूरी तरह से अलग बात है (पीएचपी 5.4 औजार mixins) कर रहे हैं। क्या आपने इंटरफेस का भी उपयोग किया है?

  • हाँ, पीएचपी OOP है। भाषाएं विकसित होती हैं, वर्तमान में आपका स्वागत है।

+5

PHP एक ओओपी भाषा है? * चकल्स * – NullUserException

+0

http://en.wikipedia.org/wiki/Mixin – robinjam

+0

PHP 5 (मुझे लगता है कि संस्करण था) ने ओओपी डिजाइन अवधारणाओं को PHP में पेश किया लेकिन यह इसे "ओओपी" भाषा नहीं बना। आप अब ओओपी शैली PHP कोड लिख सकते हैं। –

उत्तर

0

मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि रूबी गतिशील रूप से टाइप की गई है जबकि अन्य भाषाओं को स्थाई रूप से टाइप किया गया है। PHP में एक इंटरफ़ेस का उपयोग करने का एकमात्र कारण यह है कि जब आप वस्तुओं को पास करते समय टाइप संकेत देते हैं।

+0

शायद अधिक विशिष्ट होने का एक अच्छा विचार - रूबी केवल गतिशील रूप से टाइप नहीं किया गया है, यह बतख टाइप किया गया है। – robinjam

+0

जबकि हम बाल बांट रहे हैं, बतख टाइपिंग एक विशिष्ट प्रकार का गतिशील टाइपिंग है;) –

+1

मुझे पता है, यही कारण है कि मैंने कहा कि यह _just_ गतिशील रूप से टाइप नहीं किया गया है;)। कारण यह प्रासंगिक है क्योंकि रूबी में यह ऑब्जेक्ट का मौजूदा सेट विधियों और गुणों का सेट है, न कि इसके सुपरक्लास या इंटरफेस, जो 'टाइप' निर्धारित करते हैं। – robinjam

0

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

समीक्षा यह भी:

http://en.wikipedia.org/wiki/Duck_typing

+0

कक्षाओं के बीच अनुबंध बनाने के लिए इंटरफेस उपयोगी हैं। – HappyDeveloper

-1

निर्भर करता है आप इंटरफ़ेस द्वारा क्या मतलब है।

इंटरफ़ेस द्वारा आप एक ठोस वस्तु है कि अपनी भाषा है कि आप से विरासत या लागू तो कोई आप रूबी की तरह एक भाषा में इंटरफेस का उपयोग नहीं करते में मौजूद है मतलब है।

आप वस्तुओं के रूप में इंटरफ़ेस मतलब अगर कुछ अच्छी तरह से प्रलेखित इंटरफ़ेस तो हाँ जाहिर है, वस्तुओं अभी भी एक अच्छी तरह से प्रलेखित इंटरफेस है है, वे गुण और तरीकों कि तुम वहाँ होने की उम्मीद है।

मैं मानता हूँ चाहते हैं कि इंटरफेस कुछ है कि अपने मन और दस्तावेज में मौजूद है और एक वस्तु के रूप कोड में नहीं हैं।

+0

हां, मुझे पता है कि आप रूबी में इंटरफेस का उपयोग नहीं करते हैं, लेकिन मैं जानना चाहता था कि क्यों (सुविधा के अलावा यह सुविधा उपलब्ध नहीं है) – HappyDeveloper

+0

@ हैप्पी डेवलपर ओह, मुझे लगता है कि यह obvouis नहीं था। उन्हें कोड में क्यों है। यह सूखा है। अपने सिर में इंटरफेस रखें, इसके लिए आपको कोड में निर्माण की आवश्यकता नहीं है। और इंटरफेस के अलावा उन भाषाओं के लिए एक गंदे हैक जो उचित टाइपिंग सिस्टम को लागू नहीं करते हैं। आप एक इंटरफ़ेस नहीं चाहते हैं, आप अपनी कड़ाई से टाइप की गई भाषा में एक अच्छी तरह से परिभाषित प्रकार चाहते हैं। – Raynos

+0

यदि मैंने कक्षाएं बनाई हैं, तो मेरे पास उनके सिर में (सीमित समय के लिए) हो सकता है, लेकिन मेरे आगे के डेवलपर के बारे में क्या? उन्हें बस अनुमान लगाना होगा। इंटरफ़ेस की एक बहुत ही स्पष्ट भूमिका है, मुझे नहीं पता कि आपका मतलब क्या है 'वे एक हैक हैं'। PHP भी गतिशील है, और फिर भी इंटरफेस बहुत उपयोगी हैं। उदाहरण के लिए, आप ब्रिज पैटर्न को कैसे कार्यान्वित करेंगे? – HappyDeveloper

3

माणिक रूप duck-typed है, अलग से कोई इंटरफ़ेस जरूरत है, लेकिन वस्तुओं केवल सामान्य तरीके को लागू करने की जरूरत है। "क्लासिक" नीचे दिए गए उदाहरण को देखो:

class Duck 

    def move 
    "I can waddle." 
    end 

end 

class Bird 

    def move 
    "I can fly." 
    end 

end 

animals = [] 
animals << Duck.new 
animals << Bird.new 

animals.each do |animal| 
    puts animal.move 
end 

इस उदाहरण में, "इंटरफेस" move विधि, जो दोनों Duck और Bird वर्ग द्वारा कार्यान्वित किया जाता है।

+0

यहां मैं केवल दो कक्षाएं देख सकता हूं जिनमें उनके बीच कोई संबंध नहीं है। यह किसी अन्य भाषा से अलग कैसे है? अन्य भाषाओं में आप वही कर सकते हैं, और एक अनुबंध भी जोड़ सकते हैं (इंटरफ़ेस के माध्यम से), हालांकि यह अनिवार्य नहीं है – HappyDeveloper

+0

@ हैप्पी, अंतर यह है कि (अधिकतर) स्थैतिक रूप से टाइप की गई भाषाओं में आप "कनेक्ट" के लिए एक स्पष्ट इंटरफ़ेस का उपयोग करते हैं "दो वर्गों। –

+0

@WayneConrad मुझे पता है कि हम इस धागे में एक स्पष्ट इंटरफ़ेस के बिना ऐसा करने में सक्षम होने के फायदे और नुकसान के बारे में बात नहीं कर रहे हैं, लेकिन यह अच्छा होगा। वे तुरंत मेरे लिए स्पष्ट नहीं हैं। क्या आप विस्तार से समझा सकते हैं? – gabe

11

खैर, यह एक आम सहमति है कि यह टाइप-चेक नहीं किया गया एक वस्तु रूबी में पारित हो जाता है जब है। जावा और PHP में इंटरफेस पुष्टि करने के लिए है कि एक वस्तु एक निश्चित अनुबंध या "प्रकार" के अनुरूप है एक तरह से कर रहे हैं (ताकि कुछ Serializable, Authorizable, Sequential हो सकता है और हो सकता है और जो कुछ भी है कि आप चाहते हैं)।

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

उदाहरण के लिए, रूबी में कोई भी तरीका है कि एक आईओ वस्तु आप कुछ कुछ भी नहीं एक आईओ के साथ क्या करना है कि में फ़ीड सकता है, और फिर इसे एक त्रुटि या साथ विस्फोट कर दे उम्मीद के लिए - यदि आप अपने आईओ ठूंठ सही ढंग से लागू - यह आपके ठीक ऑब्जेक्ट को "आईओ-आईएसएच" घोषित नहीं किया गया है, भले ही यह ठीक काम करेगा।

इसके पीछे का विचार इस तथ्य से आता है कि रूबी में ऑब्जेक्ट्स वास्तव में हैश टेबल को उन पर थप्पड़ मारने वाले टैग के साथ महिमा नहीं कर रहे हैं (जिसके बाद कुछ अतिरिक्त टैग हैं जो दुभाषिया या संकलक को बताते हैं कि इस ऑब्जेक्ट में इंटरफ़ेस एक्स है इसलिए यह संदर्भ वाई में उपयोग किया जा सकता है) लेकिन संदेश के जवाब में एक संलग्न इकाई। तो एक वस्तु एक विशेष संदेश का जवाब अगर यह अनुबंध fullfils, और अगर यह उस संदेश का जवाब नहीं है - अच्छी तरह से तो एक त्रुटि उठाया है।

तो इंटरफेस की अनुपस्थिति को मॉड्यूल की उपस्थिति से आंशिक रूप से मुआवजा दिया जाता है (जिसमें कॉलर/उपभोक्ता को किसी प्रकार के वादे किए बिना आप कार्यक्षमता प्राप्त कर सकते हैं) और आंशिक रूप से संदेश-पास की परंपरा द्वारा टाइप किए गए dicts।

क्योंकि वह बड़े पैमाने पर इस विषय पर छू लेती है आप जिम वेइरिच से कुछ प्रस्तुतियों देखना चाहिए।

+0

धन्यवाद, जब मैं घर लेता हूं तो मैं उन्हें देखूंगा – HappyDeveloper

3

यह सवाल एक तरह से ओपन एंडेड है, लेकिन यहाँ मेरी ले रहा है:

  1. अपने भविष्य स्वयं या सहयोगियों क्या तरीकों को इस कक्षा में घोषित:

    एक अंतरफलक घोषणा के प्रयोजन के दो बातें है

  2. आपके कंप्यूटर के लिए घोषित क्या तरीकों इस वर्ग

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

तो पहले उद्देश्य पर वापस जाएं। कोड पठनीयता। यह समझ में आता है और इंटरफेस निर्दिष्ट करने के औपचारिक रूबी सम्मेलन सहायक हो सकता है। अभी के लिए, आप शायद टिप्पणियों या चश्मा का उपयोग करके इसे संवाद करेंगे या - जैसा कि मैं शायद पसंद करता हूं - एक घोषणात्मक मॉड्यूल समावेशन। जैसे

module Shippable 
# This is an interface module. If your class includes this module, make sure it responds to the following methods 

    # Returns an integer fixnum representing weight in grams 
    def weight 
    raise NotImplementedError.new 
    end 

    # Returns an instance of the Dimension class. 
    def dimensions 
    raise NotImplementedError.new 
    end 

    # Returns true if the entity requires special handling. 
    def dangerous? 
    raise NotImplementedError.new 
    end 

    # Returns true if the entity is intended for human consumption and thereby must abide by food shipping regulations. 
    def edible? 
    raise NotImplementedError.new 
    end 

end 

class Product 
    include Shippable 
end 

इस इंटरफेस को लागू करने के लिए एक युक्ति है कि हर वर्ग कि Shippable मॉड्यूल शामिल हैं का एक उदाहरण बनाता है, चार विधियों कॉल करता है और उम्मीद है उन्हें NotImplementedError बढ़ा नहीं करने के लिए बनाने के द्वारा किया जाएगा का एक तरीका है।

+0

बस एक नोट, आपको '.new' का उपयोग करके' NotImplementedErrors' को स्पष्ट रूप से तत्काल करने की आवश्यकता नहीं है - आप केवल 'लागू नहीं किया जा सकता है' और यह काम करेगा। – Russell

+0

जहां तक ​​मुझे पता है कि इंटरफेस परीक्षण उद्देश्यों के लिए अच्छे हैं, इसलिए परीक्षण के दौरान आपको सभी सेवाओं, प्रदाताओं आदि के वास्तविक कार्यान्वयन को इंजेक्ट करने की आवश्यकता नहीं है। मुझे पता है कि आप रूबी में परीक्षण के दौरान स्टब्स बनाने में सक्षम हैं, लेकिन आपको * याद रखना होगा * फिर उन सभी चीजों को नकल करने के लिए जिन्हें मजाक किया जाना चाहिए। लेकिन प्रोग्रामिंग में सामान "याद रखना" सॉफ्टवेयर लिखना अच्छी बात नहीं है, खासकर जब आप एक टीम में काम करते हैं। – cryss

2

मैं एक 'रूबी व्यक्ति' हूं, और मैं इंटरफेस, या उनके जैसे कुछ पसंद करूंगा।

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

जब मैं, इस समस्या का सामना करना पड़ रहा है यानी, जब मैं एक वर्ग या मॉड्यूल मैं उपवर्गों के लिए, मैं आमतौर पर तरीकों मैं उपवर्गों इस तरह प्रदान करने की उम्मीद दस्तावेज़ तरीकों प्रदान करने की उम्मीद लिख रहा हूँ:

module Enumerable 
    def each 
    raise NotImplementedError, "Subclasses must provide this method" 
    end 
end 

यह आदर्श नहीं है, लेकिन यह एक दुर्लभ मामला है और यह मेरे लिए काम करता है।

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

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