2012-12-18 27 views
5

SO के समान बैज सिस्टम को कोड करने के बारे में बहुत सारे प्रश्न हैं, मेरा प्रश्न अलग है। मान लें कि मेरे पास उपलब्धि कुंजी (आईडी), उपयोगकर्ता आईडी और कोई अन्य डेटा के साथ एक पंक्ति के रूप में डीबी में संग्रहीत एक वेब पेज सिस्टम, बैज/उपलब्धियां हैं।उपलब्धियों/बैज के लिए आर्किटेक्चर

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

मैं कठिन

public int Key { get { return 15; } } // I'm calling it Key, not ID 

की तरह, कक्षा में उन्हें कोड सकता है, लेकिन अगर मैं एक से अधिक फ़ाइलों के बीच मेरी उपलब्धियों को विभाजित मैं जब मैं एक नया जोड़ने के उच्चतम कुंजी की तलाश में चारों ओर चलने के लिए है नहीं करना चाहती एक और एक गलती का जोखिम।

मैं उन्हें एक और कक्षा में कुछ शब्दकोश में डाल सकता है ...

public class AchievementSet 
{ 
    private Dictionary<int, Achievement> _achievements; 

    public AchievementSet() 
    { 
     _achievements = new Dictionary<int, Achievement>() 
     { 
      { 1, new SomethingAchievement() } 
     }; 
    } 
} 

लेकिन अब वर्ग खुद अपनी ही कुंजी पता नहीं है, और यह करने की जरूरत है (या यह करता है?) अगर मैं पारित कर दिया यह अब कन्स्ट्रक्टर में है, मैं संख्याओं को मेल नहीं कर रहा हूं।

कोई सिफारिशें?

+1

आप बैज को डेटाबेस में क्यों स्टोर नहीं करेंगे? –

+1

मुझे लगता है, क्योंकि प्रत्येक बैज से जुड़ा कोड है और आपको अभी भी बैज आईडी के साथ कोड के उस टुकड़े से मिलान करने की आवश्यकता होगी। तो यह मूल रूप से कुछ हल नहीं करेगा। – guillaume31

उत्तर

2

स्टैक ओवरफ़्लो के संदर्भ में, मैं प्रत्येक बैज कल्पना जैसे गुण है: आईडी, नाम, कक्षा (कांस्य, रजत या स्वर्ण) और विवरण आदि

आप उल्लेख आप वर्तमान में एक है प्रत्येक बैज/उपलब्धि के लिए कक्षा, प्रत्येक परिस्थितियों के लिए उचित जांच के साथ जिसमें इसे सम्मानित किया जाएगा।

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

तालिका में अपने बैज संग्रहीत करके, आपका डेटा एक तार्किक स्थान पर है और आपके आवेदन में बिखरा हुआ नहीं है।

सवाल का जवाब में: तो आप करने के लिए स्वीकार किए जाते हैं जवाब से असहमत कार्य करें: stackoverflow.com/questions/3162446/

ज़रूरी नहीं है, और मैं इस विचार को एक एकल वर्ग है कि सभी के आधार पर बैज की जाँच करेगा के लिए मेरे पहले प्रस्ताव की तुलना में अधिक पसंद उनकी आईडी

इसके नाम के बावजूद, मेरा मानना ​​है कि रेक्सएम CommenterBadge को उस फ़ाइल में स्वयं परिभाषित नहीं कर रहा है और इसे CommenterBadgeJob नाम दिया जाना चाहिए था। (आप देखेंगे कि मेरे पास मेरे उत्तर में परिभाषित कोई भी गुण नहीं है और BadgeJob से विरासत प्राप्त है)। स्पष्ट सवाल यह है कि "प्रत्येक बैज नौकरी कैसे जानता है कि यह बैजआईड किससे मेल खाता है?"

मेरे पास Badge में BadgeJob नामक एक अतिरिक्त अनूठा क्षेत्र होगा जिसके द्वारा आप बैज को देख सकते हैं।

enum BadgeClass {Bronze, Silver, Gold} 

//This class would be inherited from the database. 
public class Badge 
{ 
    public int Key {get;set;} 
    public string Name {get;set;} 
    public BadgeClass Class {get;set;} 
    public string BadgeJob {get;set;} 
    public string Description {get;set} 
} 

मैं इस प्रकार के रूप में अपने कोड को संशोधित करेगा:

public class CommenterBadgeJob : BadgeJob 
{ 
    public Badge commenter_badge {get;set;} 
    public CommenterBadgeJob() : base() 
    { 
     //Lookup badge 
     string badge_job_name = this.GetType().Name; 
     commenter_badge = db.Badges.Where(n=>n.BadgeJob == badge_job_name).Single(); 
    } 

    protected override void AwardBadges() 
    { 
     //select all users who have more than x comments 
     //and dont have the commenter badge 
     //add badges 
    } 

    //run every 10 minutes 
    protected override TimeSpan Interval 
    { 
     get { return new TimeSpan(0,10,0); } 
    } 
} 
+0

तो क्या आप http://stackoverflow.com/questions/3162446/how-to-implement-badges?rq=1 के स्वीकृत उत्तर से असहमत हैं? – Tesserex

+0

मैंने अपना जवाब अपडेट कर लिया है। अगर मैं अस्पष्ट था, तो मुझे बताएं और मैं कुछ और जवाब देने का प्रयास करूंगा। – JoshVarty

+0

मैं सभी डेटा को एक डीबी में डालने के साथ चला गया हूं, जो अच्छी तरह से काम करता है क्योंकि मेरी अधिकांश उपलब्धियों में कुछ फ़ील्ड> = थ्रेसहोल्ड जैसी सरल स्थितियां होंगी। धन्यवाद! – Tesserex

2

कैसे एक enum का उपयोग कर के बारे में?

public enum BadgeTypes 
    { 
     GoodAnswer = 1, 
     Commenter  = 2, 
     Teacher  = 3, 
     //... 
    } 

प्रत्येक BadgeJob एक BadgeType संपत्ति जो जब (enum मूल्यों पूर्णांकों को कायम किया जा सकता है) AwardBadges() के दौरान उपलब्धि डालने बिल्ला आईडी पॉप्युलेट करने के लिए इस्तेमाल किया जाएगा हो सकता था।

मुझे एक कक्षा प्रति उपलब्धि रखने की आवश्यकता नहीं है। BadgeJob में सभी बैज एट्रिब्यूशन लॉजिक और BadgeTypes अलग-अलग बैज का प्रतिनिधित्व करने के लिए पर्याप्त हैं।

+0

लेकिन फिर प्रति उपलब्धि 'नौकरी' वर्ग नहीं है? ऐसा लगता है कि एक ही चीज़ ... मुझे एक "तर्क" वर्ग नहीं चाहिए जो हजारों लाइनें लंबी है। – Tesserex

+0

हां प्रति उपलब्धि एक नौकरी कक्षा है ("बैजजोब ** ** ** है ..." बहुवचन था)। क्षमा करें अगर वह स्पष्ट नहीं था। – guillaume31

+0

या, क्या आपका मतलब है, आप एक नौकरी कक्षा प्रति उपलब्धि नहीं चाहते हैं? मैं यह देखने में असफल रहा कि यह छोटा कैसे होगा:/ – guillaume31