टाइपस्क्रिप्ट के लिए स्वच्छ कोड - भाग 1

टाइपस्क्रिप्ट के लिए स्वच्छ कोड के सिद्धांतों के अनुसार सामग्री पर ठोकर खाई और इसे पढ़ने के बाद, मैंने इसका अनुवाद करने का फैसला किया। यहाँ मैं आपके साथ इस अनुवाद के कुछ अंश साझा करना चाहता हूं, क्योंकि शुद्ध टाइपस्क्रिप्ट कोड के कुछ बिंदु जावास्क्रिप्ट के लिए समान सिद्धांतों को दोहराते हैं, मैंने उन्हें यहाँ वर्णित नहीं किया, यदि यह दिलचस्प होगा, तो JS के लिए अनुवाद हब (@ BoryaMogila ) पर पहले ही प्रकाशित हो चुका था। आप मूल स्रोत में उनके साथ खुद को परिचित कर सकते हैं।



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


चर


डॉक्यूमेंट में एनम का प्रयोग करें


Enam's आपके कोड को दस्तावेज़ करने में मदद कर सकता है। उदाहरण के लिए, जब हम चिंतित होते हैं कि हमारे चर मूल्यों से भिन्न हैं।


खराब:


const GENRE = { ROMANTIC: 'romantic', DRAMA: 'drama', COMEDY: 'comedy', DOCUMENTARY: 'documentary', } projector.configureFilm(GENRE.COMEDY); class Projector { // delactation of Projector configureFilm(genre) { switch (genre) { case GENRE.ROMANTIC: // some logic to be executed } } } 

अच्छा:


 enum GENRE { ROMANTIC, DRAMA, COMEDY, DOCUMENTARY, } projector.configureFilm(GENRE.COMEDY); class Projector { // delactation of Projector configureFilm(genre) { switch (genre) { case GENRE.ROMANTIC: // some logic to be executed } } } 

कार्यों


प्रकार की जाँच से बचें


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


खराब:


 function travelToTexas(vehicle: Bicycle | Car) { if (vehicle instanceof Bicycle) { vehicle.pedal(currentLocation, new Location('texas')); } else if (vehicle instanceof Car) { vehicle.drive(currentLocation, new Location('texas')); } } 

अच्छा:


 type Vehicle = Bicycle | Car; function travelToTexas(vehicle: Vehicle) { vehicle.move(currentLocation, new Location('texas')); } 

पुनरावृत्तियों और जनरेटर का उपयोग करें


एक धारा के रूप में उपयोग किए जाने वाले डेटा संग्रह के साथ काम करते समय जनरेटर और पुनरावृत्तियों का उपयोग करें।
इसके कई कारण हैं:


  • जेनरेटर कार्यान्वयन से तथाकथित ऑब्जेक्ट को इस अर्थ में अलग करता है कि कहा गया ऑब्जेक्ट कितने तत्वों को तय करता है
    पहुंच के लिए है
  • आलसी निष्पादन, मांग पर आइटम पारित किए जाते हैं
  • सिंटैक्स के for-of उपयोग करने वाले तत्वों की पुनरावृति के लिए अंतर्निहित समर्थन
  • पुनरावृत्तियाँ आपको अनुकूलित पुनरावृत्त पैटर्न लागू करने की अनुमति देती हैं

खराब:


 function fibonacci(n: number): number[] { if (n === 1) return [0]; if (n === 2) return [0, 1]; const items: number[] = [0, 1]; while (items.length < n) { items.push(items[items.length - 2] + items[items.length - 1]); } return items; } function print(n: number) { fibonacci(n).forEach(fib => console.log(fib)); } // Print first 10 Fibonacci numbers. print(10); 

अच्छा:


 // Generates an infinite stream of Fibonacci numbers. // The generator doesn't keep the array of all numbers. function* fibonacci(): IterableIterator<number> { let [a, b] = [0, 1]; while (true) { yield a; [a, b] = [b, a + b]; } } function print(n: number) { let i = 0; for (const fib of fibonacci()) { if (i++ === n) break; console.log(fib); } } // Print first 10 Fibonacci numbers. print(10); 

ऐसे पुस्तकालय हैं जो आपको अपने स्वयं के सरणियों के साथ उसी तरह से forEach साथ काम करने की अनुमति देते हैं, जैसे कि map , slice , forEach , आदि के तरीकों का forEach , पुनरावृत्तियों (अतुल्यकालिक पुनरावृत्तियों के हेरफेर के लिए oririri-async ) के लिए itiriri उदाहरण देखें।


 import itiriri from 'itiriri'; function* fibonacci(): IterableIterator<number> { let [a, b] = [0, 1]; while (true) { yield a; [a, b] = [b, a + b]; } } itiriri(fibonacci()) .take(10) .forEach(fib => console.log(fib)); 

ऑब्जेक्ट और डेटा संरचनाएं


गेटर्स और सेटर का उपयोग करें


टाइपस्क्रिप्ट गेटर्स और सेटर्स के सिंटैक्स का समर्थन करता है। ऑब्जेक्ट डेटा तक पहुंचने के लिए गेटर्स और सेटर का उपयोग करना सीधे इसके गुणों तक पहुंचने से बेहतर है। "क्यों?" तुम पूछते हो। यहाँ कारणों की एक सूची है:


  • यदि आप किसी संपत्ति तक पहुँच से अधिक लागू करना चाहते हैं, तो आपको कार्यान्वयन को एक स्थान पर बदलने की आवश्यकता है, और पूरे कोड में नहीं
  • सत्यापन set कार्यान्वयन स्तर पर लागू करना आसान है
  • आंतरिक अवस्था का एनकैप्सुलेशन
  • गेट्टर और सेटर स्तर पर लॉगिंग और एरर हैंडलिंग को जोड़ना आसान है
  • आप सर्वर से, उदाहरण के लिए, अपनी वस्तु के गुणों को लोड कर सकते हैं

खराब:


 type BankAccount = { balance: number; // ... } const value = 100; const account: BankAccount = { balance: 0, // ... }; if (value < 0) { throw new Error('Cannot set negative balance.'); } account.balance = value; 

अच्छा:


 class BankAccount { private accountBalance: number = 0; get balance(): number { return this.accountBalance; } set balance(value: number) { if (value < 0) { throw new Error('Cannot set negative balance.'); } this.accountBalance = value; } // ... } //  `BankAccount`   . //    ,      , //      ``, //      . const account = new BankAccount(); account.balance = 100; 

निजी / सुरक्षित फ़ील्ड के साथ ऑब्जेक्ट बनाएँ


टाइपस्क्रिप्ट public (डिफ़ॉल्ट) , protected और वर्ग गुणों तक पहुँचने के private साधनों का समर्थन करता है।


खराब:


 class Circle { radius: number; constructor(radius: number) { this.radius = radius; } perimeter() { return 2 * Math.PI * this.radius; } surface() { return Math.PI * this.radius * this.radius; } } 

अच्छा:


 class Circle { constructor(private readonly radius: number) { } perimeter() { return 2 * Math.PI * this.radius; } surface() { return Math.PI * this.radius * this.radius; } } 

प्रिय पाठकों, टाइपस्क्रिप्ट का उपयोग करते समय आप किन सिद्धांतों का उपयोग करते हैं?


जारी रखने के लिए ...

Source: https://habr.com/ru/post/hi484402/


All Articles