'静态/常量'业务对象

UpT*_*eek 5 oop

我不太清楚如何提出这个问题,所以我会把它作为一个例子来代替:

想象一下,在一个应用程序中你有一个Country对象.此对象有两个属性:Name和' Bordering Countries'集合.以后可能会添加更多属性,但这种信息很少会发生变化(例如国名/边界的变化)

让我们说这个应用程序需要了解世界上所有的国家. 你在哪里存储这些对象的状态?你会如何新建它们? 将所有这些状态存储在数据库中似乎很愚蠢,因为它不会经常更改.

一种选择可能是拥有一个抽象的"国家"基础对象,并为每个国家/地区提供一个类,其中包含每个国家/地区的详细信息.但这对我来说似乎不太合适.

处理这些物体的正确方法是什么?

更新:

有人问过语言:C#

另外,我是从Web应用程序的角度来看这个,所以不会有多个客户端安装,我不得不担心更新硬编码值.

大多数人建议不对数据进行硬编码,而是使用DB或XML文件来存储数据. 任何人都可以举例说明这种对象如何"新建"(例如XML文件)?您会使用某种帮助器或工厂方法来获取特定国家/地区的实例吗?

Chr*_*yne 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);
        }
    }
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)