Struttura della classe per implementare un sistema di revisione simile a Stack Exchange

3

Stavo rivedendo alcuni thread su Stack Overflow e ho iniziato a chiedermi come avrei progettato le mie classi e relazioni per creare un sistema del genere.

Il mio obiettivo -

Voglio creare un sistema di revisione come il sistema di revisione Stack Exchange.

Diamo un'occhiata a come funziona il sistema review su Stack Exchange. Mi riferirò solo alla funzionalità Modifiche suggerite per mantenerla semplice.

  1. Utente non esperto (meno di 2000 rappresentanti) modifica il post di qualcuno
  2. Aggiungi una voce al sistema "recensione" taggato "suggerito-modifica"
  3. L'utente esperto (più di 2000 rappresentanti) può rivedere "le modifiche suggerite" una per una

Come utente esperto posso:

  • Vedi la differenza tra il contenuto originale e il contenuto modificato
  • Approva la modifica
  • Rifiuta la modifica
  • Migliora la modifica
  • Passa alla prossima recensione

Nota finale su altri tipi di recensioni. Potremmo immaginare di "etichettare" le recensioni con i tipi corrispondenti poiché le azioni sono le stesse.

design

Vorrei iniziare con un modello Review . Potremmo avere una sottoclasse per ogni tipo di recensione, che consente attributi e metodi personalizzati per ogni tipo in futuro.

ruby

class Review
class Review::SuggestedEdit < Review
class Review::FirstPost     < Review
class Review::LateAnswer    < Review
class Review::LowQuality    < Review

Un oggetto Review avrebbe 2 riferimenti:

  • Contenuto originale
  • Contenuto modificato
Approvare
  1. Sostituisci il contenuto originale per contenuto modificato.
  2. Contrassegna la recensione come approvata.
  3. Passa alla recensione successiva.
Rifiutare
  1. registra il motivo del rifiuto.
  2. Contrassegna la recensione come rifiutata.
  3. Passa alla recensione successiva.
Migliorare
  1. Modifica direttamente il contenuto modificato.
  2. Approva.
  3. (Potremmo creare immagini creando una nuova recensione per questo miglioramento.)
  4. Passa alla recensione successiva.
Salta
  1. Passa alla recensione successiva.

Come dovrei strutturare le mie classi per costruire un sistema di revisione di questo tipo?

    
posta Pierre-Louis Gottfrois 15.08.2013 - 12:16
fonte

2 risposte

2

Questo sembra potenzialmente adatto per un "architettura" CQRS ( collegamento ) con Event Sourcing. Ciò di cui il tuo sistema si preoccupa non è tanto lo stato del modello di dominio, ma le modifiche ad esso - invece di mantenere le tabelle che mantengono lo stato corrente di ogni entità, le modifiche possono essere modellate e mantenute come eventi attivati dai comandi dell'interfaccia utente.

Lo stato attuale del sistema viene scoperto riproducendo tutti gli eventi, in modo da poter rifiutare le modifiche e ripristinare facilmente saltandole. Per questo motivo, le query potrebbero rallentare. Tuttavia, poiché hai già un approvvigionamento degli eventi, puoi mantenere i dati delle query come insiemi pre-calcolati e non normalizzati. Questi possono essere archiviati in tabelle dedicate, nella memoria cache o come file flat.

    
risposta data 08.12.2013 - 18:20
fonte
0

Non sono sicuro di come modellarlo esattamente, ma quello che stai descrivendo è molto simile a un sistema di controllo della versione. Come Svn per un VCS o git per un VCS distribuito

La capacità di tenere traccia delle modifiche, visualizzare / visualizzare o modificare diff, log, unire, ripristinare, tag / etichetta è tutto lì ed è particolarmente utile con le differenze di testo.

    
risposta data 08.12.2013 - 17:54
fonte

Leggi altre domande sui tag