2010-05-25 9 views
5

Nie bardzo wiem, jak to pytanie, więc będę wyrażenie go jako przykład zamiast:„Static/Constant” firma

wyobrazić w aplikacji masz Country obiekt. Istnieją dwie właściwości tego obiektu: Name oraz kolekcja "". Więcej właściwości można dodać później, ale będzie to rodzaj informacji, która zmienia się bardzo rzadko (np. Zmiany nazw/granic krajów).

Powiedzmy, że ta aplikacja musi wiedzieć o wszystkich krajach na świecie. Gdzie przechowujesz stan tego obiektu? Jak byś je wymyślił? Wydaje się głupio przechowywać cały ten stan w DB, ponieważ nie będzie się często zmieniał.

Jedną opcją może być posiadanie abstrakcyjnego obiektu podstawowego "kraj" i posiadanie klasy dla każdego kraju dziedziczącego z tego ze szczegółami każdego kraju. Ale nie wydaje mi się to całkiem słuszne.

Jaki jest właściwy sposób postępowania z tego rodzaju obiektami?

aktualizacje:

ktoś zapytał o języku C#

Także idę na to z punktu widzenia aplikacji internetowych, więc nie byłoby wiele instalacji klienta, gdzie musiałbym martwić się o aktualizację zakodowanych wartości.

Większość ludzi nie sugerowała kodowania danych, ale używa plików DB lub XML do przechowywania danych. Czy ktokolwiek mógłby podać przykład tego, w jaki sposób tego rodzaju obiekt zostanie "zaktualizowany" (np. Z pliku XML)? Czy używałbyś jakiegoś rodzaju pomocnika lub metody fabrycznej do uzyskania instancji danego kraju?

+3

„nie będzie bardzo często się zmieniają” - kiedykolwiek odwiedził Bałkany? –

+1

Rzeczywiście, ale uważam, że te zmiany mają miejsce "niezbyt często". – UpTheCreek

Odpowiedz

0

Masz wiele odpowiedzi, więc pomyślałem, że dodam moją wartość 0,02 USD.

Osobiście wynegocjowałem stałe stałe listy kodów (takie same jak w przypadku kodów pocztowych). Biorąc to pod uwagę, kiedy jestem na twoim stanowisku, zawsze będę optymalizował dla czytelności. To, co ma sens w ciągu 6 miesięcy, kiedy zapomnisz o tym projekcie i będziesz musiał trochę popracować?

Gdybym miał to zrobić z bazą danych:

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

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

Twoje testy jednostkowe:

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! Prawdopodobnie chcesz, aby wypełnić całą listę (a nie jedna na raz!) 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(); 
      } 
     } 

    } 

Gdybym hardcoding go:

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

Dlaczego głosy w dół ??? –

1

wyliczenia są bardzo przydatne dla tego rodzaju rzeczy. nie mówisz o języku, którego używasz, ale w języku Java, są one przechowywane dość wydajnie jako indeks porządkowy (liczba całkowita) i zawsze możesz dodać nowe wartości na końcu listy wyliczeniowej.

+0

To byłoby C# w moim przypadku – UpTheCreek

3

Na pewno w DB. Załaduj je raz (odświeżaj co jakiś czas) i korzystaj z nich stamtąd. Mówię zdecydowanie DB, ponieważ najprawdopodobniej będziesz wyodrębniać dane do celów raportowania, a jeśli uporządkowana poprawnie, możesz ponownie użyć danych kraju dla innych aplikacji.

1

Nie sądzę, że stworzenie hierarchii klas byłoby dobrym projektem dla twojego problemu. Zamiast tego zapisałbym wartości w bazie danych i posiadałbym ogólną klasę krajową, która odzyskałaby państwo z bazy danych.

1

To nie zmienia się zbyt często, można powiedzieć, ale na tym, że można wskazać, że może zmiana w jednym punkcie. W takich przypadkach należy umieścić go w jakimś segmencie danych, jak wskazali inni - czy jest to baza danych, plik tekstowy lub w inny sposób.

Należy pamiętać, że jeśli umieścisz go w wyliczeniu lub klasie statycznej lub w innej części rzeczywistej aplikacji, użytkownik końcowy nie będzie mógł łatwo go zmienić. Jeśli więc w wyniku jakiejś klęski żywiołowej lub wojny światowej 3 niektóre kraje znikną, połączą się, oddzielą, otrzymają nowy rządowy typ lub nazwę, musisz mieć możliwość zaktualizowania listy krajów.

Wystarczy, że aplikacja po uruchomieniu odczyta listę krajów i pozostawi ją w pamięci. Automatycznie odświeży się po ponownym uruchomieniu aplikacji.Inną opcją byłoby sprawdzanie zaktualizowanych krajów co X okres i aktualizowanie wewnętrznej listy, jeśli jest to aplikacja działająca przez długi czas.

+0

Dzięki za sugestie. Ponowna aktualizacja użytkownika końcowego: jest to związane z usługą opartą na Internecie, więc klienci nie będą uruchamiać intencji aplikacji i będę mógł łatwo rekompilować. – UpTheCreek

1

Jak powiedział Oedo, wyliczenia powinny wykonać zadanie, ale jeśli potrzebujesz więcej niż indeks, możesz użyć pliku xml. byłby dynamiczny, nie trzeba kompilować

+0

Jakie podejście zastosowałbyś do "rozbudowania" kraju na podstawie pliku xml? – UpTheCreek

+0

Utwórz węzeł "Kraje", wewnątrz tego węzła dodaj węzły "Kraj", wygeneruj unikalny identyfikator dla każdego kraju, ustaw go jako własność.Wewnątrz węzła "kraj" dodaj elementy jako "Kraje graniczne" i ustaw identyfikator graniczy z krajami. Następnie, aby odczytać, przeanalizuj wszystkie elementy Krainy, wpływaj na ID + inne informacje, które chcesz, a następnie przerób plik xml, aby znaleźć elementy, które powinny być obramowane, dodać do listy lub tablicy bieżącego kraju. Mam nadzieję, że ta pomoc. – Ziggy

Powiązane problemy