我正在考虑为我们的内部错误跟踪和时间记录系统添加一些成就.它连接到SQL Server后端.
起初我认为系统可以在数据库上运行,使用触发器,例如,知道何时:
你已经记录了1000个小时
创造了1000张门票
关闭了自己的机票
工作在一段时间没有触及的机票上.
等等(你知道 - 数据库是什么东西)
但后来我意识到我也想要纯粹的前端成就
使用高级搜索abiltiy
按列排序
将设置重置为默认值
搜索了500次
似乎每项成就的逻辑必须是手工编码的.任何人都可以想象某种成就规则引擎,你可以创建脚本吗?
以及如何存储它们?如果成就是:
在一个会话中更改列排序顺序50次
这意味着每次他们对listview列进行排序时都会更新数据库.
有关此Win32应用程序设计问题的任何想法?我不认为四人帮有成就设计模式.
注意:它是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); }
然后,该对象可以添加逻辑以决定它想要计数的事件.但更合理的是,各种事件侦听器可以附加到中央事件侦听器,并具有自定义成就逻辑.
诀窍不是规则的编码,实际上,这些是直截了当的,也许可以是简单的表达式(number_of_bugs> 1000).
诀窍是累积统计数据.您应该查看一种事件流处理形式来记录您的成就.例如,你真的不想用"从用户=:用户的错误中选择计数(*)"来实现"1000个错误"的成就(你可以这样做,但可以说不应该).相反,你应该在每次发布错误时获得一个事件,并且你实现了系统记录"发现了另一个错误".然后规则可以检查"number_of_bugs> 1000".
显然,您可能需要"灌注泵",在启动成就系统时将number_of_bugs设置为DB中的当前数字.
但目标是保持实际事件处理的轻量级,因此让它跟踪事件,同时在公共内部管道或总线上运行所有事件.
脚本语言也是一个好主意,因为它们可以轻松地评估表达式和更复杂的逻辑.例如,"number_of_bugs> 1000"是一个完全有效的Javascript程序.游戏刚刚建立了环境.
您还可以将脚本存储在数据库中,并创建一个"成就"编辑器,如果您愿意,可以动态添加它们,假设您正在捕获所有相关事件.