एपीआई और कार्यात्मक प्रोग्रामिंग


15

कार्यात्मक प्रोग्रामिंग भाषाओं, जैसे क्लोजर के लिए मेरे (संयुक्त रूप से सीमित) जोखिम से, ऐसा लगता है कि डेटा के इनकैप्सुलेशन की कम महत्वपूर्ण भूमिका है। आमतौर पर विभिन्न देशी प्रकार जैसे कि नक्शे या सेट वस्तुओं पर डेटा का प्रतिनिधित्व करने की पसंदीदा मुद्रा है। इसके अलावा, वह डेटा आमतौर पर अपरिवर्तनीय है।

उदाहरण के लिए, इस मामले के बारे में एक साक्षात्कार में क्लोजुरे के रिच हिकी से अधिक प्रसिद्ध उद्धरणों में से एक है :

फोगस: उस विचार के बाद — कुछ लोग इस तथ्य से आश्चर्यचकित हैं कि क्लोजर अपने प्रकारों के डेटा-छिपने के इनकैप्सुलेशन में संलग्न नहीं है। आपने डेटा छिपाने का फैसला क्यों किया?

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

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

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

कार्यात्मक कोडबेस इन मुद्दों को कैसे संबोधित करते हैं जो तब आते हैं जब कोडबेस का आकार इतना बड़ा हो जाता है कि एपीआई को परिभाषित करने की आवश्यकता होती है और सिस्टम के विशिष्ट भागों के साथ काम करने पर बहुत सारे डेवलपर्स शामिल होते हैं? क्या इस स्थिति के उदाहरण उपलब्ध हैं जो प्रदर्शित करते हैं कि इस प्रकार के कोडबेस में इसे कैसे नियंत्रित किया जाता है?


2
आप वस्तुओं की धारणा के बिना एक औपचारिक इंटरफ़ेस को परिभाषित कर सकते हैं। बस उन्हें प्रलेखित इंटरफ़ेस का कार्य बनाएँ। कार्यान्वयन विवरण के लिए दस्तावेज़ प्रदान न करें। आपने अभी एक इंटरफ़ेस बनाया है।
Scara95

@ Scara95 का मतलब यह नहीं है कि मैं एक इंटरफ़ेस के लिए कोड को लागू करने के लिए दोनों काम करने जा रहा हूं और इसके बारे में पर्याप्त दस्तावेज लिखकर उपभोक्ता को चेतावनी दे सकता हूं कि क्या करना है और क्या नहीं करना है? क्या होगा अगर कोड बदल जाता है और प्रलेखन बासी हो जाता है? मैं आमतौर पर इस कारण से स्व-दस्तावेजीकरण कोड पसंद करता हूं।
jameslk

आपको वैसे भी इंटरफ़ेस दस्तावेज़ करना होगा।
Scara95

3
Also, strictly immutable data seems to make passing around domain-specific structures (objects, structs, records) much less useful in the sense of representing a state and the set of actions that can be performed on that state.ज़रुरी नहीं। केवल एक चीज जो बदलती है वह यह है कि परिवर्तन एक नई वस्तु पर समाप्त होते हैं। यह एक बड़ी जीत है जब यह कोड के बारे में तर्क करने की बात आती है; चारों ओर उत्परिवर्तनीय वस्तुओं को पारित करने का अर्थ है कि जो उन्हें बदल सकता है, एक समस्या है जो कोड के आकार के साथ स्केल करता है।
डोभाल

जवाबों:


10

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

जैसा कि बेसिल का उल्लेख है, एक्सेस कंट्रोल की अवधारणा एमएल / हास्केल में मौजूद है, और अक्सर इसका उपयोग किया जाता है। "फैक्टरिंग" पारंपरिक ओओपी भाषाओं से थोड़ा अलग है; OOP में एक वर्ग की अवधारणा एक साथ प्रकार और मॉड्यूल की भूमिका निभाती है , जबकि कार्यात्मक (और पारंपरिक प्रक्रियात्मक) भाषाएं इन मौखिक रूप से व्यवहार करती हैं।

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

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

अंतिम और सबसे लंबा: एनकैप्सुलेशन / सूचना छिपाना एक तकनीक है , अंत नहीं। आइए थोड़ा विचार करें कि यह क्या प्रदान करता है। एनकैप्सुलेशन अनुबंध को समेटने और एक सॉफ्टवेयर इकाई के कार्यान्वयन के लिए एक तकनीक है । सामान्य स्थिति यह है: सिस्टम का कार्यान्वयन उन मूल्यों या स्थितियों को स्वीकार करता है जो अपने अनुबंध के अनुसार मौजूद नहीं होना चाहिए।

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

  1. व्यापक डिफ़ॉल्ट के रूप में अपरिवर्तनीयता। आप पारदर्शी डेटा मूल्यों को थर्ड पार्टी कोड को सौंप सकते हैं। वे उन्हें संशोधित नहीं कर सकते और उन्हें अमान्य स्थिति में डाल सकते हैं। (कार्ल का जवाब यह बात बताता है।)
  2. बीजीय डेटा प्रकारों के साथ परिष्कृत प्रकार की प्रणालियां जो आपको बहुत सारे कोड लिखे बिना, अपने प्रकार की संरचना को सूक्ष्मता से नियंत्रित करने की अनुमति देती हैं। विवेकपूर्ण रूप से इन सुविधाओं का उपयोग करके आप अक्सर उन प्रकारों को डिज़ाइन कर सकते हैं जहां "खराब स्थिति" असंभव है। (नारा: "गैरकानूनी राज्यों को अप्राप्य बनाओ।" ) अप्रत्यक्ष रूप से एक वर्ग के स्वीकार्य राज्यों के सेट को नियंत्रित करने के लिए एनकैप्सुलेशन का उपयोग करने के बजाय, मैं सिर्फ संकलक को बताऊंगा कि वे क्या हैं और यह उनके लिए मेरे लिए गारंटी है!
  3. दुभाषिया पैटर्न, जैसा कि पहले ही उल्लेख किया गया है। एक अच्छा सार वाक्यविन्यास पेड़ के प्रकार डिजाइन करने के लिए एक कुंजी है:
    • अमूर्त सिंटैक्स ट्री डेटा प्रकार को आज़माएं और डिज़ाइन करें ताकि सभी मान "मान्य" हों।
    • असफल होने पर, दुभाषिया स्पष्ट रूप से अमान्य संयोजनों का पता लगाता है और उन्हें अस्वीकार करता है।

यह F # "प्रकारों के साथ डिजाइनिंग" श्रृंखला इन विषयों में से कुछ, विशेष रूप से # 2 पर बहुत अच्छे पढ़ने के लिए बनाता है। (यह वह जगह है जहां ऊपर से "अवैध राज्यों को अप्राप्य बनाते हैं" लिंक आता है।) यदि आप बारीकी से देखते हैं, तो आप ध्यान देंगे कि दूसरे भाग में वे प्रदर्शित करते हैं कि निर्माणकर्ताओं को छिपाने के लिए एन्कैप्सुलेशन का उपयोग कैसे किया जाए और ग्राहकों को अवैध इंस्टेंसेस के निर्माण से रोका जाए। जैसा कि मैंने ऊपर कहा, यह टूलकिट का हिस्सा है!


9

मैं वास्तव में उस हद तक ओवरस्टैट नहीं कर सकता, जिसके कारण सॉफ्टवेयर में परिवर्तनशीलता समस्या पैदा करती है। उत्परिवर्तन का कारण बनने वाली समस्याओं के मुआवजे में कई अभ्यास हमारे सिर में ढाले जाते हैं। जब आप उत्परिवर्तन को दूर ले जाते हैं, तो आपको उन प्रथाओं की उतनी आवश्यकता नहीं होती है।

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

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


एक बात मैं जोड़ना चाहूंगा कि अपरिवर्तनीय चर कारण प्रोग्रामर वितरित और बिखरे हुए डेटा संरचना से चिपके रहते हैं, अगर कोई संरचना है। सभी डेटा को एक तर्क समूह बनाने के लिए संरचित किया जाता है, आसान खोज और ट्रैवर्सिंग के लिए, परिवहन के लिए नहीं। यह एक तर्क प्रगति है जिसे आप पर्याप्त कार्यात्मक प्रोग्रामिंग करने के बाद बना लेंगे।
Xephon

8

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

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


सांख्यिकीय रूप से टाइप की गई, (विशुद्ध रूप से) कार्यात्मक भाषाओं में, OO प्रोग्रामिंग की तरह डेटाटाइप के साथ एक फंक्शन ले जाने का कोई (सरल) तरीका नहीं है। वैसे भी प्रलेखन मामला। मुद्दा यह है कि आपको इंटरफ़ेस को परिभाषित करने के लिए भाषा के समर्थन की आवश्यकता नहीं है।
स्कार 95

5
@ Scara95 क्या आप विस्तार से बता सकते हैं कि "एक फंतासी के साथ एक समारोह" का क्या मतलब है?
सेबेस्टियन रेडल

6

कुछ कार्यात्मक भाषाएं सार डेटा प्रकारों और मॉड्यूलों में कार्यान्वयन विवरणों को इनकैप्सुलेट करने या छिपाने की क्षमता देती हैं ।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.