2010-07-30 29 views
8

कक्षाओं और उपाध्यक्षों के खिलाफ बंद होने के पेशेवरों और विपक्ष क्या हैं?बंद और पारंपरिक कक्षाओं के बीच क्या अंतर है?

संपादित करें: के रूप में उपयोगकर्ता फैसल कहते हैं, दोनों को बंद और कक्षाएं, तो बंद एक तरह से एक वस्तु उन्मुख कार्यात्मक भाषाओं का उपयोग रास्ते में कार्यक्रम प्रदान करते हैं "एक इकाई है कि रखता है और राज्य manipulates का वर्णन" के लिए इस्तेमाल किया जा सकता है। अधिकांश प्रोग्रामर की तरह, मैं कक्षाओं से अधिक परिचित हूं।

इस प्रश्न का उद्देश्य एक प्रोग्रामिंग प्रतिमान बेहतर है, या बंद होने और कक्षाएं पूरी तरह से समकक्ष हैं, या गरीब व्यक्ति के एक दूसरे के बारे में एक और लौ युद्ध नहीं खोलना है।

मैं क्या जानना चाहता हूं कि अगर कोई व्यक्ति एक दृष्टिकोण में एक परिदृश्य पाता है तो वास्तव में दूसरे को धड़कता है, और क्यों।

+1

एक भाषा-नास्तिक तरीके से इस का उत्तर देना, बहुत, बहुत कठिन है। – zneak

उत्तर

9

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

सी ++ क्लोजर में वाक्य रचनात्मक रूप से उपलब्ध नहीं हैं, इसलिए आपको "मज़ेदार" के साथ जाने के लिए मजबूर होना पड़ता है, जो operator() को ओवरराइड करते हैं और किसी फ़ंक्शन कॉल की तरह दिखने वाले तरीकों से बुलाया जा सकता है।

जावा में आप भी, functors नहीं तो आप आगंतुक पैटर्न है, जो सिर्फ एक भाषा है कि बंद का समर्थन करता है में एक उच्च आदेश समारोह होगा जैसी चीजों मिलता है।

मानक योजना आप वस्तुओं की सुविधा नहीं है, तो कभी कभी आप एक प्रेषण समारोह के साथ एक बंद लेखन, भेजे मापदंडों के आधार पर विभिन्न उप-बंद को क्रियान्वित करते हुए उन्हें लागू करने अंत।

पायथन जैसी भाषा में, जिसमें सिंटैक्स में दोनों मज़ेदार और बंद होते हैं, यह मूल रूप से स्वाद का विषय है और जो आप महसूस करते हैं वह व्यक्त करने का बेहतर तरीका है।

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

2

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

उदाहरण के लिए निम्नलिखित सी # कोड को देखो:

static void Main(String[] args) 
{ 
    int i = 4; 
    var myDelegate = delegate() 
    { 
     i = 5; 
    } 

    Console.WriteLine(i); 
    myDelegate(); 
    Console.WriteLine(i); 
} 

इससे "4" तो "5"। myDelegate, एक प्रतिनिधि होने के नाते, एक बंद है और वर्तमान में फ़ंक्शन द्वारा उपयोग किए जाने वाले सभी चर के बारे में जानता है। इसलिए, जब मैं इसे कॉल करता हूं, तो इसे के मान को "पैरेंट" फ़ंक्शन के अंदर बदलने की अनुमति है। सामान्य कार्य के लिए इसकी अनुमति नहीं दी जाएगी।

कक्षाएं, यदि आप जानते हैं कि वे क्या हैं, तो पूरी तरह से अलग हैं।

आपके भ्रम का एक संभावित कारण यह है कि जब किसी भाषा के पास बंद होने के लिए कोई भाषा समर्थन नहीं होता है, तो उन वर्गों का उपयोग करके उन्हें अनुकरण करना संभव है जो हर चर को पकड़ने के लिए आवश्यक हैं। उदाहरण के लिए, हम इस तरह उपरोक्त कोड को फिर से लिखने सकता है:

class MainClosure() 
{ 
    public int i; 

    void Apply() 
    { 
     i = 5; 
    } 
} 

static void Main(String[] args) 
{ 
    MainClosure closure; 
    closure.i = 4; 

    Console.WriteLine(closure.i); 
    closure.Apply(); 
    Console.WriteLine(closure.i); 
} 

हम एक वर्ग है कि हम MainClosure बुलाया गया है करने के लिए delegate तब्दील कर दिया है। Main फ़ंक्शन के अंदर परिवर्तनीय i बनाने के बजाय, हमने MainClosure ऑब्जेक्ट बनाया है, जिसमें i फ़ील्ड है। यह वह है जिसे हम उपयोग करेंगे। साथ ही, हमने विधि को अंदरूनी विधि के अंदर फ़ंक्शन निष्पादित किया है, विधि के अंदर।

जैसा कि आप देख सकते हैं, भले ही यह एक आसान उदाहरण था (केवल एक चर), यह काफी अधिक काम है। एक संदर्भ में जहां आप बंद करना चाहते हैं, वस्तुओं का उपयोग करना एक खराब समाधान है। हालांकि, कक्षाएं न केवल बंद करने के लिए उपयोगी हैं, और उनका सामान्य उद्देश्य आमतौर पर बहुत अलग है।

+1

मैंने वही सोचा, लेकिन जाहिर है कि बंद या वस्तुएं अधिक अभिव्यक्तिपूर्ण हैं या नहीं, इस बारे में काफी बहस है। मुझे आपको चर्चा का एक स्वाद देने दो: http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg03277.html – Faisal

+0

मेरी समझ के अनुसार, आप बंद करने के माध्यम से वस्तुओं को कार्यान्वित कर सकते हैं , और आप वस्तुओं के माध्यम से एक बिंदु तक बंद अनुकरण कर सकते हैं। हालांकि, ऑब्जेक्ट्स सामान्य रूप से स्थानीय वातावरण को स्वचालित रूप से कैप्चर नहीं करते हैं, इसलिए आपको उन्हें स्पष्ट रूप से प्रारंभ करना होगा ... लेकिन @ जेनक सही है: आखिरकार वे दो अलग-अलग उद्देश्यों की सेवा करते हैं, और दोनों चाहते हैं कि यह अनुचित नहीं है। – Amadan

+0

@ फैसल: मेरा मानना ​​है कि यह बहस क्लोजर बनाम स्पष्ट रूप से बंद करने के बारे में है, एक क्लोजर अनुकरण करने के लिए एक वर्ग बनाना, जिस स्थिति में "पूर्ण" बंद होने की संभावना स्पष्ट रूप से अधिक सुविधाजनक है। – zneak

4

व्यक्तिगत रूप से, मुझे लगता है कि इस काम के लिए सही उपकरण का उपयोग कर ... और विशेष रूप से, ठीक से अपने इरादे संवाद स्थापित करने की की बात है।

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

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

वास्तव में पूछने के लिए धन्यवाद; मैं घुटने-झटके के साथ जवाब दूंगा "वर्ग और बंद पूरी तरह से अलग हैं!" पहले दृष्टिकोण, लेकिन कुछ शोध के साथ मुझे एहसास हुआ कि समस्या लगभग कटौती और सूखी नहीं है जैसा मैंने सोचा था। क्योंकि सबसे सुविधाजनक एक लगभग जरूरी जिस भाषा का उपयोग से निर्धारित होता है

+0

दूसरे शब्दों में, अधिकांश ओओपी भाषाओं में बंद-के-ऑब्जेक्ट्स * इंटरफेस * की तरह हैं - आंतरिक प्रतिनिधित्व पूरी तरह छुपा हुआ है, और कुछ भी सार्वजनिक विधियों को प्रदान करने में कुछ भी बदला जा सकता है। कुछ लोग वास्तव में सोचते हैं कि यह बेहतर ओओपी शैली है , मनोरंजक ... –

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