2010-05-25 18 views
5

io non so bene come porre questa domanda, quindi mi frase come esempio, invece:'statica costante /' affari

Immaginate in un'applicazione si dispone di un oggetto Country. Esistono due proprietà di questo oggetto: Name e una raccolta "Bordering Countries". Più proprietà potrebbero essere aggiunte in seguito, ma sarà il tipo di informazioni che cambierebbero molto raramente (ad esempio cambi di nomi/confini di paesi)

Diciamo che questa applicazione deve conoscere tutti i paesi del mondo. Dove memorizzeresti lo stato di questi oggetti? Come li avresti fatti nuovi? Sembra stupido immagazzinare tutto questo stato nel DB, poiché non cambierà molto spesso.

Un'opzione potrebbe essere quella di avere un oggetto di base "paese" astratto e una classe per ogni paese che eredita da questo con i dettagli di ciascun paese. Ma questo non mi sembra giusto.

Qual è il modo corretto di gestire questo tipo di oggetti?

AGGIORNAMENTI:

qualcuno ha chiesto circa la lingua: C#

Inoltre, vengo a questo da un punto di vista dell'applicazione web, quindi non ci sarebbe più installazioni client in cui mi sarei dovuto preoccuparsi di aggiornare i valori codificati.

La maggior parte delle persone ha suggerito di non codificare i dati, ma di utilizzare i file DB o XML per archiviare i dati. Qualcuno potrebbe fornire un esempio di come questo tipo di oggetto verrebbe "aggiornato" (ad esempio da un file XML)? Useresti qualche tipo di aiuto o metodo di fabbrica per ottenere l'istanza di un particolare paese?

+3

"non cambierà molto spesso" - mai visitato i Balcani? –

+1

In effetti, ma considererei questi cambiamenti "non molto spesso". – UpTheCreek

risposta

0

Hai una varietà di risposte, così ho pensato di aggiungere il mio valore di $ 0,02.

Personalmente ho sempre fissato gli elenchi fissi come questo (lo stesso con i codici postali). Detto questo, quando sarò nella tua posizione, ottimizzerò sempre la leggibilità. Vale a dire cosa avrà senso tra 6 mesi, quando ti sarai dimenticato di questo progetto e dovrai fare un po 'di manutenzione?

Se ho avuto a che fare con un database:

public class Country 
    { 
     public string Name { get; set; } 
     public Country[] BorderingCountries { get; set; } 

     public Country(iDB db, string name) 
     { 
      BorderingCountries = db.BorderingCountriesGet(name); 
     } 
    } 

tuo test di unità:

public UnitTest1() 
    { 
     iDB db = new DB(); 
     Country c = new Country(db, "Spain"); 
     Assert.AreEqual(2, c.BorderingCountries.Count()); 
     Assert.AreEqual(1, c.BorderingCountries.Count(b => b.Name == "France")); 
     Assert.AreEqual(1, c.BorderingCountries.Count(b => b.Name == "Portugal")); 
    } 

Oops! Probabilmente si desidera popolare l'intera lista (non uno alla volta!) DB:

static void Main(string[] args) 
    { 
     Countries countries = new Countries(new DB()); 
    } 

public class Countries 
    { 
     public List<Country> Items { get; set; } 
     public Countries(iDB db) 
     { 
      tblCountry[] countries = db.BorderingCountries(); 
      Items = new List<Country>(); 
      Country country = null; 
      foreach (var c in countries) 
      { 
       if (country == null || country.Name != c.Name) 
       { 
        country = new Country(c.Name); 
        Items.Add(country); 
       } 
       country.BorderingCountries.Add(new Country(c.BorderingCountry)); 
      } 
     } 
    } 


    public class Country 
    { 
     public string Name { get; set; } 
     public List<Country> BorderingCountries { get; set; } 
     public Country(string name) 
     { 
      this.Name = name; 
      BorderingCountries = new List<Country>(); 
     } 
    } 

    public interface iDB 
    { 
     tblCountry[] BorderingCountries(); 
    } 

    public class DB : iDB 
    { 
     public tblCountry[] BorderingCountries() 
     { 
      using (DataClassesDataContext dc = new DataClassesDataContext()) 
      { 
       return dc.tblCountries.ToArray(); 
      } 
     } 

    } 

Se mi è stato brutalmente che:

public class Countries 
{ 
    public List<Country> Items { get; set; } 
    public Countries() 
    { 
     Items = new List<Country>(); 
     Items.Add(new Country { Name = "Spain", BorderingCountries = new string[] { "France", "Portugal" }}); 
     Items.Add(new Country { Name = "France", BorderingCountries = new string[] {"Spain","Belgium"}); 
    } 
} 
+0

Perché i voti bassi ??? –

1

enumerazioni sono abbastanza utili per questo genere di cose. non parli della lingua che stai usando, ma in java, sono memorizzati in modo abbastanza efficiente come un indice ordinale (numero intero) e puoi sempre aggiungere nuovi valori alla fine dell'elenco di enumerazione.

+0

Sarebbe C# nel mio caso – UpTheCreek

3

Definitivamente nel DB. Caricali una volta (aggiorna periodicamente) e usali da lì. Dico definately DB, poiché molto probabilmente estrarrai i dati a fini di reporting e, se strutturato correttamente, puoi riutilizzare i dati del Paese anche per altre applicazioni.

1

Non credo che creare una gerarchia di classe sarebbe un buon progetto per il tuo problema. Invece vorrei memorizzare i valori nel database e avere una classe Paese generica che recupera lo stato del paese dal database.

1

Non cambierà molto spesso, si dice, ma in questo si indica che è in un punto. In questi casi, dovresti inserirlo in un archivio dati di qualche tipo, come indicato dagli altri, che si tratti di un database, di un file di testo o altro.

Ricordare che, se lo si inserisce in un enum o in una classe statica o in qualche altra parte della propria applicazione effettiva, l'utente finale non sarà in grado di modificarlo facilmente. Quindi se per qualche disastro naturale o guerra mondiale 3 alcuni paesi scompaiono, si fondono, si separano, si ottiene un nuovo tipo o nome governativo, è necessario essere in grado di aggiornare la lista dei paesi.

Si può semplicemente fare in modo che l'applicazione legga l'elenco dei paesi all'avvio e lo lasci in memoria. Si aggiornerà automaticamente al riavvio dell'applicazione.Un'altra opzione potrebbe essere quella di controllare i paesi aggiornati ogni periodo X e aggiornare l'elenco interno, se si tratta di un'applicazione che viene eseguita per un lungo periodo.

+0

Grazie per i suggerimenti. Per l'aggiornamento degli utenti finali: questo è nel contesto di un servizio basato sul Web, quindi i client non avrebbero eseguito le versioni dell'app e potrei ricompilarlo facilmente. – UpTheCreek

1

Come ha detto oedo, le enumerazioni dovrebbero fare il lavoro, ma se avete bisogno di più di un indice, potete usare un file xml. sarebbe dinamico, non è necessario compilare

+0

Quale approccio useresti per "rinnovare" un paese basato su un file xml? – UpTheCreek

+0

Bene, crea un nodo "Paesi", all'interno di questo nodo aggiungi nodi "Paese", genera un ID univoco per ogni paese, impostalo come proprietà.All'interno del tuo nodo "Paese" aggiungi elementi come "BorderCountries" e imposta l'id del paesi confinanti. Quindi per la lettura, analizza tutti gli elementi dei tuoi Paesi, influisce sull'ID + altre informazioni che ti piacciono, quindi ripassa il file xml per trovare gli elementi che dovrebbero essere il bordo, aggiungere a un elenco o un array del paese corrente. Spero che questo aiuto. – Ziggy

Problemi correlati