«Статические / постоянные» бизнес-объекты - PullRequest
5 голосов
/ 25 мая 2010

Я не совсем знаю, как задать этот вопрос, поэтому вместо этого я приведу его в качестве примера:

Представьте, что в приложении у вас есть объект Country. У этого объекта есть два свойства: Name и коллекция 'Bordering Countries'. Дополнительные свойства могут быть добавлены позже, но это будет та информация, которая будет меняться очень редко (например, изменения названий / границ стран)

Допустим, это приложение должно знать обо всех странах мира. Где бы вы хранили состояние этих объектов? Как бы вы их обновили? Кажется глупым хранить все это состояние в БД, поскольку оно не будет меняться очень часто.

Один из вариантов может состоять в том, чтобы иметь абстрактный базовый объект 'страна' и иметь класс для каждой страны, наследуемый от него, с подробным описанием каждой страны. Но мне это кажется не совсем правильным.

Как правильно обращаться с такими объектами?

ОБНОВЛЕНИЕ:

Кто-то спросил о языке: C #

Кроме того, я подхожу к этому с точки зрения веб-приложения, чтобы не было нескольких установок клиентов, где мне пришлось бы беспокоиться об обновлении жестко закодированных значений.

Большинство людей предлагают не жестко кодировать данные, а использовать файлы DB или XML для хранения данных. Может ли кто-нибудь привести пример того, как этот тип объекта будет «обновлен» (например, из файла XML)? Вы бы использовали какой-нибудь вспомогательный или фабричный метод для получения экземпляра конкретной страны?

Ответы [ 6 ]

3 голосов
/ 25 мая 2010

Определенно в БД. Загрузите их один раз (периодически обновляйте) и используйте их оттуда. Я определенно говорю «БД», поскольку вы, скорее всего, будете извлекать данные для целей отчетности, и при правильной структуре вы можете повторно использовать данные страны и для других приложений.

1 голос
/ 25 мая 2010

Как сказал oedo, перечисления должны выполнять свою работу, но если вам нужно больше, чем индекс, вы можете использовать XML-файл. это было бы динамично, нет необходимости компиляции

1 голос
/ 25 мая 2010

Это не будет меняться очень часто, говорите вы, но тем самым вы указываете, что может измениться в одной точке. В таких случаях вы должны поместить его в хранилище данных какого-либо рода, как указали другие - будь то база данных, текстовый файл или иное.

Имейте в виду, что, если вы поместите его в перечисление, статический класс или какую-либо другую часть вашего реального приложения, конечный пользователь не сможет легко его изменить. Поэтому, если в результате какого-либо стихийного бедствия или мировой войны 3 некоторые страны исчезнут, объединятся, разделятся, получат новый тип или название правительства, вам нужно будет обновить список стран.

При запуске вы можете просто прочитать список стран и оставить его в памяти. Он будет автоматически обновляться при перезапуске приложения. Другой вариант - проверять наличие обновленных стран каждые X периодов и обновлять внутренний список, если это приложение, которое выполняется в течение длительного времени.

1 голос
/ 25 мая 2010

Я не думаю, что создание иерархии классов было бы хорошим решением для вашей проблемы. Вместо этого я бы сохранил значения в базе данных и имел бы общий класс Country, который извлекает состояние страны из базы данных.

1 голос
/ 25 мая 2010

перечисления весьма полезны для такого рода вещей. Вы не упоминаете язык, который используете, но в Java они достаточно эффективно хранятся в виде порядкового индекса (целого числа), и вы всегда можете добавить новые значения в конец списка перечисления.

0 голосов
/ 25 мая 2010

У вас есть множество ответов, поэтому я решил добавить свою сумму в 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"));
    }

Oops! Вы, вероятно, хотите заполнить весь список (не по одному за раз!) 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"});
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...