प्रोग्रामिंग में जादू — यह क्या है, मैजिक नंबर के खतरे और उन्हें कैसे बदलें

लेखक: IT Sectr प्रकाशित: 2026-07-27 पढ़ने का समय: 10 मिनट

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

मुख्य बातें

  • जादू — कोड में अंतर्निहित संख्याएँ, स्ट्रिंग और फ़्लैग जिनका अर्थ पाठक से छिपा होता है।
  • मैजिक नंबर — बिना नाम के संख्यात्मक शाब्दिक मान: 86400, 3.14, 0.85, 1024।
  • मैजिक स्ट्रिंग — पथ, कुंजी, URL को स्थिरांक में निकाले बिना हार्डकोड करना।
  • खोज उपकरण: SonarQube (MagicNumber नियम), ESLint (no-magic-numbers), Detekt।
  • समाधान: प्रत्येक जादुई मान को वर्णनात्मक नाम वाले नामित स्थिरांक में निकालें।

प्रोग्रामिंग में जादू क्या है?

जादू स्रोत कोड में कोई भी मान है जिसका अर्थ अतिरिक्त डोमेन ज्ञान के बिना स्पष्ट नहीं होता। यह शब्द समुदाय में स्थापित है: यदि कोई डेवलपर किसी संख्या को देखता है और नहीं बता सकता कि वह कहाँ से आई — तो वह जादू है।

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

JetBrains कोड गुणवत्ता सर्वेक्षण (2025) के अनुसार, 73 प्रतिशत डेवलपर मैजिक नंबर को निम्न कोड गुणवत्ता का संकेतक मानते हैं, जबकि 41 प्रतिशत स्वीकार करते हैं कि वे कभी-कभी उन्हें छोड़ देते हैं। मुख्य कारण जल्दबाजी है: “मैं बाद में स्थिरांक जोड़ दूंगा” — लेकिन बाद में कभी नहीं आता, और एक महीने बाद संख्या 0.85 बिना स्पष्टीकरण के विधि के मध्य में बनी रहती है।

मुख्य नियम: 0, 1, true, false और खाली स्ट्रिंग को छोड़कर हर शाब्दिक मान को नामित स्थिरांक में निकाला जाना चाहिए। अपवाद: काउंटर वृद्धि (i + 1), गणितीय शून्य (0 की जाँच), और संचायक के प्रारंभिक मान। बाकी सब नामकरण के लिए उम्मीदवार है।

मैजिक नंबर और वे खतरनाक क्यों हैं

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

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

मैजिक नंबर का उदाहरण पहले और बाद में

kotlin
// before - magic in its pure form
fun calculateTimeout(base: Int): Int {
    return base * 3 + 5000
}

// after - values replaced with constants
private const val RETRY_MULTIPLIER = 3
private const val BASE_TIMEOUT_MS = 5000

fun calculateTimeout(base: Int): Int {
    return base * RETRY_MULTIPLIER + BASE_TIMEOUT_MS
}

तीसरा खतरा है परीक्षण की असंभवता। यदि सीमा मान शाब्दिक के रूप में हार्डकोड किया गया है, तो परीक्षण इसे सीमा स्थितियों की जाँच करने के लिए ओवरराइड नहीं कर सकता। companion object या कॉन्फ़िगरेशन फ़ाइल में निकाला गया स्थिरांक कोड को परीक्षण योग्य बनाता है: परीक्षण एक अलग मान रखता है और सीमा पर सिस्टम व्यवहार की जाँच करता है।

एक आदत विकसित करें: जब भी आप 0, 1, 100 या 2 के अलावा कोई संख्या लिखें — रुकें और सोचें कि क्या इसे स्थिरांक में निकाला जाना चाहिए। यदि संख्या व्यावसायिक तर्क (सीमा, थ्रेशोल्ड, टाइमआउट, आकार) से संबंधित है — तो बिना संकोच के निकालें। यदि संख्या गणितीय स्थिरांक (pi, e) है — तो मानक पुस्तकालय का उपयोग करें (Math.PI, Math.E)।

मैजिक स्ट्रिंग और पथ

मैजिक स्ट्रिंग स्ट्रिंग शाब्दिक मान हैं जो स्थिरांक या संसाधनों में निकाले बिना कोड में एम्बेड किए जाते हैं। विशिष्ट उदाहरण: एंडपॉइंट URL, SharedPreferences कुंजी नाम, Intent Actions, bundle कुंजी, फ़ाइल नाम और SQL क्वेरी।

मैजिक स्ट्रिंग का खतरा संकलन-समय जाँच की कमी है। स्ट्रिंग “user_prefs” में टाइपो रनटाइम तक नहीं पकड़ा जाएगा। यदि स्ट्रिंग दस स्थानों पर उपयोग की जाती है और डेवलपर उनमें से एक में “user_pref” (s के बिना) लिखता है — तो एप्लिकेशन क्रैश नहीं होता, लेकिन डेटा सहेजा नहीं जाता। ऐसा बग महीनों तक प्रोडक्शन में रह सकता है क्योंकि यह क्रैश का कारण नहीं बनता।

Android प्रोजेक्ट के लिए, मैजिक स्ट्रिंग को संसाधनों (strings.xml, arrays.xml) या companion object में स्थिरांक में निकाला जाना चाहिए। iOS के लिए — स्ट्रिंग संसाधनों (Localizable.strings) या enum स्थिरांक में। बैकएंड के लिए — कॉन्फ़िगरेशन फ़ाइलों (.env, application.properties) में। कोई भी कुंजी, URL या पथ कोड में स्ट्रिंग शाब्दिक के रूप में नहीं दिखना चाहिए।

swift
// before - magic strings across the class
let prefs = UserDefaults.standard
prefs.set(token, forKey: "auth_token")
prefs.set(userId, forKey: "current_user_id")

// after - strings extracted to enum
enum PrefKeys: String {
    case authToken = "auth_token"
    case currentUserId = "current_user_id"
}

prefs.set(token, forKey: PrefKeys.authToken.rawValue)
prefs.set(userId, forKey: PrefKeys.currentUserId.rawValue)

उन स्ट्रिंग पर विशेष ध्यान दें जो दोहराई जाती हैं। यदि एक ही कुंजी “user_settings” तीन फ़ाइलों में दिखाई देती है — 99 प्रतिशत संभावना है कि अंततः उनमें से एक में टाइपो होगा। enum या स्थिरांक में निकालना गारंटी देता है कि सभी संदर्भ एक ही मान का उपयोग करते हैं।

मैजिक फ़्लैग और बूलियन पैरामीटर

मैजिक फ़्लैग बूलियन पैरामीटर हैं जिनका अर्थ कॉल संदर्भ से स्पष्ट नहीं होता। एक उत्कृष्ट एंटी-पैटर्न: बिना स्पष्टीकरण के किसी विधि में true या false पास करना कि यह फ़्लैग वास्तव में क्या सक्षम या अक्षम करता है।

उदाहरण: userDao.fetch(includeDeleted = false)। डेवलपर false देखता है और नहीं बता सकता कि इसका अर्थ “हटाए गए को शामिल न करें” है या “सक्रिय को शामिल न करें”। एक महीने बाद, false true में बदल जाता है, और आउटपुट में हटाए गए रिकॉर्ड दिखाई देने लगते हैं। बग केवल प्रोडक्शन में खोजा जाता है।

समाधान है बूलियन फ़्लैग को enum या sealed class से बदलना। Boolean पैरामीटर के बजाय, UserFilter.includeDeleted या UserFilter.activeOnly का उपयोग करें। इस तरह कोड अपने इरादे का दस्तावेजीकरण करता है, और IDE स्वतः पूर्णता के दौरान उपलब्ध विकल्प सुझाता है।

यदि बूलियन फ़्लैग कई परतों के माध्यम से पास किया जाता है — तो यह एक और संकेत है कि एब्स्ट्रैक्शन गलत है। तीन स्तरों के कॉल के माध्यम से फ़्लैग को खींचने के बजाय, सोचें कि क्या फ़िल्टर चयन शीर्ष स्तर पर किया जाना चाहिए और तैयार कॉन्फ़िगरेशन के रूप में पास किया जाना चाहिए। कोड में जितने कम बूलियन फ़्लैग होंगे — उतना कम जादू।

एक नियम अपनाएँ: कोई भी बूलियन पैरामीटर बिना नामित तर्क के विधि में नहीं भेजा जाता (यदि भाषा नामित तर्कों का समर्थन करती है)। Kotlin और Swift में, यह आवश्यकता स्वचालित रूप से पूरी होती है। Java में, true/false के बजाय Builder या enum स्थिरांक का उपयोग करें।

जादू का पता लगाने के उपकरण

जादुई मानों की खोज स्थैतिक विश्लेषकों द्वारा स्वचालित होती है जो अप्रत्याशित स्थानों में शाब्दिक मानों का पता लगाने के लिए कॉन्फ़िगर किए जाते हैं। प्रत्येक भाषा अनुकूलन योग्य अपवादों के साथ अपने स्वयं के उपकरण प्रदान करती है।

उपकरणभाषाएँनियम
SonarQubeJava, Kotlin, Swift, Python, JSMagicNumber, HardcodedString
ESLintJavaScript, TypeScriptno-magic-numbers, no-hardcoded-strings
DetektKotlinMagicNumber, ComplexCondition
SwiftLintSwiftmagic_number (opt-in)
PMDJava, Apex, PLSQLMagicNumber (कॉन्फ़िगर करने योग्य अनुमत सूची)
PhpStorm निरीक्षणPHPNumericLiteralWithContext (अंतर्निहित निरीक्षण)

अपवादों को कॉन्फ़िगर करना महत्वपूर्ण है — इसके बिना, विश्लेषक प्रत्येक वृद्धि (-1, +1) और गणितीय शून्य पर चेतावनी देगा। SonarQube के लिए, अनुमत संख्या सूची: 0, 1, -1, 2 (दोगुना करने के लिए), 100 (प्रतिशत), 60 और 24 (समय)। अन्य सभी मानों के लिए — public static final (Java) या const val (Kotlin) संशोधक के साथ नामित स्थिरांक की आवश्यकता है।

CI स्तर के विश्लेषण के लिए, एक चेतावनी के रूप में जादू की जाँच करने वाला चरण जोड़ें लेकिन बिल्ड को अवरुद्ध न करें। पहली रन लीगेसी कोड में सैकड़ों चेतावनियाँ दिखाएगी। धीरे-धीरे, टिकट दर टिकट, कोड को स्थिरांक में स्थानांतरित करें और गुणवत्ता सीमा बढ़ाएँ। जब मैजिक नंबर की संख्या 10 से कम हो जाए — तो नियम को बिल्ड त्रुटि के रूप में सक्षम करें।

रीफैक्टरिंग: जादू को स्थिरांक से बदलना

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

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

java
// before - same number in different contexts
public class Config {
    public void setupCache() {
        cache.setMaxSize(5000); // 5 MB
    }
    public void setupTimeout() {
        client.setReadTimeout(5000); // 5 seconds
    }
}

// after - different constants for different contexts
public class Config {
    private static final int CACHE_MAX_SIZE_MB = 5;
    private static final int READ_TIMEOUT_SECONDS = 5;

    public void setupCache() {
        cache.setMaxSize(CACHE_MAX_SIZE_MB * 1024 * 1024);
    }
    public void setupTimeout() {
        client.setReadTimeout(
            READ_TIMEOUT_SECONDS * 1000
        );
    }
}

नए कोड के लिए, नियम सरल है: 0, 1, -1, true, false, null और खाली स्ट्रिंग को छोड़कर कोई भी शाब्दिक स्थिरांक में निकाला जाता है। अपवाद: गणितीय स्थिरांक (हमेशा मानक पुस्तकालय का उपयोग करें), परीक्षण डेटा (शाब्दिक परीक्षणों में रह सकते हैं लेकिन वर्णनात्मक चर नाम के साथ), और वृद्धि के लिए सीमा मान (लूप में i + 1 ठीक है)।

अक्सर पूछे जाने वाले प्रश्न

क्या 100 मैजिक नंबर है अगर इसका मतलब 100 प्रतिशत है?

हाँ, 100 भी मैजिक नंबर है अगर बिना संदर्भ के उपयोग किया जाए। 100 के बजाय, MAX_PERCENT या PROBABILITY_SCALE लिखें। अपवाद: जब 100 संदर्भ में स्पष्ट रूप से प्रतिशत है (उदाहरण के लिए, प्रतिशत गणना सूत्र में), लेकिन इस मामले में भी स्थिरांक पठनीयता में सुधार करता है।

परीक्षणों में संख्याओं के बारे में क्या?

परीक्षणों में भी नामित चर का उपयोग करना बेहतर है। assertEquals(42, result) के बजाय, val expected = 42; assertEquals(expected, result) लिखें। अपवाद: सीमा मानों के परीक्षण (0, null, खाली स्ट्रिंग) — उन्हें शाब्दिक के रूप में छोड़ा जा सकता है क्योंकि वे परीक्षण संदर्भ में पढ़ने योग्य हैं।

क्या संख्याओं को Android संसाधनों में निकालना चाहिए?

हाँ, UI से संबंधित संख्याएँ (आकार, मार्जिन, एनिमेशन अवधि) संसाधनों (dimens.xml, integers.xml) में होनी चाहिए। व्यावसायिक स्थिरांक (टाइमआउट, सीमाएँ) — companion object या कॉन्फ़िगरेशन फ़ाइल में। मुख्य मानदंड: यदि संख्या तर्क को बदले बिना बदल सकती है — तो यह एक संसाधन है।

लीगेसी प्रोजेक्ट में मैजिक नंबर कैसे खोजें?

MagicNumber नियम के साथ SonarQube या no-magic-numbers के साथ ESLint चलाएँ। रिपोर्ट प्राप्त करें, उपयोग आवृत्ति के अनुसार क्रमबद्ध करें, और उन संख्याओं से शुरू करें जो तीन या अधिक स्थानों पर दिखाई देती हैं। वे स्थिरांक में निकालने के लिए सबसे संभावित उम्मीदवार हैं।

क्या कोड में हर संख्या को स्थिरांक में निकालना चाहिए?

नहीं। स्वीकार्य शाब्दिक: 0, 1, -1 (वृद्धि/कमी, खाली जाँच), true, false, null, खाली स्ट्रिंग। बाकी सभी को नामकरण की आवश्यकता है। यदि संख्या 0 का उपयोग खाली जाँच के रूप में नहीं किया गया है (उदाहरण के लिए, 0 मूल श्रेणी ID है), तो 0 भी स्थिरांक होना चाहिए: ROOT_CATEGORY_ID = 0।

सारांश

  • जादू — बिना स्पष्टीकरण के शाब्दिक: संख्याएँ, स्ट्रिंग, फ़्लैग जिनका अर्थ कोड पाठक से छिपा होता है।
  • मैजिक नंबर — बिना नाम के संख्यात्मक स्थिरांक (86400, 1024, 0.85, 5000) जिन्हें समझने के लिए डोमेन ज्ञान की आवश्यकता होती है।
  • मैजिक स्ट्रिंग — हार्डकोडेड कुंजी, URL और पथ जो संकलक के लिए अदृश्य हैं और रनटाइम बग का कारण बनते हैं।
  • मैजिक फ़्लैग — बूलियन पैरामीटर जिनका मान स्पष्ट नहीं है (विधि कॉल में true/false)।
  • उपकरण: SonarQube, ESLint, Detekt, SwiftLint, PMD — सभी MagicNumber नियम का समर्थन करते हैं।
  • समाधान: प्रत्येक शाब्दिक (0, ±1, true, false, null, "" को छोड़कर) वर्णनात्मक नाम वाले नामित स्थिरांक में निकाला जाता है।
  • अलग-अलग संदर्भ — अलग-अलग स्थिरांक: 5000 टाइमआउट के रूप में और 5000 कैश आकार के रूप में अलग-अलग संस्थाएँ हैं।

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें