'静态/常量'业务对象

时间:2010-05-25 08:36:01

标签: oop

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

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

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

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

处理这类物品的正确方法是什么?

更新

有人问过语言:C#

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

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

6 个答案:

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