2010-05-25 9 views
5

yo no sé muy bien cómo hacer esta pregunta, así que voy a expresarlo como un ejemplo en su lugar:objetos de negocio 'estático/Constante'

Imagínese en una aplicación que tiene un objeto Country. Hay dos propiedades de este objeto: Name, y una colección 'Bordering Countries'. Más propiedades podrían agregarse más adelante, pero será el tipo de información que cambiaría muy raramente (por ejemplo, cambios de nombres de países/fronteras)

Digamos que esta aplicación necesita conocer todos los países del mundo. ¿Dónde almacenarías el estado de estos objetos? ¿Cómo los descubrirías? Parece tonto almacenar todo este estado en la base de datos, ya que no cambiará muy a menudo.

Una opción podría ser tener un objeto base abstracto 'país', y tener una clase para cada país heredando de esto con los detalles de cada país. Pero esto no me parece del todo correcto.

¿Cuál es la forma correcta de tratar con este tipo de objetos?

ACTUALIZACIONES:

alguien le preguntó sobre el lenguaje: C#

Además, estoy viniendo esto desde una perspectiva de la aplicación web, por lo que no habría múltiples instalaciones de cliente en el que tendría que preocuparse por actualizar los valores codificados.

La mayoría de la gente ha sugerido que no se codifiquen los datos, sino que se utilicen los archivos DB o XML para almacenar los datos. ¿Alguien podría dar un ejemplo de cómo este tipo de objeto se 'actualizará' (desde, por ejemplo, un archivo XML)? ¿Usarías algún tipo de ayuda o método de fábrica para obtener la instancia de un país en particular?

+3

"no va a cambiar muy a menudo" - Ha visitado alguna vez los Balcanes? –

+1

De hecho, pero consideraría que estos cambios ocurren 'no muy a menudo'. – UpTheCreek

Respuesta

0

Tiene una variedad de respuestas, así que pensé en agregar mi valor de $ 0.02.

Personalmente, siempre digo listas fijas de código duro como esta (lo mismo con los códigos postales). Dicho esto, cuando estoy en su posición, siempre optimizaré para la legibilidad. es decir, ¿qué tendrá sentido dentro de 6 meses, cuando se haya olvidado de este proyecto y tenga que realizar un mantenimiento?

si tuviera que hacerlo con una base de datos:

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

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

Su unidad de prueba:

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")); 
    } 

Ups! Es posible que desee para rellenar la lista entera (no uno a la vez!) 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 me hardcoding que:

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

¿Por qué los votos hacia abajo? –

1

enumeraciones son bastante útiles para ese tipo de cosas. no menciona el idioma que está utilizando, pero en java, se almacenan de manera bastante eficiente como un índice ordinal (entero) y siempre puede agregar nuevos valores al final de la lista de enumeración.

+0

Sería C# en mi caso – UpTheCreek

3

Definitivamente en la base de datos. Carguelos una vez (actualizar periódicamente) y utilícelos desde allí. Digo definitivamente DB, ya que lo más probable es que esté extrayendo datos para generar informes, y si está estructurado correctamente, puede reutilizar los datos del país para otras aplicaciones también.

1

No creo que crear una clase jerárquica sería un buen diseño para su problema. En cambio, almacenaba los valores en la base de datos y tenía una clase de país genérica para recuperar el estado del país de la base de datos.

1

No cambiará muy a menudo, usted dice, pero en eso indica que puede cambiar en un punto. En tales casos, debe colocarlo en un almacén de datos de algún tipo, como han indicado los demás, ya sea una base de datos, un archivo de texto o de otro modo.

Tenga en cuenta que, si lo pone en una enumeración o una clase estática o alguna otra parte de su aplicación real, el usuario final no podrá cambiarla fácilmente. Entonces, si por algún desastre natural o guerra mundial 3 algunos países desaparecen, se fusionan, se separan, obtienen un nuevo tipo o nombre de gobierno, debe poder actualizar su lista de países.

Puede simplemente hacer que la aplicación lea la lista de países al inicio y dejarla en la memoria. Se actualizará automáticamente cuando la aplicación se reinicie.Otra opción sería hacer que verifique los países actualizados cada X período y actualizar la lista interna, si se trata de una aplicación que se ejecuta durante un tiempo prolongado.

+0

Gracias por las sugerencias. Volver a la actualización del usuario final: esto es en el contexto de un servicio basado en web, por lo que los clientes no estarían ejecutando intances de la aplicación, y podría recompilar fácilmente. – UpTheCreek

1

Como dijo oedo, las enumiciones deberían hacer el trabajo, pero si necesita más de un índice, podría usar un archivo xml. sería dinámico, no necesita compilación

+0

¿Qué enfoque usaría para 'actualizar' un país basado en un archivo xml? – UpTheCreek

+0

Bueno, cree un nodo "Países", dentro de este nodo agregue nodos "País", genere un ID único para cada país, configúrelo como propiedad. Dentro de su nodo "país" agregue elementos como "Países Fronterizos" y configure el ID del países limítrofes. Luego, para leer, analizar todos los elementos de tus países, afectar la ID + otra información que te guste, luego volver a rastrear el archivo xml para buscar elementos que deberían ser bordes, agregar a una lista o una matriz del país actual. Espero que esta ayuda. – Ziggy

Cuestiones relacionadas