2008-11-07 17 views
9

我正在考虑在我们的内部错误跟踪和时间记录系统中添加一些成就。它连接到SQL Server后端。向业务级软件添加成就的技巧

起初我以为,该系统可以在数据库上运行,使用触发器,例如,知道什么时候:

  • 创建

    • 你登录千小时
    • 1000票
    • 关闭你自己的票
    • 工作了一段时间以来一直没有触及的票。
    • 等(你知道 - 数据库十岁上下的东西)

    但后来我意识到,我也想纯粹前端achivements

    • 使用abiltiy
    • 排序高级搜索按列
    • 重置设置为默认值
    • 搜索500次

    看来每个成就的逻辑必须是手工编码的。任何人都可以想象某种成就规则引擎,你为例如创建脚本?

    以及如何存储它们?如果成绩是:

    • 更改列的排序顺序在一个会话

    50倍,将意味着他们每次排序列表视图列它更新数据库。

    有关此Win32应用程序设计问题的任何想法?我不认为Gang of Four有成就设计模式


    注:这是一个Win32客户端应用程序,而不是一个网站。


    我非常喜欢事件系统的想法。用户需要能够通过一个单一的事件触发对象引发事件的各种操作:

    protected void TimeEntriesListView_ColumnSort(object sender, EventArgs e) 
    { 
        _globalListener.RaiseEvent(EventType.ListViewColumnSort, sender, e); 
    } 
    
    protected void TimeEntriesListView_ColumnDrag(object sender, EventArgs e) 
    { 
        _globalListener.RaiseEvent(EventType.ListViewColumnDrag, sender, e); 
    } 
    

    这个对象就可以有逻辑添加到它决定它要数它的事件。但更合理的是,各种事件监听器可以附加到中央事件监听器,并具有他们的自定义成就逻辑。

  • 回答

    5

    诀窍不是规则的编码,实际上,这些都很简单,也可能是简单的表达式(number_of_bugs> 1000)。

    诀窍在于积累统计数据。您应该查看事件流处理的一种形式来记录您的成就。例如,您并不是真的想要通过“来自用户=:用户”的错误的“选择count(*)”来实现“1000 bug”成就(您可以这样做,但可以证明不应该)。相反,每次发布错误时你都应该得到一个事件,而你的成就系统记录“发现了另一个错误”。然后规则可以检查“number_of_bugs> 1000”。

    很明显,您可能需要“灌注泵”,可以说,在开始实现系统时,将number_of_bugs设置为数据库中的当前编号。

    但是,我们的目标是保持实际事件处理的轻量化,因此可以让事件跟踪所有事件在公共内部管道或总线上运行时的事件。

    脚本语言也是一个好主意,因为它们可以轻松评估表达式和更复杂的逻辑。例如,“number_of_bugs> 1000”是一个完全有效的Javascript程序。游戏刚刚开始建立环境。

    您还可以将脚本存储在数据库中,并假设您捕获了所有相关事件,则可以创建一个“成就”编辑器以便随时添加它们。

    +0

    我确定喜欢事件系统的想法。 – 2008-11-07 19:46:31

    1

    后端成就应该很简单 - 它们似乎基于已经跟踪的项目。正如你所说的,前端将需要更多的追踪。您可能想要做的一种方式是为您的前端网站实施分析引擎。

    Piwik在http://www.piwik.org可能有帮助 - 这是一个谷歌分析克隆,你主办自己。这个想法是利用它的记录功能来追踪成就何时完成。

    至于规则的某种形式的脚本,你将永远需要手工编写代码 - 尽管你可以通过创建你自己的小脚本引擎或实现一个自定义的Lua集来简化它。

    +0

    它不是一个网站,而是一个完整的Win32客户端应用程序 – 2008-11-07 19:43:44

    1

    如何将与成就相关的sql查询存储在数据库本身中,因此添加新成就只会涉及到为其添加名称和sql查询。

    例如,

    你已经记录了1000个小时 - “select case sum(hours)> 1000 then'true'else'false'end from user where user_id =?”

    基于UI的成就将不得不将数据存储在数据库中,因为您可能会将相同的数据用于未来的其他成就。

    3

    我也试图找出如何建立成就规则引擎。

    我检查了规则引擎,它的基本原理是什么。有一个good summary of that in wikipedia

    基本上,你或者有,当你,例如,检查可用性的东西;否则,您使用Event Condition Action规则。其最新引起了我的注意。

    所以你可以预定义一组触发事件。在引擎中,您可以定义基于可用指标的检查条件是什么,并指定关联成就。

    这种方式似乎更加灵活,但您必须定义事件,可能的条件检查和指标。

    例如,您将在代码中触发各种事件,如TicketCreated。

    在规则引擎中,你可以有类似

    Event: TicketCreated 
    Condition: UserTicketCount >= 1000 
    Achivement: "Created 1000 tickets" 
    

    或者“复位设置为默认值”

    Event: SettingsChanged 
    Condition: Settings = DEFAULT 
    Achievement: "Reset to Default" 
    

    我还没有尝试过,但我要漂亮不久。现在这主要是理论上的。

    1

    我认为一张桌子可容纳您想要跟踪的每个事件。如“执行搜索”。然后每个成就可以有一个与之相关的SQL。

    你可以再建一个触发器,在事件表,这比较适用于该事件所取得的成就,以及成就添加到的政绩观表。

    下面是匆匆表设计:

    EventItems: 
    UserId, EventName, DateOccured, AnyOtherInfo 
    
    AchievementQualifiers: 
    Achievement Name, AchievementCheckSQL, EventsThisAppliesTo 
    (Normalize this, if multiple events apply) 
    

    在你系统,天气其网站或Win32中,你根本当用户确实要跟踪一些事件插入EventItems表。你可以让一个班级来处理这个问题。对于纯粹的DB类型的事件,比如“Item Posted”或“Comment Posted”,你可以用触发器代替。

    然后,在EventItems触发器,每个AchievementQualifer是有EventThisAppliesTo,运行SQL检查,如果这是真的,并没有被授予更新UserAchievement表。

    打扰我的拼写,因为我正在打字时坐在啤酒吧。

    +0

    我首先喜欢这个主意。但是,一些基于UI交互的成就(例如,列排序,列大小调整,列重新排序)是图形应用程序中的事情,我不希望每次都打开数据库时减慢UI。网络上的情况会更糟,Javascript会对列进行更改。如果每次使用数据库事件完成,就会有很多事件要写,使得它非常“健谈”。巴,这是一个难题。 – 2009-11-20 12:48:50