2012-12-18 13 views
5

Ci sono già molte domande sulla codifica di un sistema di badge simile a SO, la mia domanda è diversa. Supponiamo che disponga di un sistema di pagine Web, badge/obiettivi, archiviato nel DB come una riga con la chiave di conseguimento (id), l'ID utente e qualsiasi altro dato.Architettura per realizzazioni/distintivi

La mia semplice domanda è: dove dovrei memorizzare l'ID del badge? Ho una classe per risultato con tutti i dati e i metodi per testare se è stata guadagnata. Immagino che potrei avere dozzine o centinaia ad un certo punto. Voglio che gli ID vengano usati con un codice fisso solo una volta, e in un posto conciso, quindi non ho alcuna possibilità di cambiarli o mescolarli accidentalmente.

potevo dura loro codice nella classe, come

public int Key { get { return 15; } } // I'm calling it Key, not ID 

ma se ho diviso i miei successi tra più file non voglio avere a correre intorno alla ricerca del tasto più alto quando aggiungo un nuovo uno e rischia un errore.

li ho potuto mettere in qualche dizionario in un'altra classe ...

public class AchievementSet 
{ 
    private Dictionary<int, Achievement> _achievements; 

    public AchievementSet() 
    { 
     _achievements = new Dictionary<int, Achievement>() 
     { 
      { 1, new SomethingAchievement() } 
     }; 
    } 
} 

Ma ora la classe stessa non conosce la propria chiave, e ha bisogno di (o lo fa?) Se ho superato nel costruttore ora risulto mismatching i numeri.

Qualche consiglio?

+1

Perché non memorizzare i badge nel database? –

+1

Suppongo, poiché il codice associato a ciascun badge è associato e dovresti ancora abbinare quella parte di codice con l'ID del badge. Quindi fondamentalmente non risolverebbe nulla. – guillaume31

risposta

2

Nel contesto di Stack Overflow, mi immagino ogni medaglia è proprietà quali: Id, Nome, Classe (bronzo, argento o oro) e descrizione, ecc

si parla che si dispone di un classe per ciascun badge/risultato, ciascuno con i controlli appropriati per le condizioni in cui verrebbe assegnato.

La ragione per cui ti sto suggerendo di allontanarti dal modello che stai guardando ora (una classe per risultato) è perché continuerai ad affrontare enormi problemi lungo la strada quando stai navigando attraverso 200 classi diverse alla ricerca di quell'ID che non puoi ricordare.

Memorizzando i badge nella tabella, i dati si trovano tutti in un posto logico e non sparsi nell'applicazione.

In risposta alla domanda: così fanno sei d'accordo con la risposta accettata a: stackoverflow.com/questions/3162446/

Non necessariamente, e mi piace questa idea più che la mia precedente proposta per una singola classe che controlla tutti i distintivi sulla base di il loro ID.

Nonostante il nome, ritengo che RexM non stia definendo lo stesso CommenterBadge in tale file e lo abbia denominato CommenterBadgeJob. (Noterai che non ha nessuno dei tratti che ho definito nella mia risposta ed eredita da BadgeJob). La domanda ovvia è "come fa ogni lavoro di badge a sapere a quale BadgeId corrisponde?"

Avrei un campo unico aggiuntivo nel mio Badge chiamato BadgeJob con cui è possibile cercare un badge.

enum BadgeClass {Bronze, Silver, Gold} 

//This class would be inherited from the database. 
public class Badge 
{ 
    public int Key {get;set;} 
    public string Name {get;set;} 
    public BadgeClass Class {get;set;} 
    public string BadgeJob {get;set;} 
    public string Description {get;set} 
} 

vorrei modificare il suo codice come segue:

public class CommenterBadgeJob : BadgeJob 
{ 
    public Badge commenter_badge {get;set;} 
    public CommenterBadgeJob() : base() 
    { 
     //Lookup badge 
     string badge_job_name = this.GetType().Name; 
     commenter_badge = db.Badges.Where(n=>n.BadgeJob == badge_job_name).Single(); 
    } 

    protected override void AwardBadges() 
    { 
     //select all users who have more than x comments 
     //and dont have the commenter badge 
     //add badges 
    } 

    //run every 10 minutes 
    protected override TimeSpan Interval 
    { 
     get { return new TimeSpan(0,10,0); } 
    } 
} 
+0

Quindi non sei d'accordo con la risposta accettata a http://stackoverflow.com/questions/3162446/how-to-implement-badges?rq=1? – Tesserex

+0

Ho aggiornato la mia risposta. Se non avessi chiarito, fammi sapere e cercherò di rivedere la mia risposta ancora. – JoshVarty

+0

Ho passato con il mettere tutti i dati in un DB, che funziona bene poiché la maggior parte dei miei risultati avrà condizioni semplici, come alcuni campi> = soglia. Grazie! – Tesserex

2

ne dite di usare un enum?

public enum BadgeTypes 
    { 
     GoodAnswer = 1, 
     Commenter  = 2, 
     Teacher  = 3, 
     //... 
    } 

Ogni BadgeJob potrebbe avere una proprietà BadgeType che sarebbe utilizzato per popolare il distintivo id quando si inserisce un risultato durante AwardBadges() (valori enum possono essere persistenti a numeri interi).

Non vedo alcuna necessità di avere una classe per risultato. BadgeJob contengono tutte le logiche di attribuzione del badge e BadgeTypes sufficienti per rappresentare i diversi badge.

+0

Ma poi non c'è una classe 'Job' per risultato? Sembra la stessa cosa ... Non voglio una classe "Logica" lunga migliaia di righe. – Tesserex

+0

Sì, esiste una sola classe di lavoro per risultato ("BadgeJob ** 's ** contiene ..." era plurale). Scusa se non era chiaro. – guillaume31

+0

Oppure, vuoi dire, non vuoi una classe di lavoro per risultato? Non riesco a vedere come sarebbe più breve:/ – guillaume31