"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > [रोस्ट: दिन - मेरा `उपयोग' फ़ोल्डर

[रोस्ट: दिन - मेरा `उपयोग' फ़ोल्डर

2024-08-27 को प्रकाशित
ब्राउज़ करें:996

[Roast: Day  - My `utils` Folder

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

यूटिल्स फ़ोल्डर क्या है?

यह वह निर्देशिका है जहां आप अपने सभी छोटे कार्यों को डालते हैं जिनके लिए घर ढूंढना कठिन होता है, लेकिन आपका एप्लिकेशन उनके बिना नहीं रह सकता।

एक यूटिल्स फ़ोल्डर कई अनुप्रयोगों के अज्ञात नायकों के लिए डंपिंग ग्राउंड है।

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

हम सिर्फ कॉपी पेस्ट क्यों नहीं करते? खैर, यह दो प्रोग्रामिंग सिद्धांतों, DRY और चिंताओं को अलग करने का उल्लंघन होगा।

अपने आप को मत दोहराओ

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

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

अपने कोड के पुन: उपयोग किए गए हिस्सों को लें, और उन्हें एक ही स्थान पर अपडेट किए जाने के साथ-साथ कई स्थानों पर उपयोग करने के लिए पैकेज करने के तरीके ढूंढें।

मेरे यूटिल्स फ़ोल्डर के सभी फ़ंक्शन मेरे पूरे एप्लिकेशन में कई स्थानों पर उपयोग किए जाते हैं!

चिंताओ का विभाजन

प्रोग्रामर के रूप में, हम ऐसे फ़ंक्शन भी नहीं बनाना चाहते जो बहुत सारी अलग-अलग चीज़ें करते हों। हम चाहेंगे कि हमारे पास बहुत सारे कार्य हों जो सभी एक ही काम करें। क्यों? खैर, यह इन कार्यों को और अधिक पुन: प्रयोज्य बनाता है!

इसका यूटिल्स फ़ोल्डर से क्या लेना-देना है? खैर, मैं जिन फ़ंक्शंस पर चर्चा करने जा रहा हूं, उनका वास्तव में getRoastsById जैसे फ़ंक्शंस में कोई स्थान नहीं है क्योंकि वे ऐसा नहीं करते हैं! जब हमें कुछ और करने की जरूरत हो तो हमें उसके लिए एक फंक्शन बनाना चाहिए। लेकिन, जब हमारे पास उस फ़ंक्शन के लिए कोई तार्किक स्थान नहीं होता है, क्योंकि यह एक "सहायक" है, तो हम इसे अपनी यूटिल्स निर्देशिका में चिपका देते हैं!

मेरा यूटिल्स फ़ोल्डर

मेरे पास अब तक तीन कस्टम यूटिल हैं:

    insertStatement
  • अपडेटस्टेटमेंट
  • objectKeysToCamel
उम्मीद है, उनके नाम से यह स्पष्ट है कि वे क्या करते हैं, लेकिन मैं संक्षेप में उन समस्याओं को साझा करना चाहता हूं जिन्हें वे हल करते हैं और वे कैसे काम करते हैं।

सम्मिलित कथन

समस्या: मेरे एप्लिकेशन की कई अलग-अलग सेवाओं में, मुझे अपने डेटाबेस में एक INSERT क्वेरी निष्पादित करने की आवश्यकता होगी। इन कथनों के लिए आपको 1) कॉलम के नाम और 2) मानों को स्पष्ट रूप से सूचीबद्ध करना होगा। मुझे इन्हें प्रत्येक रूट में टाइप नहीं करना चाहिए, इसलिए मैंने इसे मेरे लिए करने के लिए एक फ़ंक्शन बनाया।

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

आउटपुट: एक ऑब्जेक्ट जिसमें 1) प्लेसहोल्डर मानों के साथ एक संपत्ति स्वरूपित INSERT स्ट्रिंग है और 2) पैरामीटरयुक्त क्वेरी में उपयोग किए जाने वाले मानों की एक सरणी है।

const { snapCase } = require('change-case-commonjs'); फ़ंक्शन इन्सर्टस्टेटमेंट(टेबल, ओबीजे) { स्थिरांक कुंजियाँ = ऑब्जेक्ट.कीज़(ओबीजे); स्थिरांक मान = ऑब्जेक्ट.मान(obj); कथन दें = `INSERT INTO ${table} (`; // स्टेटमेंट में स्नेक_केस कुंजियाँ जोड़ें const keyString = key.map((key, i) => snapCase(key)).join(', '); कथन = `${keyString}) मान (`; // मानों के लिए प्लेसहोल्डर जोड़ें स्थिरांक प्लेसहोल्डर = key.map((_, i) => `$${i 1}`).join(', '); कथन = `${प्लेसहोल्डर्स}) रिटर्निंग *;`; // क्वेरी स्ट्रिंग और मान सरणी लौटाएँ वापस करना { पाठ: कथन, मूल्य: मूल्य }; } मॉड्यूल.एक्सपोर्ट्स = इन्सर्टस्टेटमेंट;
const { snakeCase } = require('change-case-commonjs');

function insertStatement(table, obj) {
  const keys = Object.keys(obj);
  const values = Object.values(obj);

  let statement = `INSERT INTO ${table} (`;

  // Add snake_case keys to the statement
  const keyString = keys.map((key, i) => snakeCase(key)).join(', ');
  statement  = `${keyString}) VALUES (`;

  // Add placeholders for the values
  const placeholders = keys.map((_, i) => `$${i   1}`).join(', ');
  statement  = `${placeholders}) RETURNING *;`;

  // Return the query string and the values array
  return {
    text: statement,
    values: values
  };
}

module.exports = insertStatement;
अद्यतन वक्तव्य

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

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

आउटपुट: एक ऑब्जेक्ट जिसमें 1) प्लेसहोल्डर मानों के साथ एक संपत्ति स्वरूपित अद्यतन स्ट्रिंग है और 2) पैरामीटरयुक्त क्वेरी में उपयोग किए जाने वाले मानों की एक सरणी है।

const { snapCase } = require('change-case-commonjs'); फ़ंक्शन अपडेटस्टेटमेंट(ओबीजे, टेबल, आईडी) { स्थिरांक कुंजियाँ = ऑब्जेक्ट.कीज़(ओबीजे); स्थिरांक मान = ऑब्जेक्ट.मान(obj); लेट स्टेटमेंट = `अपडेट ${टेबल} सेट`; key.forEach((कुंजी, अनुक्रमणिका) => { कथन = `${स्नेकेकेस(कुंजी)} = $${सूचकांक 1}, `; }); // अंतिम अल्पविराम और स्थान हटा दें कथन = कथन.स्लाइस(0, -2); // तालिका के आधार पर सही आईडी कॉलम निर्धारित करें स्थिरांक idColumn = तालिका === 'उपयोगकर्ता'? 'उपयोगकर्ता नाम': तालिका === 'भुनता है'? 'roast_id' : ''; // WHERE क्लॉज के साथ कथन को अंतिम रूप दें कथन = `जहां ${idColumn} = $${keys.length 1} रिटर्निंग *;`; वापस करना { पाठ: कथन, मान: [...मान, आईडी] }; } मॉड्यूल.एक्सपोर्ट्स = अपडेटस्टेटमेंट
const { snakeCase } = require('change-case-commonjs');

function insertStatement(table, obj) {
  const keys = Object.keys(obj);
  const values = Object.values(obj);

  let statement = `INSERT INTO ${table} (`;

  // Add snake_case keys to the statement
  const keyString = keys.map((key, i) => snakeCase(key)).join(', ');
  statement  = `${keyString}) VALUES (`;

  // Add placeholders for the values
  const placeholders = keys.map((_, i) => `$${i   1}`).join(', ');
  statement  = `${placeholders}) RETURNING *;`;

  // Return the query string and the values array
  return {
    text: statement,
    values: values
  };
}

module.exports = insertStatement;
objectKeysToCamel

समस्या: मेरे डेटाबेस की शैली मेरी जावास्क्रिप्ट की शैली से भिन्न है। हालाँकि, मैं किसी भी क्षेत्र में समझौता करने को तैयार नहीं हूँ। मेरी जेएस फाइलों में, मेरा नामकरण सम्मेलन कैमलकेस का उपयोग करता है, जहां मेरे डेटाबेस में यह स्नेक_केस का उपयोग करता है। लौटाई गई वस्तुओं के सभी संपत्ति नाम समान हैं, लेकिन अलग-अलग स्वरूपित हैं। इस केस को मानक बनाए रखने के लिए, मुझे अपने JS में snap_case का उपयोग करके संपत्तियों तक पहुंच प्राप्त करनी होगी, लेकिन मुझे यह पसंद नहीं है।

इनपुट: फ़ंक्शन केवल एक पैरामीटर लेता है, एक ओबीजे जावास्क्रिप्ट ऑब्जेक्ट जिसकी कुंजियाँ कैमलकेस फ़ॉर्मेटिंग में परिवर्तित होनी चाहिए।

आउटपुट: वही ऑब्जेक्ट, कैमलकेस स्वरूपित कुंजियों के साथ।

const { CamelCase } = require('change-case-commonjs'); फ़ंक्शन objectKeysToCamel(obj) { // कुंजियाँ और मान निकालें स्थिरांक कुंजियाँ = ऑब्जेक्ट.कीज़(ओबीजे); स्थिरांक मान = ऑब्जेक्ट.मान(obj); चलो ऊँट = {} // प्रत्येक कुंजी का स्वरूपण बदलें, उसे उचित मान निर्दिष्ट करें key.forEach((key, i) => { स्थिरांक कैमलकी = कैमलकेस(कुंजी); ऊँट[ऊँटकी] = मान[i] }) // नई वस्तु लौटाएँ वापसी ऊँट; } मॉड्यूल.एक्सपोर्ट = objectKeysToCamel;
const { camelCase } = require('change-case-commonjs');

function objectKeysToCamel(obj) {
  // Extract the keys and values
  const keys = Object.keys(obj);
  const values = Object.values(obj);
  let camel = {}

  // Change the formatting of each key, assigning it the proper value
  keys.forEach((key, i) => {
    const camelKey = camelCase(key);
    camel[camelKey] = values[i]
  })

  // Return the new object
  return camel;
}

module.exports = objectKeysToCamel;

प्रोजेक्ट की जाँच करें

यदि आप परिवर्तनों के साथ बने रहना चाहते हैं, स्थानीय रूप से चलाना चाहते हैं, या कोड परिवर्तन का सुझाव भी देना चाहते हैं, तो यहां GitHub रेपो का एक लिंक है!

https://github.com/nmiller15/roast

फ्रंटएंड एप्लिकेशन वर्तमान में Netlify पर तैनात है! यदि आप कुछ सुविधाओं के साथ खिलवाड़ करना चाहते हैं और इसे क्रियान्वित होते देखना चाहते हैं, तो इसे नीचे मोबाइल डिवाइस पर देखें।

https://knowyourhomeroast.netlify.app

ध्यान दें: इस परिनियोजन में कोई बैकएंड एपीआई नहीं है, इसलिए खाते और रोस्ट वास्तव में सत्रों के बीच कहीं भी सहेजे नहीं जाते हैं।

विज्ञप्ति वक्तव्य यह आलेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/nmiller15/roast-day-16-my-utils-folder-33dm?1 यदि कोई उल्लंघन है, तो कृपया इसे हटाने के लिए [email protected] से संपर्क करें।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3