2009-02-07 8 views
33

Ich habe darüber nachgedacht, wie man die Badge-Funktion ähnlich wie SO auf einer neuen Website implementiert. Wie speichern Sie die Kriterien für Badges am besten?Die beste Methode zum Speichern von Badge-Kriterien?

Zwei Ideen:

  • Alle Code
  • 'Das zweite System' - eine Meta-Architektur für die Definition Abzeichen und ihre Kriterien erstellen. Speichern Sie einige Informationen in der Datenbank und lassen Sie Code abfragen, um die Abzeichen und ihre Kriterien herauszufinden.

Gibt es bessere Möglichkeiten?

Antwort

37

Regeln.

Sie erstellen Ereignisse im System und verwenden Regeln in einem Ereignisstromprozessor.

Genauer gesagt sagen Sie, Sie haben ein Abzeichen "10 Beiträge gemacht". Sie führen "Select count (*) von Posts, bei denen user =: user" für jeden Post nicht aus. Stattdessen haben Sie eine einfache Regel, die jeden Post, der vorbeikommt, überwacht und "sie zählt", wobei der Regelstatus im Benutzerprofil gespeichert wird.

Auf diese Weise "10 Beiträge gemacht" ist so billig wie "made 1.000.000" Beiträge.

Dies macht das System auch viel erweiterbarer.

+9

Wenn Sie diesen Weg gehen, seien Sie vorsichtig mit den Fällen, wenn Sie ein neues Abzeichen hinzufügen und analysieren müssen, welche vorhandenen Benutzer es bereits verdient haben sollten. –

+0

Ja, ein absoluter Nachteil des Systems, aber immer noch flexibler und skalierbarer, da (normalerweise) das Hinzufügen neuer Badges weit weniger als das Testen und Vergeben von Badges geschieht. –

+0

Also, wie würden Sie damit umgehen, Abzeichen auf der Straße hinzuzufügen? Nehmen wir an, ich habe ein neues Abzeichen wie das "woot" - Abzeichen, das SO hinzugefügt hat. Wie würdest du es rückwirkend machen? – Micah

18

Ich stimme Will auf diesem.

Erstellen Sie "Ereignisse" über die Seiten, also jedes Mal, wenn ein Ereignis eintritt, dh. Ein Benutzer löscht einen Beitrag, er fragt das Ereignismodul mit dem Ereignis ab, beispielsweise EVENT_USER_DELETE_POST, und dann können Sie dieses Ereignis auswählen und eine darauf basierende Abfrage erstellen. Sie können dann entscheiden, ob ein Abzeichen verliehen wird oder nicht.

Dadurch bleiben die beiden Logiken getrennt und modular aufgebaut. Es sollte sehr einfach sein, dies zu implementieren.

Der einzige Nachteil ist, dass, wenn das Ereignis nicht "erfasst" wurde, ein Benutzer möglicherweise ein Badge-Kriterium verdient hat, aber noch nicht belohnt wurde. Dies sollte jedoch niemals auftreten. Die einzige Situation, an die ich denken kann, ist, wenn die Datenbank manuell manipuliert wird.

Verwandte Themen