Mantenere un enum e una tabella sincronizzati

11

Sto facendo un programma che pubblicherà i dati su un database, e mi sono imbattuto in uno schema che sono sicuro sia familiare: una tabella breve di valori fissi molto probabilmente (molto probabilmente) che servono come un enum. Supponiamo quindi che la seguente tabella sia chiamata Status :

  Status
  Id Description
  --------------
   0 Unprocessed
   1 Pending
   2 Processed
   3 Error

Nel mio programma devo determinare un ID di stato per un'altra tabella o eventualmente aggiornare un record con un nuovo ID di stato.

Potrei hardcode l'ID di stato in un enum e spero che nessuno cambi mai il database. Oppure potrei pre-recuperare i valori in base alla descrizione (in tal modo, che codifica ).

Quale sarebbe l'approccio corretto per mantenere sincronizzati questi due enum e tabella?

    
posta MPelletier 28.11.2012 - 20:06
fonte

4 risposte

5

Vorrei inserire l'enum nel tuo programma, poiché sospetto che questi diversi stati influenzino la logica del tuo programma. Se hai un nuovo stato, come dovrebbe reagire il tuo programma a questo nuovo stato?

Poiché il database è parte della tua applicazione, non penso che abbia senso influenzarne uno senza consultare altro, in un certo senso.

    
risposta data 28.11.2012 - 20:12
fonte
8

Normalmente caricare questi dati in una cache statica (di solito in una HashMap o qualcosa del genere) all'avvio dell'applicazione. Evita di dover ricompilare solo perché l'enum è stato modificato in qualche modo.

    
risposta data 28.11.2012 - 20:12
fonte
1

Poiché si tratta di stati, dovrebbero essere codificati nell'applicazione per garantire che nessuna modifica del DB possa danneggiare il programma (almeno non facilmente). Questo è importante perché ogni stato che deve essere aggiunto deve essere prima codificato e non semplicemente aggiunto al DB.

Dovresti comunque avere quei valori di stato scritti nel DB con le loro descrizioni corrette nel caso in cui tu debba estrarre un rapporto, per esempio.

Di solito ho un piccolo snippet di codice che si connetterà al DB e verificherà che gli stati elencati in una tabella specifica abbiano tutti gli stessi valori id / name che ho hardcoded in memoria. Se non corrispondono, interromperò l'esecuzione del software.

A seconda delle tue esigenze, potresti voler implementare comportamenti leggermente diversi, ma nel complesso è una buona idea avere questi stati codificati in ogni caso.

    
risposta data 29.11.2012 - 03:27
fonte
1

Abbiamo problemi simili sul mio progetto (codice legacy, evviva!) Il problema principale è che "le tabelle enumerate non cambiano mai" finché non lo fanno e le interruzioni di codice. Ho due strategie per mitigare quello verso cui sono lentamente migrato.

Per prima cosa, e meglio, eliminare i riferimenti diretti a questi valori ogni volta che è possibile. Chiedi sempre: "perché devo usare direttamente il valore enum?" In molti casi, questo è un segno che il codice ha troppe assunzioni hard coded o sta cercando di fare troppa manipolazione sui dati. Verifica se non è possibile creare relazioni migliori nel database o codice più flessibile per gestire ciò che viene manipolato.

Quando non funziona, vado al piano B: generazione del codice. Poiché le tabelle cambiano di rado e pubblichiamo regolarmente nuove build, un generatore di codice può leggere le tabelle enum e scrivere il codice enum. Questa libreria generata dinamicamente viene quindi utilizzata nel progetto. Se il DB cambia, la prossima build non verrà compilata, il che è molto meglio che ottenere misteriosi errori di runtime.

    
risposta data 29.11.2012 - 06:01
fonte

Leggi altre domande sui tag