क्या मुझे व्यावसायिक नियमों को संग्रहीत करने के लिए एक कॉन्फ़िगर फ़ाइल या डेटाबेस का उपयोग करना चाहिए?


41

मैं हाल ही में व्यावहारिक प्रोग्रामर पढ़ रहा हूं जिसमें कहा गया है कि:

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

हंट, एंड्रयू; थॉमस, डेविड (1999-10-20)। द प्रोगैमैटिक प्रोग्रामर: जर्नीमैन से मास्टर तक (जलाने के स्थान 2651-2653)। पियर्सन एजुकेशन (यूएसए)। किंडल संस्करण।

मैं वर्तमान में एक वेब ऐप प्रोग्रामिंग कर रहा हूं जिसमें कुछ मॉडल हैं जिनमें ऐसे गुण हैं जो केवल मानों के एक सेट से हो सकते हैं, उदाहरण के लिए (वेब ​​ऐप डेटा गोपनीय के रूप में वास्तविक उदाहरण नहीं):

प्रकाश-> प्रकार = गोला / घन / सिलेंडर

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

क्या मुझे संभवतः इन जैसे मूल्यों को संग्रहीत करना चाहिए:

  • एक विन्यास फाइल:
    'light-types' => array(sphere, cube, cylinder),
    'other-type' => value,
    'etc' => etc-value

  • प्रत्येक विन्यास आइटम के लिए एक पंक्ति के साथ डेटाबेस में एक एकल तालिका

  • प्रत्येक config आइटम के लिए एक मेज के साथ एक डेटाबेस (जैसे तालिका: light_types; कॉलम: id, name)

  • कोई और तरीका?

किसी भी सहायता / विशेषज्ञता के लिए बहुत धन्यवाद।

जवाबों:


45

मैं जिन परियोजनाओं पर काम करता हूं उनमें भी यही सवाल उठता है। आमतौर पर, मैं यह करता हूं:

  1. यदि संभावित मूल्यों के सेट को जल्द ही किसी भी समय बदलने की संभावना नहीं है, तो मैं डेटाबेस में कोड और गणना करने योग्य क्षेत्रों में कक्षा / इंटरफ़ेस स्थिरांक या एनम का उपयोग करता हूं। उदाहरण: ब्लॉग प्रविष्टियों के प्रकाशन की स्थिति: 'प्रकाशित नहीं', 'मॉडरेशन के तहत', 'प्रकाशित', आदि।
  2. मान शायद बदल जाएंगे, लेकिन परिवर्तन प्रोग्राम लॉजिक - कॉन्फ़िग फ़ाइलों को प्रभावित नहीं करेंगे। उदाहरण: "आपको हमारी वेबसाइट कैसी लगी?" ऑनलाइन क्रय फॉर्म में ड्रॉपडाउन सूची के लिए विकल्प।
  3. मानों को अक्सर बदलने और / या गैर-डेवलपर्स द्वारा संपादित किए जाने का मतलब है, लेकिन फिर भी ये परिवर्तन तर्क को प्रभावित नहीं करेंगे - संपादन के लिए कुछ उपयोगकर्ता के अनुकूल इंटरफेस के साथ एक डेटाबेस या कम से कम एक कुंजी-मूल्य का भंडारण।
  4. मूल्यों को बदलने से तर्क प्रभावित होगा - शायद सिस्टम को रीडिज़ाइन (अक्सर सच) या कुछ व्यावसायिक नियमों के इंजन की आवश्यकता होती है। सबसे कठिन मामला जो मैंने अब तक देखा है वह था मनोवैज्ञानिक परीक्षण कंस्ट्रक्टर जो मेरे सहयोगी ने काम किया था। प्रत्येक प्रकार के परीक्षण का अपना स्कोरिंग सिस्टम हो सकता है जो सकारात्मक और नकारात्मक मूल्यों या उत्तर के मानव मूल्यांकन के साथ कई विशेषताओं के पैमानों के लिए सरल जोड़ से भिन्न हो सकता है। इस परियोजना के बारे में कुछ चर्चा के बाद, हमने लुआ का उपयोग एक पटकथा इंजन के रूप में किया, जो पूरी तरह से गैर-डेवलपर्स के साथ नए परीक्षण बनाने की क्षमता के साथ संघर्ष करता है (भले ही लुआ अपेक्षाकृत सरल भाषा है, आपको उम्मीद नहीं करनी चाहिए कि गैर-प्रोग्रामर इसे सीखेंगे)।

टीपीपी के उद्धरण के बारे में। मुझे लगता है कि इसके लिए सच है प्राचीन कोड है, लेकिन वास्तविक जीवन में, आप बेहतर सरल (शुरू KISS सिद्धांत ) और ऐड बाद में दिखाता है तो वे वास्तव में जरूरत है कर रहे हैं ( YAGNI )।


7

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

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

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

अब, यदि आप किसी मौजूदा नियम इंजन को ढूंढना और उसका उपयोग करना चाहते हैं, तो हो सकता है कि आपको थोड़ा सा काम मिल जाए (साथ ही यह सवाल करना होगा कि सवाल कहां जमा करना है)। लेकिन अपना खुद का निर्माण कार्यभार को दोगुना कर देता है और अनिवार्य रूप से आपको उन लोगों द्वारा निर्मित एक आधा-गधा प्रणाली मिलती है जो वास्तव में एक सभ्य नियम इंजन बनाने के लिए नहीं जानते हैं।)


0

सामान्य तौर पर डेटा के लिए एक डेटाबेस का उपयोग किया जाना चाहिए और कॉन्फ़िगरेशन के लिए एक कॉन्फ़िगरेशन फ़ाइल का उपयोग किया जाना चाहिए। (जैसा कि नाम सुझाव देता है :) )। डेटाबेस में विन्यास रखने से चिंताओं का अलगाव होता है और इसे ठीक करने के लिए आपके पास एक अच्छा उपयोग मामला होने पर ही किया जाना चाहिए।

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

आपके द्वारा वर्णित मामले में यह परिभाषित करना उचित होगा कि किस सीएसएस फ़ाइल को उपयोग करने के लिए परिभाषित किया जाए। (आप तब इसे बदल सकते हैं यदि आवश्यकताएं बदल जाती हैं)। यह कॉन्फ़िगर फ़ाइल में प्रत्येक तत्व की शैली को कॉन्फ़िगर करने के लिए ओवरकिल होगा


1
आप कैसे परिभाषित करते हैं कि कॉन्फ़िगरेशन क्या है और डेटा क्या है?
nafg

3
आपका उत्तर यह नहीं बताता है कि किसी डेटाबेस में कॉन्फ़िगरेशन को संग्रहीत करना चिंताओं के अलगाव का उल्लंघन क्यों करता है (डेटाबेस की चिंता डेटा को संग्रहीत करने के लिए है; यह परवाह नहीं करता है कि आप वहां कौन सा डेटा संग्रहीत करते हैं), या यह एक बुरी बात क्यों है, और आपका उत्तर अब प्रमाण के रूप में अन्यत्र उद्धृत किया जा रहा है कि यह एक बुरी बात है।
रॉबर्ट हार्वे

डेटाबेस मांग पर बदल सकते हैं। हम उन्हें mysql की तरह अतुल्यकालिक हो सकते हैं। क्या स्थिर फाइलें इसका समर्थन करती हैं? बिलकुल नहीं! इसलिए मैं नीचे चला गया :)
AmirHossein

@AmirHossein स्टेटिक फ़ाइलें मांग पर परिवर्तन का समर्थन करती हैं जब तक कि वे लॉक न हों। वह कोई तर्क नहीं है।
ज़िमानो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.