2010-05-25 7 views
5

Je ne sais pas comment poser cette question, donc je vais phrase comme un exemple à la place:objets métier « statique/Constant »

Imaginer dans une application que vous avez un objet Country. Il existe deux propriétés de cet objet: Name et une collection 'Bordering Countries'. Plus de propriétés pourraient être ajoutées plus tard, mais ce sera le type d'information qui changerait très rarement (par exemple changements de noms de pays/frontières)

Disons que cette application doit connaître tous les pays du monde. Où stockez-vous l'état de ces objets? Comment voulez-vous les nouveaux? Il semble stupide de stocker tout cet état dans la base de données, car il ne changera pas très souvent. Une option pourrait être d'avoir un objet de base abstrait 'pays' et d'avoir une classe pour chaque pays en héritant avec les détails de chaque pays. Mais cela ne me semble pas tout à fait correct.

Quelle est la bonne façon de traiter ces types d'objets?

MISES À JOUR:

Quelqu'un a demandé sur le langage: C#

Aussi, je viens à ce du point de vue de l'application web, donc il n'y aurait pas plusieurs installations client où je dois s'inquiéter de la mise à jour des valeurs codées en dur.

La plupart des gens ont suggéré de ne pas coder en dur les données, mais en utilisant les fichiers DB ou XML pour stocker les données. Est-ce que quelqu'un pourrait donner un exemple de la manière dont ce type d'objet serait «rajouté» (à partir, par exemple, d'un fichier XML)? Souhaitez-vous utiliser une sorte de méthode d'assistance ou d'usine pour obtenir l'exemple d'un pays particulier?

+3

« il ne changera pas très souvent » - jamais visité les Balkans? –

+1

En effet, mais je considère que ces changements se produisent «pas très souvent». – UpTheCreek

Répondre

0

Vous avez une variété de réponses, alors j'ai pensé ajouter une valeur de $ 0.02.

Personnellement, je ai toujours fixé des listes fixes comme ceci (même avec les codes postaux). Cela étant dit, quand je suis à votre poste, je vais toujours optimiser pour la lisibilité. Par exemple, qu'est-ce qui aura du sens dans 6 mois, quand vous avez oublié ce projet et que vous avez besoin d'entretien?

Si je devais le faire avec une base de données:

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

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

Votre test unitaire:

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! Vous voulez probablement remplir toute la liste (pas un à la fois!) 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(); 
      } 
     } 

    } 

Si je hardcoding il:

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

Pourquoi les votes vers le bas ??? –

1

Les énumérations sont très utiles pour ce genre de chose. vous ne mentionnez pas la langue que vous utilisez, mais en Java, ils sont stockés assez efficacement comme un index ordinal (entier) et vous pouvez toujours ajouter de nouvelles valeurs à la fin de la liste d'énumération.

+0

Il serait C# dans mon cas – UpTheCreek

3

Définitivement dans le DB. Chargez-les une fois (rafraîchissez périodiquement) et utilisez-les à partir de là. Je dis définitivement DB, car vous extrayez probablement des données à des fins de reporting, et si elles sont correctement structurées, vous pouvez également réutiliser les données de pays pour d'autres applications.

1

Je ne pense pas que créer une hiérarchie de classe serait un bon design pour votre problème. Au lieu de cela, je stockerais les valeurs dans la base de données et aurais une classe générique Country qui récupérerait l'état du pays depuis la base de données.

1

Cela ne changera pas très souvent, dites-vous, mais en ce que vous indiquez que peut changer à un moment donné. Dans ce cas, vous devez le placer dans une banque de données, comme l'ont indiqué les autres - que ce soit une base de données, un fichier texte ou autre. Gardez à l'esprit que si vous le placez dans une classe enum ou statique ou dans une autre partie de votre application, l'utilisateur final ne pourra pas le modifier facilement. Donc, si par catastrophe naturelle ou guerre mondiale 3 certains pays disparaissent, fusionnent, se séparent, obtiennent un nouveau type de gouvernement ou un nouveau nom, vous devez être en mesure de mettre à jour votre liste de pays.

Vous pouvez simplement demander à l'application de lire la liste de pays au démarrage et de la laisser en mémoire. Il sera automatiquement actualisé lorsque l'application redémarre.Une autre option serait de le faire vérifier les pays mis à jour chaque période X et mettre à jour la liste interne, si c'est une application qui fonctionne depuis longtemps.

+0

Merci pour les suggestions. Re mise à jour de l'utilisateur final: ceci est dans le contexte d'un service basé sur le Web, donc les clients ne seraient pas en cours d'exécution de l'application, et je pourrais facilement recompiler. – UpTheCreek

1

Comme dit oedo, les énumérations devraient faire le travail, mais si vous avez besoin de plus qu'un index, vous pouvez utiliser un fichier xml. ce serait dynamique, pas besoin de compilation

+0

Quelle approche utiliseriez-vous pour «réécrire» un pays basé sur un fichier xml? – UpTheCreek

+0

Eh bien, créez un noeud "Pays", à l'intérieur de ce noeud ajoutez des nœuds "Pays", générez un identifiant unique pour chaque pays, définissez-le comme propriété.À l'intérieur de votre "pays" ajouter des éléments comme "BorderCountries" et définir l'ID du pays frontaliers. Ensuite, pour lire, analyser tous les éléments de votre pays, affecter l'ID + autres informations que vous aimez, puis analyser le fichier xml pour trouver les éléments qui devraient être bordés, ajouter à une liste ou un tableau du pays actuel. Espérons que cette aide. – Ziggy

Questions connexes