我不太清楚如何提出这个问题,所以我会把它作为一个例子来代替:
想象一下,在一个应用程序中你有一个Country
对象。此对象有两个属性:Name
和“Bordering Countries
”集合。以后可能会添加更多属性,但这种信息很少会发生变化(例如国名/边界的变化)
让我们说这个应用程序需要了解世界上所有的国家。 您将在哪里存储这些对象的状态?你会如何新建它们?将所有这些状态存储在数据库中似乎很愚蠢,因为它不会经常更改。
一种选择可能是拥有一个抽象的“国家”基础对象,并为每个国家/地区提供一个类,其中包含每个国家/地区的详细信息。但这对我来说似乎并不合适。
处理这类物品的正确方法是什么?
更新
有人问过语言:C#
此外,我是从Web应用程序的角度来看这个,所以不会有多个客户端安装,我不得不担心更新硬编码值。
大多数人建议不对数据进行硬编码,而是使用DB或XML文件来存储数据。 是否有人可以举例说明这种对象如何“新建”(例如XML文件)?您会使用某种帮助器或工厂方法来获取特定国家/地区的实例吗?
答案 0 :(得分:3)
绝对在数据库中。加载一次(定期刷新)并从那里使用它们。 我绝对会说DB,因为您很可能会为报告目的提取数据,如果结构正确,您也可以将国家/地区数据重用于其他应用程序。
答案 1 :(得分:1)
枚举对于那种事情非常有用。你没有提到你正在使用的语言,但在java中,它们作为序数索引(整数)非常有效地存储,你总是可以在枚举列表的末尾添加新值。
答案 2 :(得分:1)
我不认为创建一个类层次结构对你的问题来说是一个很好的设计。相反,我会将值存储在数据库中,并具有一个通用的Country类,用于从数据库中检索国家/地区状态。
答案 3 :(得分:1)
你说,它不会经常改变,但是你表明可能在某一时刻发生变化。在这种情况下,您应该将它放在某些数据存储区中,正如其他人所指出的那样 - 无论是数据库,文本文件还是其他。
请记住,如果将其放在枚举或静态类或实际应用程序的其他部分中,最终用户将无法轻松更改它。因此,如果在一些自然灾害或第三次世界大战中,一些国家消失,合并,分离,获得新的政府类型或名称,您需要能够更新您的国家名单。
您可以让应用程序在启动时读取国家/地区列表,并将其保留在内存中。它会在应用程序重新启动时自动刷新。另一种选择是让它每X周期检查一次更新的国家,并更新内部列表,如果它是一个运行很长时间的应用程序。
答案 4 :(得分:1)
正如oedo所说,枚举应该可以胜任,但如果你需要的不仅仅是索引,你可以使用xml文件。它会是动态的,不需要编译
答案 5 :(得分: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"});
}
}