2008-11-07 45 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