将成就添加到商务级软件的技术

时间:2008-11-07 15:57:34

标签: language-agnostic design-patterns

我在考虑在内部错误跟踪和时间记录系统中添加一些成就。它连接到SQL Server后端。

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

  • 你已经记录了1000个小时
  • 创建了1000张门票
  • 关闭了您自己的门票
  • 工作了一段时间没有碰过的机票。
  • 等(你知道 - 数据库是什么东西)

但后来我意识到我还想要纯粹的前端成就

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

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

如何存储它们?如果成就是:

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

这意味着每次他们对listview列进行排序时都会更新数据库。

有关此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 个答案:

答案 0 :(得分:5)

诀窍不是规则的编码,实际上,这些是直截了当的,也许可以是简单的表达式(number_of_bugs> 1000)。

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

显然,您可能需要“灌注泵”,在启动成就系统时将number_of_bugs设置为DB中的当前数字。

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

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

您还可以将脚本存储在数据库中并创建一个“成就”编辑器,如果您愿意,可以动态添加它们,假设您正在捕获所有相关事件。

答案 1 :(得分: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"

我还没有尝试过,但我很快就会去。它现在主要是理论上的。

答案 2 :(得分:1)

后端成就应该很简单 - 它们似乎基于已经跟踪过的项目。正如您所说,前端需要更多跟踪。您可能希望这样做的一种方法是为前端站点实施分析引擎。

@ http://www.piwik.org的Piwik可能会对此有所帮助 - 它是一个谷歌分析克隆,你自己托管。我们的想法是使用它的日志记录功能来跟踪成就何时完成。

至于某些形式的规则脚本,你总是需要手工编写它们 - 你可以通过创建自己的小脚本引擎或实现自定义Lua集来简化它。

答案 3 :(得分:1)

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

例如。

你已经记录了1000个小时 - “选择案例总和(小时)> 1000然后'true'其他'false'结束用户user_id =?”

基于UI的成就必须将数据存储在数据库中,因为您可以将相同的数据用于未来的其他成就。

答案 4 :(得分:1)

我认为有一个表可以容纳您要跟踪的每个事件。例如“执行搜索”。然后每个成就都可以有一个与之关联的SQL。

然后,您可以在事件表上构建一个触发器,该表将比较适用于该事件的成就,并将成就添加到 Achivement 表。< / p>

以下是快速表设计:

EventItems:
UserId, EventName, DateOccured, AnyOtherInfo

AchievementQualifiers: 
Achievement Name, AchievementCheckSQL, EventsThisAppliesTo 
(Normalize this, if multiple events apply)

在您的系统中,只要用户执行您想要跟踪的某个事件,您只需插入 EventItems 表即可在其网络或win32中使用。你可以创建一个类来处理这个问题。对于纯粹的数据库类型事件,例如“已发布项目”或“已发布评论”,您可以使用触发器执行此操作。

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

请原谅我的拼写,因为我正坐在一个酿酒酒吧里打字。