您可能會感興趣this answer對您有幫助。
從經驗說起,構建一個基於數據庫的規則引擎來響應用戶操作是一個非常耗時,容易出錯,痛苦的操作。
相反,您可以編寫任意數量的單個類,每個類負責知道如何獎勵一項特定成就。使用一個基類或接口給他們所有的共用簽約:
public abstract class AchievementAwarder
{
//override to provide specific badge logic
public abstract void Award();
}
您可以foreach
在每個AchievementAwarder
和重複性計劃調用Award()
。例如,你可以有一個「100次訪問」成果:
public class 100VisitsAwarder : AchievementAwarder
{
public override void Award()
{
//get a visit count from the db for all users
//award achievements
}
}
這解決了兩個問題:
它的大小簡單的命令,但更靈活,比基於數據庫的規則引擎。正如您所看到的,單個單位非常小,易於更改,而不會影響較大的系統。
它可以異步運行,因此對於需要一些繁重工作以確定是否應該頒發的成就,用戶的正常活動不受成績引擎的影響。
@Rex M - 聽起來不錯!對於你給它的例子將是一個cron工作類型的查找。你會如何推薦用戶採取的行動?例如,他們發佈新的「東西」,這是第100個,所以給他們一個成就。同時假設發佈一個新的「事物」可能有許多成就。 – Chaddeus 2010-07-21 06:17:14
@Chad對於遲到的回覆感到抱歉 - 回答你的問題,正如你所說,這最適合作爲cron作業,或者在我鏈接的其他答案中,是一個在應用程序啓動時初始化的自插入緩存對象。爲了簡單和性能,你最好的選擇就是儘可能地避免將它直接連接到用戶的操作上。在許多情況下,在促使你超越邊緣的行爲與獲得的獎勵之間延遲幾分鐘會更好。 – 2010-07-26 12:29:41
@ Rex M - 謝謝... Foursquare是如何做到的?我不使用它,但是當用戶解鎖徽章時,他們是否立即得到它?或者當cron工作流逝時,它會被獎勵嗎? 我絕對喜歡保持網站性能的想法!剛剛在主頁上加載了.48秒。:D – Chaddeus 2010-07-27 03:00:10