मुझे आपसे एक पूरी तरह से गंभीर सवाल पूछना है: क्या, आपके विचार में, "डेटा" और "कोड" के बीच अंतर है?
जब मैं शब्द "डेटा" सुनता हूं, तो मुझे लगता है कि "राज्य"। डेटा, परिभाषा के अनुसार, वह चीज़ जो एप्लिकेशन को स्वयं प्रबंधित करने के लिए डिज़ाइन की गई है, और इसलिए यह बहुत ही महत्वपूर्ण बात है कि एप्लिकेशन को अनिवार्य समय के बारे में कभी भी पता नहीं चल सकता है। डेटा को हार्ड-कोड करना संभव नहीं है , क्योंकि जैसे ही आप इसे हार्ड-कोड करते हैं, यह व्यवहार हो जाता है - डेटा नहीं।
डेटा का प्रकार अनुप्रयोग द्वारा भिन्न होता है; एक वाणिज्यिक चालान प्रणाली एक SQL डेटाबेस में ग्राहक को स्टोर कर सकती है और सूचना को ऑर्डर कर सकती है, और एक वेक्टर-ग्राफिक्स प्रोग्राम एक बाइनरी फ़ाइल में जियोमेट्री डेटा और मेटाडेटा स्टोर कर सकता है। इन दोनों मामलों में और बीच में सब कुछ, कोड और डेटा के बीच एक स्पष्ट और अटूट अलगाव है। डेटा उपयोगकर्ता का है , प्रोग्रामर का नहीं, इसलिए इसे कभी भी हार्ड-कोड नहीं किया जा सकता है।
आप जिस चीज के बारे में बात कर रहे हैं, वह मेरी वर्तमान शब्दावली के लिए उपलब्ध तकनीकी रूप से सटीक विवरण का उपयोग करने के लिए है: सूचना व्यवहार कार्यक्रम का व्यवहार जो कि प्राथमिक प्रोग्रामिंग भाषा में नहीं लिखा जाता है, जो अनुप्रयोग के अधिकांश भाग को विकसित करने के लिए उपयोग किया जाता है।
यहां तक कि यह परिभाषा, जो केवल "डेटा" शब्द की तुलना में काफी कम अस्पष्ट है, में कुछ समस्याएं हैं। उदाहरण के लिए, क्या होगा यदि कार्यक्रम के महत्वपूर्ण भाग प्रत्येक अलग-अलग भाषाओं में लिखे गए हों? मैंने व्यक्तिगत रूप से कई परियोजनाओं पर काम किया है जो लगभग 50% सी # और 50% जावास्क्रिप्ट हैं। जावास्क्रिप्ट कोड "डेटा" है? ज्यादातर लोग कहेंगे ना। HTML के बारे में क्या है, वह "डेटा" है? ज्यादातर लोग अभी भी नहीं कहेंगे।
CSS के बारे में क्या? क्या वह डेटा या कोड है? अगर हम कोड के बारे में कुछ ऐसा सोचते हैं जो प्रोग्राम व्यवहार को नियंत्रित करता है, तो CSS वास्तव में कोड नहीं है, क्योंकि यह केवल (अच्छी तरह से, ज्यादातर) उपस्थिति को प्रभावित करता है, व्यवहार को नहीं। लेकिन यह वास्तव में डेटा नहीं है; उपयोगकर्ता इसका मालिक नहीं है, एप्लिकेशन वास्तव में इसका मालिक भी नहीं है। यह UI डिज़ाइनर के लिए कोड के बराबर है। यह कोड की तरह है , लेकिन काफी कोड नहीं है।
मैं CSS को एक तरह का कॉन्फ़िगरेशन कह सकता हूं, लेकिन एक अधिक व्यावहारिक परिभाषा यह है कि यह केवल डोमेन-विशिष्ट भाषा में कोड है । यही आपका XML, YAML और अन्य "स्वरूपित फ़ाइलें" अक्सर प्रतिनिधित्व करता है। और जिस कारण से हम एक डोमेन-विशिष्ट भाषा का उपयोग करते हैं, वह आम तौर पर बोल रहा है, यह एक ही उद्देश्य में सामान्य जानकारी प्रोग्रामिंग भाषा जैसे सी या सी # या जावा को कोड करने की तुलना में अपने विशेष डोमेन में एक साथ अधिक संक्षिप्त और अधिक अभिव्यंजक है।
क्या आप निम्न प्रारूप को पहचानते हैं?
{
name: 'Jane Doe',
age: 27,
interests: ['cats', 'shoes']
}
मुझे यकीन है कि ज्यादातर लोग करते हैं; यह JSON है । और यहां JSON के बारे में दिलचस्प बात है: जावास्क्रिप्ट में, यह स्पष्ट रूप से कोड है, और हर दूसरी भाषा में, यह स्पष्ट रूप से स्वरूपित डेटा है। लगभग हर एक मुख्यधारा की प्रोग्रामिंग भाषा में JSON "पार्सिंग" के लिए कम से कम एक पुस्तकालय है।
यदि हम जावास्क्रिप्ट फ़ाइल में किसी फ़ंक्शन के अंदर उसी सटीक सिंटैक्स का उपयोग करते हैं, तो यह संभवतः कोड के अलावा और कुछ नहीं हो सकता है। और फिर भी, अगर हम उस JSON को लेते हैं, तो इसे एक .json
फ़ाइल में बंद करें, और इसे जावा एप्लिकेशन में पार्स करें, अचानक यह "डेटा" है। क्या यह वास्तव में समझ में आता है?
मेरा तर्क है कि "डेटा-नेस" या "कॉन्फ़िगरेशन-नेस" या "कोड-नेस" जो वर्णित किया जा रहा है, उसके लिए अंतर्निहित है , न कि इसका वर्णन कैसे किया जा रहा है।
यदि आपके प्रोग्राम को यादृच्छिक पासफ़्रेज़ उत्पन्न करने, कहने, करने के लिए 1 मिलियन शब्दों के शब्दकोश की आवश्यकता है, तो क्या आप इस तरह से कोड करना चाहते हैं:
var words = new List<string>();
words.Add("aa");
words.Add("aah");
words.Add("ahhed");
// snip 172836 more lines
words.Add("zyzzyva");
words.Add("zyzzyvas");
या क्या आप उन सभी शब्दों को एक लाइन-सीमांकित पाठ फ़ाइल में भेज देंगे और इसे पढ़ने के लिए अपना कार्यक्रम बताएंगे? यह वास्तव में मायने नहीं रखता है अगर शब्द सूची कभी नहीं बदलती है, यह सवाल नहीं है कि आप हार्ड-कोडिंग या सॉफ्ट-कोडिंग कर रहे हैं (जो कि अनुचित रूप से लागू होने पर कई सही रूप से एक विरोधी पैटर्न मानते हैं), यह बस एक सवाल है क्या प्रारूप सबसे कुशल है और "सामान" का वर्णन करना आसान बनाता है, जो भी "सामान" है। यह काफी अप्रासंगिक है कि क्या आप इसे कोड या डेटा कहते हैं; यह जानकारी है कि आपके कार्यक्रम को चलाने के लिए आवश्यक है, और एक फ्लैट-फ़ाइल प्रारूप इसे प्रबंधित करने और बनाए रखने का सबसे सुविधाजनक तरीका है।
यदि आप उचित प्रथाओं का पालन करते हैं, तो यह सब सामान वैसे भी स्रोत नियंत्रण में जा रहा है, इसलिए आप इसे कोड कह सकते हैं, बस एक अलग और शायद बहुत न्यूनतर प्रारूप में कोड। या आप इसे कॉन्फ़िगरेशन कह सकते हैं, लेकिन केवल एक चीज जो कॉन्फ़िगरेशन से कोड को वास्तव में अलग करती है, वह है कि आप इसे दस्तावेज़ करते हैं या नहीं और अंत उपयोगकर्ताओं को बताएं कि इसे कैसे बदलना है। आप शायद स्टार्टअप समय या रनटाइम पर समझाए जा रहे कॉन्फ़िगरेशन के बारे में कुछ संगीन तर्क का आविष्कार कर सकते हैं और संकलन समय पर नहीं, लेकिन फिर आप कई डायनामिक-टाइप की गई भाषाओं का वर्णन करना शुरू कर देंगे और लगभग निश्चित रूप से इसके अंदर एम्बेडेड स्क्रिप्टिंग इंजन के साथ कुछ भी कर सकते हैं (जैसे सबसे खेल)। कोड और कॉन्फ़िगरेशन जो भी आप उन्हें लेबल के रूप में तय करते हैं, अधिक कुछ नहीं, कुछ भी कम नहीं।
अब, वहाँ है के लिए एक खतरा externalizing जानकारी है कि वास्तव में संशोधित करने के लिए सुरक्षित नहीं है (जैसा कि ऊपर "सॉफ्ट कोडिंग" लिंक देखें)। यदि आप किसी कॉन्फ़िगरेशन फ़ाइल में अपने स्वर सरणी को बाहरी करते हैं, और इसे अपने अंतिम उपयोगकर्ताओं के लिए कॉन्फ़िगरेशन फ़ाइल के रूप में दस्तावेज़ित करते हैं, तो आप उन्हें तुरंत अपने ऐप को तोड़ने के लिए एक लगभग मूर्खतापूर्ण तरीका दे रहे हैं, उदाहरण के लिए "q" को एक स्वर के रूप में डालकर। लेकिन "कोड और डेटा के पृथक्करण" के साथ यह एक मौलिक समस्या नहीं है, यह केवल खराब डिजाइन अर्थ है।
मैं कनिष्ठ देवों को बताता हूं कि उन्हें हमेशा सेटिंग्स को बाहरी बनाना चाहिए जो वे प्रति वातावरण में बदलाव की उम्मीद करते हैं। जिसमें कनेक्शन स्ट्रिंग्स, उपयोगकर्ता नाम, एपीआई कुंजी, निर्देशिका पथ, और इसी तरह की चीजें शामिल हैं। वे आपके देव बॉक्स पर और उत्पादन में समान हो सकते हैं, लेकिन शायद नहीं, और sysadmins तय करेंगे कि वे कैसे उत्पादन में देखना चाहते हैं, देवता नहीं। तो आपको कुछ मशीनों पर लागू सेटिंग्स के एक समूह, और अन्य मशीनों पर लागू अन्य सेटिंग्स - एर्गो, बाहरी कॉन्फ़िगरेशन फ़ाइलों (या डेटाबेस में सेटिंग्स, आदि) के तरीके की आवश्यकता है
लेकिन मुझे लगता है कि बस एक "फ़ाइल" में कुछ "डेटा" डालने पर यह कॉन्फ़िगरेशन के रूप में बाहरीकरण के समान नहीं है। टेक्स्ट फ़ाइल में शब्दों के शब्दकोश को रखने का मतलब यह नहीं है कि आप उपयोगकर्ताओं (या आईटी) को इसे बदलना चाहते हैं, यह डेवलपर्स के लिए यह समझना आसान बनाने का एक तरीका है कि नरक क्या चल रहा है और, यदि आवश्यक हो, तो सामयिक परिवर्तन। इसी तरह, डेटाबेस तालिका में समान जानकारी रखना जरूरी नहीं कि व्यवहार के बाहरीकरण के रूप में गिना जाए, यदि तालिका केवल पढ़ने के लिए है और / या डीबीए को निर्देश दिया जाता है कि इसके साथ पेंच न करें। कॉन्फ़िगरेशन का तात्पर्य है कि डेटा परिवर्तनशील है, लेकिन वास्तव में यह प्रारूप की पसंद के बजाय प्रक्रिया और जिम्मेदारियों से निर्धारित होता है।
इसलिए, संक्षेप में:
"कोड" एक कठोर परिभाषित शब्द नहीं है। यदि आप अपनी परिभाषा को डोमेन-विशिष्ट भाषाओं और कुछ और जो व्यवहार को प्रभावित करते हैं, को शामिल करने के लिए विस्तारित करते हैं, तो इस स्पष्ट घर्षण का एक बहुत ही बस गायब हो जाएगा और यह सब समझ में आएगा। आप एक फ्लैट फ़ाइल में गैर-संकलित, डीएसएल "कोड" रख सकते हैं।
"डेटा" का तात्पर्य ऐसी जानकारी से है जो उपयोगकर्ता (ओं) के पास है या डेवलपर्स के अलावा किसी और के पास है, और आमतौर पर डिजाइन समय पर उपलब्ध नहीं है। यदि आप ऐसा करना चाहते हैं तो भी यह कठिन-कूटबद्ध नहीं हो सकता है। स्व-संशोधित कोड के संभावित अपवाद के साथ , कोड और डेटा के बीच अलगाव परिभाषा की बात है, न कि व्यक्तिगत प्राथमिकता की।
"सॉफ्ट-कोडिंग" एक भयानक अभ्यास हो सकता है जब ओवर-एप्लाइड किया जाता है, लेकिन जरूरी नहीं कि बाहरीकरण के प्रत्येक उदाहरण में सॉफ्ट-कोडिंग का गठन हो, और "फ्लैट फाइलों" में सूचनाओं के भंडारण के कई उदाहरण जरूरी नहीं हैं कि बाहरीकरण पर एक बॉर्न फाइड प्रयास हो।
विन्यास नरम-कोडिंग कि एक विशेष प्रकार का है है ज्ञान आवेदन विभिन्न वातावरण में चलाने के लिए आवश्यकता हो सकती है कि की वजह से आवश्यक। प्रत्येक वातावरण के लिए कोड के एक अलग संस्करण को तैनात करने की तुलना में आवेदन के साथ एक अलग कॉन्फ़िगरेशन फ़ाइल को तैनात करना कहीं कम काम (और बहुत कम खतरनाक) है। तो कुछ प्रकार के सॉफ्ट-कोडिंग वास्तव में उपयोगी हैं।