我在考虑在内部错误跟踪和时间记录系统中添加一些成就。它连接到SQL Server后端。
起初我认为系统可以在数据库上运行,使用触发器,例如,知道何时:
但后来我意识到我还想要纯粹的前端成就
似乎每项成就的逻辑必须是手工编码的。任何人都可以想象某种成就规则引擎,例如你为它创建脚本吗?
如何存储它们?如果成就是:
这意味着每次他们对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);
}
然后,该对象可以添加逻辑以决定它想要计数的事件。但更合理的是,各种事件侦听器可以附加到中央事件侦听器,并具有自定义成就逻辑。
答案 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 表,如果它是真的并且还没有被授予。
请原谅我的拼写,因为我正坐在一个酿酒酒吧里打字。