मेरा मानना है कि मैंने जावास्क्रिप्ट में कार्यात्मक प्रोग्रामिंग अंतर्निहित कुछ बुनियादी अवधारणाओं को सीखा है। हालाँकि, मुझे विशेष रूप से कार्यात्मक कोड, यहां तक कि कोड मैंने लिखा है, पढ़ने में परेशानी होती है, और आश्चर्य होता है कि क्या कोई मुझे कोई संकेत, सुझाव, सर्वोत्तम अभ्यास, शब्दावली आदि दे सकता है जो मदद कर सकता है।
नीचे दिए गए कोड को लें। मैंने यह कोड लिखा था। इसका उद्देश्य दो वस्तुओं के बीच, कहने {a:1, b:2, c:3, d:3}
और के बीच एक प्रतिशत समानता को निर्दिष्ट करना है {a:1, b:1, e:2, f:2, g:3, h:5}
। मैंने स्टैक ओवरफ्लो पर इस सवाल के जवाब में कोड का उत्पादन किया । क्योंकि मुझे यकीन नहीं था कि पोस्टर किस तरह की प्रतिशतता के बारे में पूछ रहा था, मैंने चार अलग-अलग प्रकार प्रदान किए:
- पहली वस्तु में प्रतिशत का प्रतिशत जो 2 में पाया जा सकता है,
- 1 वस्तु में प्रतिशत का मान जो डुप्लिकेट सहित 2 में पाया जा सकता है,
- 1 ऑब्जेक्ट में मानों का प्रतिशत 2 में पाया जा सकता है, जिसकी कोई डुप्लिकेट अनुमति नहीं है, और
- 1 ऑब्जेक्ट में {key: value} जोड़े का प्रतिशत जो 2 ऑब्जेक्ट में पाया जा सकता है।
मैंने यथोचित अनिवार्यता कोड के साथ शुरुआत की, लेकिन जल्दी ही एहसास हुआ कि यह कार्यात्मक प्रोग्रामिंग के लिए अच्छी तरह से अनुकूल एक समस्या थी। विशेष रूप से, मुझे एहसास हुआ कि यदि मैं उपरोक्त चार रणनीतियों में से प्रत्येक के लिए एक फ़ंक्शन या तीन निकाल सकता हूं, जो कि जिस प्रकार की विशेषता की तुलना करना चाहता था, उसे परिभाषित करता हूं (जैसे चाबियाँ, या मान आदि), तो मैं हो सकता हूं कम करने में सक्षम (शब्दों पर नाटक को क्षमा करें) कोड के बाकी को दोहराने योग्य इकाइयों में। तुम्हें पता है, यह DRY रखते हुए। इसलिए मैंने कार्यात्मक प्रोग्रामिंग पर स्विच किया। मुझे परिणाम पर बहुत गर्व है, मुझे लगता है कि यह काफी हद तक सुरुचिपूर्ण है, और मुझे लगता है कि मैं समझता हूं कि मैंने काफी अच्छा किया।
हालांकि, यहां तक कि कोड को स्वयं लिखा जाना और निर्माण के दौरान उसके हर हिस्से को समझना, जब मैं अब उस पर पीछे मुड़कर देखता हूं, तो मैं दोनों पर थोड़ा चकित होना चाहता हूं कि किसी भी विशेष पंक्ति को कैसे पढ़ना है, साथ ही साथ कैसे करें "ग्रॉक" कोड की कोई विशेष अर्ध-रेखा वास्तव में क्या कर रही है। मैं खुद को अलग-अलग हिस्सों को जोड़ने के लिए मानसिक तीर बनाता हूं जो जल्दी से स्पेगेटी की गड़बड़ी में बदल जाता है।
तो, क्या कोई मुझे बता सकता है कि कोड के कुछ और अधिक जटिल बिट्स को कैसे "पढ़ना" है जो संक्षिप्त है और जो मैं पढ़ रहा हूं उसकी मेरी समझ में योगदान देता है? मैं उन हिस्सों का अनुमान लगाता हूं जो मुझे सबसे अधिक मिलते हैं, वे हैं जो एक पंक्ति में कई वसा वाले तीर हैं और / या कुछ भागों में एक पंक्ति में कई कोष्ठक हैं। फिर, उनके मूल में, मैं अंततः तर्क का पता लगा सकता हूं, लेकिन (मुझे उम्मीद है) कार्यात्मक जावास्क्रिप्ट प्रोग्रामिंग की एक पंक्ति में जल्दी और स्पष्ट रूप से और सीधे "लेने" का एक बेहतर तरीका है।
नीचे से कोड की किसी भी लाइन का उपयोग करने के लिए स्वतंत्र महसूस करें, या अन्य उदाहरण भी। हालाँकि, यदि आप मुझसे कुछ प्रारंभिक सुझाव चाहते हैं, तो यहाँ कुछ हैं। यथोचित सरल से शुरुआत करें। कोड के अंत के पास से, यह एक फ़ंक्शन के पैरामीटर के रूप में पारित किया गया है obj => key => obj[key]
:। कोई इसे कैसे पढ़ और समझ सकता है? एक लंबा उदाहरण शुरुआत के पास से एक पूर्ण कार्य है const getXs = (obj, getX) => Object.keys(obj).map(key => getX(obj)(key));
:। अंतिम map
भाग मुझे विशेष रूप से मिलता है।
कृपया ध्यान दें, समय में इस बिंदु पर मैं कर रहा हूँ नहीं आदि हास्केल के संदर्भ या प्रतीकात्मक सार अंकन या currying की बुनियादी बातों में, की तलाश में मैं क्या कर रहा हूँ की तलाश में है कि मैं चुपचाप मुंह, जबकि कोड की एक पंक्ति को देख सकते हैं अंग्रेजी वाक्य है। यदि आपके पास ऐसे संदर्भ हैं जो विशेष रूप से ठीक उसी तरह से संबोधित करते हैं, तो महान, लेकिन मैं उन उत्तरों की तलाश में नहीं हूं जो कहते हैं कि मुझे कुछ बुनियादी पाठ्यपुस्तकों को पढ़ना चाहिए। मैंने ऐसा किया है और मुझे तर्क कम से कम (एक महत्वपूर्ण मात्रा में) मिलता है। यह भी ध्यान दें, मुझे संपूर्ण उत्तरों की आवश्यकता नहीं है (हालाँकि इस तरह के प्रयासों का स्वागत किया जाएगा): यहां तक कि थोड़े से उत्तर जो किसी विशेष पंक्ति को पढ़ने का एक सुरुचिपूर्ण तरीका प्रदान करते हैं अन्यथा परेशान कोड की सराहना की जाएगी।
मुझे लगता है कि इस सवाल का एक हिस्सा यह है: क्या मैं कार्यात्मक कोड को रैखिक रूप से भी पढ़ सकता हूं, आप जानते हैं, बाएं से दाएं और ऊपर से नीचे? या कोड के पृष्ठ पर स्पेगेटी की तरह वायरिंग की मानसिक तस्वीर बनाने के लिए एक बहुत मजबूर है जो निश्चित रूप से रैखिक नहीं है ? और अगर किसी को ऐसा करना चाहिए , तो हमें अभी भी कोड पढ़ना है, तो हम रैखिक पाठ कैसे लेते हैं और स्पेगेटी को तार करते हैं?
किसी भी युक्तियां की सराहना की जाएगी।
const obj1 = { a:1, b:2, c:3, d:3 };
const obj2 = { a:1, b:1, e:2, f:2, g:3, h:5 };
// x or X is key or value or key/value pair
const getXs = (obj, getX) =>
Object.keys(obj).map(key => getX(obj)(key));
const getPctSameXs = (getX, filter = vals => vals) =>
(objA, objB) =>
filter(getXs(objB, getX))
.reduce(
(numSame, x) =>
getXs(objA, getX).indexOf(x) > -1 ? numSame + 1 : numSame,
0
) / Object.keys(objA).length * 100;
const pctSameKeys = getPctSameXs(obj => key => key);
const pctSameValsDups = getPctSameXs(obj => key => obj[key]);
const pctSameValsNoDups = getPctSameXs(obj => key => obj[key], vals => [...new Set(vals)]);
const pctSameProps = getPctSameXs(obj => key => JSON.stringify( {[key]: obj[key]} ));
console.log('obj1:', JSON.stringify(obj1));
console.log('obj2:', JSON.stringify(obj2));
console.log('% same keys: ', pctSameKeys (obj1, obj2));
console.log('% same values, incl duplicates:', pctSameValsDups (obj1, obj2));
console.log('% same values, no duplicates: ', pctSameValsNoDups(obj1, obj2));
console.log('% same properties (k/v pairs): ', pctSameProps (obj1, obj2));
// output:
// obj1: {"a":1,"b":2,"c":3,"d":3}
// obj2: {"a":1,"b":1,"e":2,"f":2,"g":3,"h":5}
// % same keys: 50
// % same values, incl duplicates: 125
// % same values, no duplicates: 75
// % same properties (k/v pairs): 25