2010-05-25 51 views
5

我不太知道怎麼問這個問題,所以我會詞組它列爲一個例子:「靜態/恆定」業務對象

想象一下,你有一個Country對象的應用程序。該對象有兩個屬性:Name和'Bordering Countries'集合。更多的屬性可能會在稍後添加,但它將會是非常少見的信息類型(例如,國家/國家/地區的更改)

可以說這個應用程序需要了解世界上所有的國家。 你會在哪裏存儲這些對象的狀態?你將如何提出新的?將所有狀態存儲在數據庫中似乎很愚蠢,因爲它不會經常更改。

一個選項可能是抽象的「國家」基礎對象,並且每個國家都有一個類,用於繼承每個國家的具體細節。但是這對我來說似乎不太合適。

處理這類物體的正確方法是什麼?

更新:

有人問起語言:C#

另外,我在這個即將從Web應用程序的角度來看,這樣就不會有多個客戶端的安裝,我不得不擔心更新硬編碼值。

大多數人建議不要硬編碼數據,而是使用DB或XML文件來存儲數據。 任何人都可以提供一個例子說明這種類型的對象是如何被「更新」的(例如來自XML文件)?你會使用某種幫手或工廠方法來獲取某個特定國家的實例嗎?

+3

「它不會改變非常頻繁」 - 曾經訪問過巴爾幹地區? – 2010-05-25 08:38:33

+1

的確,但我會認爲這些變化「不經常發生」。 – UpTheCreek 2010-05-25 08:59:17

回答

0

你有各種答案,所以我想我會增加我的0.02美元的價值。

就我個人而言,我總是像這樣硬編碼固定列表(與郵編一樣)。這就是說,當我處於你的位置時,我會一直優化可讀性。即當你忘記了這個項目並且需要進行一些維護時,6個月內什麼纔有意義?

如果我有一個數據庫,做到這一點:

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

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

單元測試:

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

糟糕!你可能要填充整個列表(不是一次一個!) 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(); 
      } 
     } 

    } 

如果我硬編碼:

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

爲什麼倒票? – 2010-06-28 02:32:28

1

枚舉對於那種事情是非常有用的。你沒有提到你正在使用的語言,但是在java中,它們作爲序號索引(整數)被非常有效地存儲,並且你總是可以在枚舉列表的末尾添加新值。

+0

這將是C#在我的情況下 – UpTheCreek 2010-05-25 09:07:00

3

Definatly in the DB。將它們加載一次(定期刷新)並從那裏使用它們。 我說definatly數據庫,因爲你很可能會提取數據報告的目的,如果結構正確,你可以重用國家數據的其他應用程序也。

1

我不認爲創建一個類層次將是一個很好的設計爲您的問題。相反,我會將值存儲在數據庫中,並且有一個通用的Country類從數據庫中檢索國家/地區狀態。

1

它不會經常改變,你說,但你表明它可以可能改變在一個點。在這種情況下,您應該將其放入某種數據存儲中,正如其他人指出的那樣 - 無論是數據庫,文本文件還是其他方式。請記住,如果您將它放在枚舉或靜態類或實際應用程序的其他部分中,最終用戶將無法輕鬆更改它。因此,如果由於某種自然災害或第三次世界大戰,一些國家消失,合併,分離,獲得新的政府類型或名稱,則需要能夠更新您的國家名單。

您可以讓應用程序在啓動時讀取國家/地區列表,並將其保留在內存中。它會在應用程序重新啓動時自動刷新。另一個選擇是讓它每X週期檢查更新的國家並更新內部列表,如果它是一個長時間運行的應用程序。

+0

感謝您的建議。 Re最終用戶更新:這是基於Web的服務的上下文,因此客戶端不會運行應用程序的實例,我可以輕鬆地重新編譯。 – UpTheCreek 2010-05-25 09:05:25

1

正如oedo所說,enumumerations應該可以完成這項工作,但是如果您需要的不僅僅是索引,還可以使用xml文件。這將是動態的,不需要彙編

+0

你會用什麼方法來基於xml文件'新建'一個國家? – UpTheCreek 2010-05-25 09:16:08

+0

那麼,創建一個節點「國家」,在這個節點內添加節點「國家」,爲每個國家生成一個唯一的ID,將其設置爲屬性。在你的「國家」節點添加項目爲「BorderCountries」和設置ID接壤的國家。然後閱讀,解析所有國家的元素,影響你喜歡的ID +其他信息,然後重新分析xml文件以找到應該是邊界的項目,添加到當前國家的列表或數組中。 希望得到這個幫助。 – Ziggy 2010-05-25 12:12:19