我不太清楚如何提出这个问题,所以我会把它作为一个例子来代替:
想象一下,在一个应用程序中你有一个Country对象.此对象有两个属性:Name和' Bordering Countries'集合.以后可能会添加更多属性,但这种信息很少会发生变化(例如国名/边界的变化)
让我们说这个应用程序需要了解世界上所有的国家. 你在哪里存储这些对象的状态?你会如何新建它们? 将所有这些状态存储在数据库中似乎很愚蠢,因为它不会经常更改.
一种选择可能是拥有一个抽象的"国家"基础对象,并为每个国家/地区提供一个类,其中包含每个国家/地区的详细信息.但这对我来说似乎不太合适.
处理这些物体的正确方法是什么?
更新:
有人问过语言:C#
另外,我是从Web应用程序的角度来看这个,所以不会有多个客户端安装,我不得不担心更新硬编码值.
大多数人建议不对数据进行硬编码,而是使用DB或XML文件来存储数据. 任何人都可以举例说明这种对象如何"新建"(例如XML文件)?您会使用某种帮助器或工厂方法来获取特定国家/地区的实例吗?
你有各种各样的答案,所以我想我应该加上 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);
}
}
Run Code Online (Sandbox Code Playgroud)
您的单元测试:
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"));
}
Run Code Online (Sandbox Code Playgroud)
哎呀!您可能想要填充整个列表(一次不是一个!)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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我对它进行硬编码:
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"});
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
236 次 |
| 最近记录: |