2012-12-18 44 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