2012-12-18 47 views
5

關於編碼與SO相似的徽章系統已經有很多問題了,我的問題是不同的。假設我有一個網頁系統,徽章/成​​就,與成就鍵(ID),用戶ID和任何其他數據一起存儲在數據庫中。成就/徽章的體系結構

我的簡單問題是,我應該在哪裏存儲徽章ID?每個成績我都有一門課,所有的數據和方法都可以用來測試是否已經獲得。我想我可能有幾十或幾百個點。我希望ID只能用於硬編碼一次,並且在一個簡潔的地方,所以我不會意外更改它們或混合它們。

我很難在類代碼它們,就像

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

我想,因爲每個徽章都有相關的代碼,您仍然需要將這段代碼與徽章ID進行匹配。所以它基本上不會解決任何問題。 – guillaume31

回答

2

在堆棧溢出的情況下,我想像每個徽章具有的屬性,如: ID,名稱,等級(銅牌,銀牌或金牌)和說明等

你提到,你現在有一個每個徽章/成就都有一個班級,每個班級都會對其頒發的條件進行適當的檢查。

我建議你離開你現在看到的模型(每個成就一班)的原因是因爲當你通過200導航時,你將繼續面臨巨大的問題不同的班級正在尋找你無法回憶的那個ID。

通過將您的徽章存儲在表中,您的數據都在一個合理的位置,而不是分散在您的應用程序中。

在這個問題的答案:那你接受的答案不同意:stackoverflow.com/questions/3162446/

不一定,我喜歡這個主意比我先前提出的提案多爲單個類,將檢查基礎上,所有徽章他們的ID。

儘管它的名字,我相信RexM沒有在該文件中定義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

如何使用枚舉?

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

每個BadgeJob可以具有BadgeType屬性,該屬性將被用來在AwardBadges()插入成就(枚舉值可被保持爲整數)當填充徽章ID。

我認爲沒有必要每個成績都有一門課。 BadgeJob包含所有徽章歸屬邏輯和BadgeTypes就足以表示不同的徽章。

+0

但是那麼每個成就沒有一個'作業類?這似乎是同一件事......我不想要一個長達數千行的「邏輯」類。 – Tesserex

+0

是的,每個成就有一個Job類(「BadgeJob **的**包含...」是複數)。對不起,如果不明確。 – guillaume31

+0

或者,你的意思是,你不希望每個成就都有一個Job類?我沒有看到這將會如何縮短:/ – guillaume31