2012-06-28 5 views
5

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

प्रश्न यह है कि कोड में इन स्थैतिक चर स्थित होना चाहिए। वर्तमान में, उत्पाद श्रेणी श्रेणी (जो मॉडल प्रतिनिधित्व भी है) में एक स्थिर सूची परिभाषित की जाती है, यदि खाली डीबी को कॉल करता है और उत्पाद श्रेणियों को लोड करता है। इसी प्रकार, सिटी क्लास की एक समान स्थिर सूची है और इसी तरह।

इन स्थिर सूचियों का उपयोग पूरे एप्लिकेशन में किया जाता है। मैं स्टेटिकडाटा नामक एक वर्ग बनाने और फिर इस वर्ग के भीतर सभी स्थिर सूचियों को रखने की सोच रहा था। यही कारण है कि अब

ProductCategory.AllCategories.Find(p => p.Id = 2) 

के बजाय है मैं

StaticData.AllProductCategories.Find(p => p.Id = 2) 

है कौन आपको लगता है एक बेहतर तरीका है होगा? मैं टेस्टेबिलिटी और डिकूप्लेड कोड का भी लक्ष्य रख रहा हूं।

इसके अलावा, क्या इन्हें हासिल करने का एक बेहतर तरीका है? आप अपने कोड में कुछ ऐसा कैसे करते हैं?

उत्तर

3

यदि यह पर्याप्त स्थिर अपने कोड में संकलित किया जा करने के लिए है, और कभी नहीं आप एक स्थिर वर्ग इस्तेमाल कर सकते हैं, उदाहरण के लिए देख turning enums into classes की आम पैटर्न क्रम में परिवर्तित करने के लिए है। ,

public class Vehicle 
{ 
    public static Vehicle Car = new Vehicle("Car"); 
    public static Vehicle MotorBike = new Vehicle("MotorBike"); 
    public static Vehicle PeopleMover = new Vehicle("PeopleMover"); 

    private Vehicle(string name) 
    { 
     this.name = name 
    } 
    private string name; 
} 

एक enum या कि एक तरह स्थिर सदस्यों के साथ एक वर्ग का उपयोग मदद करनी चाहिए आप के रूप में अच्छी तरह से अपने कोड में उन बुरा जादू संख्या से छुटकारा पाने:

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

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

+0

हां, यह नमूना कोड है। वर्तमान में एक समान दृष्टिकोण का पालन किया जाता है। सवाल यह है कि ऐसे परिदृश्य हैं जहां कार, मोटरबाइक जैसे व्यक्तिगत स्थिर चर के अलावा, मैं एक संग्रह वाहन भी चाहता हूं, जो कोड में भी उपयोग किया जाता है। अब यह संग्रह कहाँ रहना चाहिए। वाहन वर्ग के भीतर या एक अलग वर्ग में? – shashi

+0

@sassyboy: मैं इसे कक्षा में डाल देता हूं, हां। मेरे पास 'ऑल' नामक एक स्थैतिक रीडोनली सरणी होगी जिसे आप फिर से चालू कर सकते हैं, जिसे आप 'गेट (इंट आईडी) {वापसी ऑल। फर्स्टऑर्डडिफॉल्ट (x => x.Id == id) जैसे उपयोगिता कार्यों के लिए भी उपयोग कर सकते हैं; } 'यदि आपके पास' आईडी' संपत्ति है, उदाहरण के लिए ... ('प्राप्त करें 'विधि, फिर भी' वाहन 'का सदस्य होने के नाते) –

3

मुझे लगता है कि आपको स्थैतिक चर के बजाय Cache का उपयोग करना चाहिए।

मैं अपने कोड के बारे में कोई विस्तार नहीं पता है, तुम ऐसा ही कुछ कर सकता है इसलिए यदि आप एक भंडार का उपयोग कर रहे: यदि आप एक रास्ता खोजने के लिए है अगर आप अपने कैश की गई इकाइयां बदल तो

if [cache contains object or collection I need] 
{ 
    return [object or collection from cache] 
} 
else 
{ 
    [get object or collection from database] 
    [save object or collection in cache] 
    return [object or collection from database] 
} 

, डीबी से ताजा डेटा पुनर्प्राप्त करने के लिए उन कैश किए गए प्रविष्टियों को हटाने के लिए।

+0

इस दृष्टिकोण की तरह ... –

+0

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

+0

डेटा कभी नहीं बदलता है। यही कारण है कि स्थैतिक चर को प्राथमिकता दी जाती है। मैं इस बात से सहमत नहीं हूं कि स्थैतिक चर के बजाय कैश एक बेहतर विकल्प है। और मैं कौन सा ऑब्जेक्ट कैश, व्यक्तिगत ऑब्जेक्ट्स या संग्रह में सहेजूंगा। – shashi

3

कोई आसान जवाब नहीं। आपके पास कई विकल्प हैं और आप पर विचार करने के जो एक अपने अनुप्रयोग के लिए बेहतर है होगा:

  • आप कैश किसी तरह का उपयोग कर सकते हैं।

    उत्पाद श्रेणियां अक्सर परिवर्तित नहीं होने पर शायद बहुत जटिल हो सकती हैं। यह आदर्श है जब आपके पास प्रदर्शन समस्याएं होती हैं (हजारों श्रेणियां जो अक्सर पढ़ी जाती हैं) और उत्पाद श्रेणियां अक्सर बदलती हैं। आप किसी भी ओपन-सोर्स कैश सिस्टम से लाभ उठा सकते हैं लेकिन यह समाधान अधिक जटिल हो सकता है।

  • आप उन्हें एक एनम के रूप में हार्डकोड कर सकते हैं।

    केवल 100% सुनिश्चित हैं कि उत्पाद श्रेणियां कभी नहीं बदलेगी ... हमेशा!

  • आपके पास एक आलसी सिंगलटन या स्टेटिक क्लास हो सकती है। (मेरी पसंदीदा)

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

    इनिट में लोड करें: स्टेटिक वैरिएबल को व्यावसायिक लॉजिक लेयर में स्थिरांक के रूप में रखना चाहिए, आपके मामले में आप एप्लिकेशन शुरू करने पर उत्पाद श्रेणियों को प्रीलोड कर सकते हैं और उन्हें हमेशा समय पर रख सकते हैं। इस दृष्टिकोण में आप एप्लिकेशन लोड में समय व्यतीत करते हैं।

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

    इनमें से किसी भी दृष्टिकोण में, प्रत्येक एप्लिकेशन पूल पुनरारंभ करने के बाद डेटा खो जाएगा, इसलिए यदि आप एक नया संस्करण जारी करते हैं तो आप डेटा रीफ्रेश करेंगे। डीबी के "आपातकालीन" अद्यतन के मामले में आप हमेशा बाद में एप्लिकेशन पूल को पुनरारंभ कर सकते हैं।

+0

अच्छी तरह से सवाल यह है कि स्थिर सूची उत्पाद श्रेणी श्रेणी का हिस्सा होनी चाहिए (जो मॉडल वर्ग है और इसमें डीबी से टेबल कॉलम से मेल खाने वाले सदस्य हैं) या स्थैतिक सूची एक अलग स्टेटिकडेटा कक्षा का हिस्सा होनी चाहिए, जिसमें उत्पाद श्रेणी, शहर इत्यादि के लिए स्थिर सूचीएं हैं – shashi

+0

मैं इसे एक अलग वर्ग में रखूंगा .. –

संबंधित मुद्दे