Stackoverflow有一个很棒的勋章系统。有一件事情我注意到了,那就是勋章不会立即颁发,但有时在我满足条件后似乎会有一定的延迟。我在其他一些也有勋章的网站上也注意到了这一点。
这可能是因为他们使用了延迟作业,定期扫描以查看是否需要授予新的勋章。我在这里也看到了这种方法的建议:
如何实现勋章?
然而,我真的不明白为什么这是必要的,并且在我的实现中倾向于简单地拥有一个系统,在执行相关操作(例如发布新评论)后,调用checkAwardBadge函数,该函数检查用户是否符合获得新评论徽章的条件。
在速度方面,我想所有相关的用户统计数据都将简单地存储在User的子模型中,例如UserStats,这样每次不需要再次计算评论数量,只需进行简单的查询即可。
我认为,我倾向的系统应该快速且非常容易理解。这里有我所忽略的缺点吗,为什么有必要用延迟作业来复杂化事情?
澄清一下: 我计划有一个抽象类Achievements,每个实际的成就都是Achievements的一个实现。每个成就将具有一个checkAwardBadge函数,它可以从控制器中调用,甚至是延迟作业(如果我选择这条路),或者任何时候,来检查用户是否获得了某个勋章。因此,成就代码将集中在一起。