Modo corretto per la memorizzazione dei dati per l'utilizzo in runtime in applicazioni stand-alone?

2

Sto lavorando a un progetto che coinvolge un'applicazione di tipo "team builder", se si utilizzerà C #.

Per semplicità, diciamo che coinvolge l'utente nella creazione di una "Squadra". Ci sono tre squadre tra cui scegliere.

Ogni squadra ha "posizioni", ad esempio, come Capitano, Sparatutto e Corridore.

Ogni Capitano ha 3 possibili scelte, con attributi diversi come "Nome", "Abilità" e "Età".

Per dare più di una rappresentazione visiva di questo:

  • Team1
  • = > CaptainATeam1
  • === > Nome
  • === > Skill
  • === > Età

  • = > CaptainBTeam1

  • === > Nome
  • === > Skill
  • === > Età

  • = > CaptaniCTeam1

  • === > Nome
  • === > Skill
  • === > Età

  • Team2

  • = > CaptainATeam2
  • === > Nome
  • === > Skill
  • === > Età

  • = > CaptainBTeam2

  • === > Nome
  • === > Skill
  • === > Età

  • = > CaptaniCTeam2

  • === > Nome
  • === > Skill
  • === > Età

Ora, tutti questi attributi sarebbero predefiniti e non cambiano mai. Quindi, CaptainATeam1 sarà SEMPRE "James", "Abile", "22".

Con tutto ciò detto, questa informazione dovrebbe essere lì per l'utilizzo in fase di esecuzione. Questa applicazione non sarebbe connessa a nessun tipo di database di qualche tipo, e verrebbe eseguita rigorosamente come applicazione indipendente.

La mia domanda è qual è il modo corretto per farlo?

Il pensiero corrente che ho è di memorizzare i dati in un pacchetto con l'applicazione sotto forma di un file flat per ogni squadra e posizione e di avere l'applicazione leggerli in memoria in fase di runtime quando necessario.

Ma ho anche pensato di creare i set di dati all'interno delle singole classi, con qualcosa di simile a questo (non testato e scritto rapidamente su Blocco note, ma il concetto è lì):

class Team1


var Captain;
var Shooter;
var Runner;

DataSet ds_team1 = new DataSet();
//used to populate a dataset to be used for a DropDown style selection list
public void PopulateCaptains()

{
DataTable dt_caps = new DataTable("Capitans");

dt_caps.Columns.Add("Name");
dt_caps.Columns.Add("Skill");
dt_caps.Columns.Add("Age");


DataRow dr_cap1 = new DataRow("Cap1");
DataRow dr_cap2 = new DataRow("Cap2");
DataRow dr_cap3 = new DataRow("Cap3");

dt_caps.Rows.Add(dr_cap1);
dt_caps.Rows.Add(dr_cap2);
dt_caps.Rows.Add(dr_cap1);

dr_cap1["Name"] = "James";
dr_cap1["Skill"] = "Skillfull";
dr_cap1["Age"] = "22";

//so on and so forth.

}

Ovviamente l'esempio sopra sarebbe una codifica molto ingombrante, invece di scrivere semplicemente un ciclo foreach attraverso file flat memorizzati nella cartella dell'applicazione. Tuttavia, ciò consente all'utente di manipolare le informazioni in questo file, causando la rottura del programma.

Quindi, quale sarebbe l'approccio corretto per affrontare questo?

C'è un modo corretto per affrontare questo?

Nota Se questa è considerata una domanda troppo ampia o soggettiva, faccelo sapere, così posso andare a cercare ulteriori informazioni, fornire maggiori informazioni o chiarire qualsiasi cosa.

Grazie per il tuo tempo.

    
posta Gary.Taylor717 09.05.2016 - 00:21
fonte

2 risposte

3

Prima di tutto, penso che il tuo codice sia decente e leggibile. Un paio di cose che vedo male con questa implementazione qui:

  1. Stai definendo implicitamente delle variabili usando var nello spazio globale. Suggerirei di cambiarli nei loro tipi reali. var è riservato alle definizioni implicite locali e in realtà questo non verrà compilato. Vedi questa domanda per un altro spiegazione dettagliata su questo.

  2. Quello che stai facendo è l'hard-coding dei dati nel tuo programma. Vuoi evitare questo quando è possibile. La serializzazione / de-serializzazione XML o JSON farà il trucco e non avrai bisogno di un database per raggiungerlo. Potresti decidere che un giorno vorresti utilizzare questi dati in un database. Oppure, lungo la strada, potresti decidere di voler utilizzare questi stessi dati in un'applicazione diversa. Quindi, in uno di questi due eventi, facendo la serializzazione renderai questo processo 10 volte più semplice. Vedi serializzazione XML o Serializzazione JSON .

Spero che questo aiuti.

    
risposta data 13.05.2016 - 00:28
fonte
3

Hai diverse scelte basate sulle tue esigenze.

  1. È possibile codificare in modo rigido i dati. Questo viene fatto abbastanza spesso nei test di unità / integrazione ed è un modo valido per archiviare questi dati. Rende piuttosto difficile cambiare, soprattutto per un BA / non sviluppatore.
  2. Puoi memorizzarlo in un file di qualche tipo. Il formato potrebbe essere JSON o XML o CSV, se lo desideri. Se si desidera impedire la modifica di questo file, è possibile aggiungere una verifica del checksum e interrompere se il checksum è diverso.
  3. Potresti salvarlo in un database. SQL Lite sarebbe una buona scelta per questo. È leggero, veloce e non richiede un'enorme installazione ingombrante come Oracle o SQL Server. Se i dati potrebbero dover cambiare nel corso del tempo, consiglio questa opzione.

Ricorda che il prototipo di oggi è il codice di produzione di domani. Solo perché pensi non avrai bisogno di modificare i dati non significa che non debba modificare i dati. Quasi certamente lo farai. Qualunque sia la soluzione che scegli, probabilmente rimarrai bloccato per un po 'di tempo, quindi scegli attentamente.

    
risposta data 13.05.2016 - 00:43
fonte

Leggi altre domande sui tag