"मिश्रित" भाषाओं में डिज़ाइन: ऑब्जेक्ट ओरिएंटेड डिज़ाइन या फ़ंक्शनल प्रोग्रामिंग?


11

पिछले कुछ वर्षों में, मैं जिन भाषाओं का उपयोग करना चाहता हूं, वे अधिक से अधिक "कार्यात्मक" हो रही हैं। अब मैं उन भाषाओं का उपयोग करता हूं जो "हाइब्रिड" का एक प्रकार हैं: C #, F #, Scala। मैं अपने एप्लिकेशन को उन कक्षाओं का उपयोग करके डिज़ाइन करना पसंद करता हूं जो डोमेन ऑब्जेक्ट्स के अनुरूप हैं, और कार्यात्मक सुविधाओं का उपयोग करते हैं जहां यह कोडिंग को आसान बनाता है, अधिक संयोग और सुरक्षित (विशेषकर जब संग्रह पर काम कर रहा है या जब फ़ंक्शन गुजर रहा है)।

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

मैंने शुरू में इसे इस तरह "कार्यात्मक" किया था:

producer.foo(item => { updateItemInDb(item); insertLog(item) })
// calls the function passed as argument as an item is processed

लेकिन मैं अब सोच रहा हूं कि क्या मुझे "ओओ" दृष्टिकोण का उपयोग करना चाहिए:

interface IItemObserver {
  onNotify(Item)
}
class DBObserver : IItemObserver ...
class LogObserver: IItemObserver ...

producer.addObserver(new DBObserver)
producer.addObserver(new LogObserver)
producer.foo() //calls observer in a loop

दोनों दृष्टिकोण के समर्थक और चुनाव कौन से हैं? मैंने एक बार एक एफपी गुरु को यह कहते सुना कि डिजाइन पैटर्न केवल भाषा की सीमाओं के कारण हैं, और इसीलिए कार्यात्मक भाषाओं में बहुत कम हैं। शायद यह इसका एक उदाहरण हो सकता है?

संपादित करें: मेरे विशेष परिदृश्य में मुझे इसकी आवश्यकता नहीं है, लेकिन .. आप कार्यात्मक तरीके से "पर्यवेक्षकों" को हटाने और इसके अलावा कैसे लागू करेंगे? (यानी आप पैटर्न में सभी कार्यक्षमताओं को कैसे लागू करेंगे?) उदाहरण के लिए, एक नया फ़ंक्शन पास करना।


अभिनेताओं के बारे में क्या?
किरित्सुकु

कक्षाओं और सभी कि बेकार सामान के बारे में भूल जाओ। आप इसके बजाय मॉड्यूल के संदर्भ में बेहतर सोचेंगे (SML और OCaml भाषाओं को एक प्रेरणा के लिए देखें)।
एसके-लॉजिक

@ अंटोरस यदि आप अभिनेताओं के आधार पर एक दृष्टिकोण के साथ तुलना कर सकते हैं, तो यह अधिक स्वागत योग्य होगा :)
लोरेंजो डेमेटे

2
@ dema80, OCaml पूरी तरह से बहु-प्रतिमान है। मॉड्यूल कार्यात्मक प्रोग्रामिंग से संबंधित नहीं हैं। उदाहरण के लिए, विशुद्ध रूप से अत्यावश्यक अडा में एक उन्नत मॉड्यूल प्रणाली है। और सभी प्रसिद्धि OOP को वास्तव में मॉड्यूल पर जाना चाहिए - ओओपी में सभी अच्छे मॉड्यूल कार्यक्षमता का अनुकरण करने के सिर्फ विभिन्न रूप हैं। आप पूरी तरह से उन सभी वर्गों को भूल सकते हैं और मॉड्यूल के बजाय व्यक्त करने के लिए अपने सिंटैक्स का उपयोग कर सकते हैं, मॉड्यूल के संदर्भ में सोच सकते हैं, ओओपी नहीं। Btw।, यह बिल्कुल वही है जो माइक्रोसॉफ्ट ने अपने mscorlib के साथ किया था - वहां बहुत OOP नहीं, बस मॉड्यूल और नेमस्पेस।
SK- तर्क

1
मुझे लगता है कि बेहतर सवाल यह है कि "क्या कोई स्पष्टता या संगठन है जिसे आप एफपी तरीके से खो देते हैं?"
djechlin

जवाबों:


0

यह दो अलग-अलग दृष्टिकोणों का एक अच्छा उदाहरण है जो कॉलिंग ऑब्जेक्ट के लिए चिंता की सीमा के बाहर एक कार्य करने की धारणा को आगे बढ़ाते हैं।

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

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


मुझे लगता है कि यह जवाब थोड़ा गुमराह करने वाला है। फ़ंक्शनल प्रोग्रामिंग प्रोग्रामिंग (केवल के साथ) कार्य नहीं है। फंक्शनल प्रोग्रामिंग एब्स्ट्रक्शन का भी उपयोग करता है, इसलिए यहां कोई द्विभाजन नहीं है।
डोभाल

"कंपोज़िशन या इनहेरिटेंस, जहाँ आपको मौजूदा व्यवहार को फिर से इस्तेमाल करने और विस्तारित करने की थोड़ी अधिक स्वतंत्रता होगी" आप इस तरह से बोल रहे हैं जैसे कि शुद्ध एफपी के मूल लाभों में से एक ISN'T। मॉड्यूलरिटी, कंपोजिटिबिलिटी और रीससबिलिटी स्वाभाविक रूप से तब होती है जब आप कार्यात्मक रूप से कोड करते हैं, यह "OOP चीज" नहीं है
सारा

@ FilipDupanović मैं मौजूदा कोड का पुन: उपयोग और विस्तार करने का उल्लेख कर रहा था। सभी प्रोग्रामिंग में शुद्ध कार्य संभवतः सबसे अधिक कंपोजिटिव चीजें हैं। जैसा कि आप एक शुद्ध कार्यात्मक वातावरण में जटिलता का प्रबंधन नहीं कर सकते हैं लिखा है। सरल भागों को बड़े लेकिन फिर भी सरल और अपारदर्शी भागों की रचना करके जटिलता को प्रबंधित करना एफपी का मुख्य हिस्सा है, और कई लोग यह तर्क देंगे कि यह OOP की तुलना में बेहतर है। मैं "फंक्शनल वन-लाइनर्स के बीच के डिचोटॉमी से सहमत नहीं हूं, जो वीएस सॉलिड ओओपी को स्केल नहीं करता है जो आपको कोई समस्या नहीं देता है"।
सारा

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

5

कार्यात्मक संस्करण बहुत छोटा है, बनाए रखने में आसान है, पढ़ने में आसान है, और आम तौर पर, हर सम्मान के बारे में कल्पना के रूप में बहुत बेहतर है।

Many- हालांकि, सब पैटर्न से दूर कर रहे हैं इस तरह के पर्यवेक्षकों के रूप में OOP में सुविधाओं, की कमी के लिए बनाने के लिए। वे कार्यात्मक रूप से बेहतर मॉडलिंग करते हैं।


मैं सहमत हूं और समान भावना है।
लोरेंजो डेमेटे

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

5

आपका "एफपी गुरु" आंशिक रूप से सही है; कई ओओ पैटर्न कार्यात्मक चीजें करने के लिए हैक होते हैं। (उनका दावा है कि यही कारण है कि कुछ एफपी भाषाएँ सबसे अच्छी लगती हैं।) ऑब्जर्वर और रणनीति पैटर्न प्रथम श्रेणी के कार्यों का अनुकरण करने की कोशिश कर रहे हैं। विज़िटर पैटर्न, पैटर्न मिलान का अनुकरण करने के लिए एक हैक है। आपका IItemObserverभेस में सिर्फ एक समारोह है। बहाना यह किसी भी अन्य समारोह से अलग है जो एक आइटम लेता है वह आपको कुछ भी नहीं खरीदता है।

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


+1 (IMO) के लिए एक अच्छा जवाब। इसके अलावा, कागज के लिंक के लिए धन्यवाद: मैंने इसे कुछ समय पहले पढ़ा था और फिर इसे खो दिया था। अब मैंने इसे फिर से पा लिया है।
जियोर्जियो

-1

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

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


1
"आप कर सकते हैं, बहुत देखभाल के साथ, एक पूरे कार्यक्रम को लिखें जिसमें कोई भी राज्य नहीं है, एफपी की नकल करें।", ज़ाहिर है, और अनुशासन के माध्यम से आप अनिवार्य भाषाओं में भी ऐसा कर सकते हैं। :) सामान्य तौर पर, मैं डिज़ाइन पेटेंट्स के बारे में नहीं सोचता कि कुछ सीमाएँ
बनती

इसके अलावा, मुझे इस कोड से कोई सरोकार नहीं है: हालाँकि, मैं दृष्टिकोण पर साथी प्रोग्रामरों के साथ भिड़ना चाहूँगा (मेरी समझ में, यह प्रोग्रामर है। इसके लिए है, अन्यथा मैं एसओ पर अपना क्यू पोस्ट कर देता)
लोरेंजो डेमेटे

हर बार जब आप दोहराए जाने वाले पैटर्न को खोलते हैं, तो यह आपकी भाषा और मॉडलिंग ढांचे की गंभीर सीमा का संकेत नहीं है। एक आदर्श दुनिया में कोई पैटर्न नहीं होगा।
SK-लॉजिक

@ एसके-तर्क: दुर्भाग्य से दुनिया आदर्श नहीं है, और वास्तविक दुनिया में पैटर्न हैं। यही कारण है कि OO भाषाओं में वंशानुक्रम है, पुन: प्रयोज्य कोड को लागू करने के लिए बिना उन्हें फिर से लिखना। सभी विश्व वस्तु एक राज्य है, यही कारण है कि एक राज्य पैटर्न है
DPD

1
@ एसके-तर्क: मैं अच्छी तरह से जानता हूं कि कुछ भाषाएं प्रोग्राम करने योग्य हैं, और कुछ प्रकार के सिस्टम से प्रभावों को लागू करने की भी अनुमति देते हैं। मेरा कहना है कि, "ओओपी" की तरह, "पैटर्न" एक गलत तरीके से गलत समझा गया शब्द है। एक पैटर्न कुछ ऐसा है जो समान लेकिन अलग-अलग रूपों में फिर से दिखाई देता है , जो एक समान समाधान को स्वीकार नहीं करता है । कभी-कभी आप उन quasirepetitions को गायब कर सकते हैं - मल्टीमिथोड विजिटर / डबल प्रेषण को बेमानी बनाते हैं। इसका मतलब यह नहीं है कि "सभी पैटर्न एक कमी के संकेत हैं", क्योंकि इसका मतलब है कि वास्तविक दुनिया की कमी है। पैटर्न की उत्पत्ति वास्तुकला में हुई , न कि सॉफ्टवेयर में।
फ्रैंक शायर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.