स्विफ्ट में स्वच्छ कोड कैसे लिखें: उन लोगों के लिए मार्गदर्शिका जो खुद और अपने सहकर्मियों का सम्मान करते हैं
\n\nहर डेवलपर ने कम से कम एक बार ऐसा प्रोजेक्ट खोला होगा जो छह महीने पहले लिखा गया था, और समझ नहीं पाया कि वहाँ क्या चल रहा है। या कोड-रिव्यू पर टिप्पणी मिली: "इसे और सरल लिखा जा सकता था"। परिचित लगता है? अगर हाँ — यह लेख आपके लिए है।
\n\nस्विफ्ट में स्वच्छ कोड सिर्फ एक परफेक्शनिस्ट की सनक नहीं है। यह एक उपकरण है जो डीबगिंग और तनाव के घंटों को बचाता है। जब आप सावधानी से लिखते हैं, तो आप न केवल अपने काम को गति देते हैं, बल्कि प्रोजेक्ट को टीम के लिए पारदर्शी बनाते हैं। आइए देखें कि अपने स्विफ्ट कोड को कला का नमूना कैसे बनाया जाए।
\n\nनियम #1: नामकरण सबसे महत्वपूर्ण है
\n\nसबसे आम गलती है वेरिएबल का नाम x या temp रखना। फिर कोई और डेवलपर आता है और सोचता है: "यह x क्या है? निर्देशांक? संख्या?"
स्विफ्ट में ऐसे नाम देना आम है जो वाक्यों की तरह पढ़े जाएँ। यह सिर्फ सुंदर नहीं है — यह तुरंत समझने में मदद करता है कि कोड क्या करता है।
\n\n// बुरा\nlet a = 5.0\nvar b = "John"\n\n// अच्छा\nlet discountRate = 5.0\nvar userName = "John"\n\nफंक्शन और मेथड के लिए भी यही नियम लागू होता है। नाम को इस प्रश्न का उत्तर देना चाहिए "यह मेथड क्या करता है?"। आदेशात्मक रूप में क्रियाओं का उपयोग करें:
\n\n// बुरा\nfunc data() -> [String] { ... }\n\n// अच्छा\nfunc fetchUsers() -> [String] { ... }\n\nऔर अगर फंक्शन बूलियन मान लौटाता है, तो नाम is, has या contains से शुरू करें:
func isUserLoggedIn() -> Bool\nfunc hasValidEmail() -> Bool\n\nनियम #2: ऑप्शनल — दुश्मन नहीं, बल्कि उपकरण हैं
\n\nकई नौसिखिए ऑप्शनल से डरते हैं और किसी भी कीमत पर उनसे छुटकारा पाने की कोशिश करते हैं। वे हर जगह if let लिखते हैं या, इससे भी बुरा, फोर्स-अनरैप करते हैं। लेकिन स्विफ्ट में स्वच्छ कोड वह कोड है जो nil के साथ सुरक्षित रूप से काम करता है।
याद रखें: ! मदद की चीख है। इसका उपयोग केवल तभी करें जब आप पूरी तरह से सुनिश्चित हों कि मान nil नहीं है (जैसे IBOutlet के साथ काम करते समय)।
// खतरनाक कोड\nlet name = optionalName!\n\n// सुरक्षित विकल्प\nguard let name = optionalName else {\n return\n}\nprint(name)\n\nऔर ऑप्शनल की श्रृंखला के लिए ? और nil-coalescing का उपयोग करें:
let userCity = user?.address?.city ?? "अज्ञात"\n\nयह कोड क्रैश नहीं होगा, भले ही user या address nil हों। और यह एक सामान्य वाक्य की तरह पढ़ा जाता है: "उपयोगकर्ता का शहर या 'अज्ञात'"।
नियम #3: जहाँ संभव हो क्लास के बजाय स्ट्रक्चर का उपयोग करें
\n\nस्विफ्ट में क्लास और स्ट्रक्चर दोनों हैं। लेकिन कई लोग आदत से हर जगह क्लास का उपयोग करते हैं। यह गलत है। स्ट्रक्चर value types हैं, और वे मल्टीथ्रेडेड कोड में अधिक सुरक्षित हैं। साथ ही वे कॉपी होते हैं, न कि संदर्भित, जिससे साइड इफेक्ट का जोखिम कम होता है।
\n\nस्ट्रक्चर का उपयोग करें यदि:
\n- \n
- जटिल लॉजिक के बिना डेटा स्टोर करना हो \n
- इनहेरिटेंस की आवश्यकता न हो \n
- ऑब्जेक्ट बनने के बाद परिवर्तनीय नहीं होना चाहिए \n
// बेहतर है स्ट्रक्चर\nstruct User {\n let id: Int\n var name: String\n}\n\n// क्लास — केवल अगर इनहेरिटेंस या reference semantics चाहिए\nclass ViewController: UIViewController { ... }\n\nवैसे, Apple डेटा मॉडल के लिए स्ट्रक्चर का उपयोग करने की सलाह देता है। यह स्विफ्ट में स्वच्छ कोड के मुख्य सिद्धांतों में से एक है।
\n\nनियम #4: प्रोटोकॉल — आपके सबसे अच्छे दोस्त
\n\nस्विफ्ट में प्रोटोकॉल सिर्फ इंटरफेस नहीं हैं। यह कोड को लचीला और परीक्षण योग्य बनाने का एक तरीका है। किसी विशिष्ट क्लास से बंधने के बजाय, प्रोटोकॉल के माध्यम से काम करें।
\n\nprotocol NetworkServiceProtocol {\n func fetchData(completion: @escaping (Result<Data, Error>) -> Void)\n}\n\nclass APIService: NetworkServiceProtocol { ... }\nclass MockService: NetworkServiceProtocol { ... }\n\nअब आप परीक्षणों के लिए वास्तविक सेवा को मॉक से आसानी से बदल सकते हैं। और आपको दूसरे कोड को बदलने की आवश्यकता नहीं है।