2013-02-20 2 views
1

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

namespace FirstWay 
{ 

public class CrateOfBags 
{ 
    public string crateId { get; set; } 
    public string originCountry { get; set; } 
    public List<BagOfApples> bagList { get; set; } 
} 

public class BagOfApples 
{ 
    public double weight { get; set; } 
    public string bagId { get; set; } 
    public List<apple> appleList { get; set; } 
} 

public class apple 
{ 
    public string appleId { get; set; } 
    public string color { get; set; } 
    public Boolean rotten { get; set; } 
} 
} 

// Или Это

namespace SecondWay 
    { 
public class CrateOfBags 
{ 
    public string crateId { get; set; } 
    public string originCountry { get; set; } 
} 

public class BagOfApples : CrateOfBags 
{ 
    public string bagId { get; set; } 
    public double weight { get; set; } 
} 

public class apple : BagOfApples 
{ 
    public string appleId {get;set;} 
    public string color { get; set; } 
} 

}

Возможные вопросы

Яблоко Вопросы: Сколько Гнилые яблоки Поставленный? Из каких сумм и/или из каких ящиков появились гнилые яблоки? Первый способ: может проходить через каждый ящик, затем сумку, затем яблоко и счет. Второй способ: может зацикливаться только через яблоки и добавить родительские свойства в HashSet (один способ не использовать дубликаты)

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

Одна проблема, с которой я столкнулся, - это очень мало о яблоке, как о его собственном сущности. Я знаю только, из какого ящика это от начала пучка foreach от ящика

Но если я хочу задать вопрос типа «сколько зеленых яблок находится в определенной партии (по id)?» У меня также есть проблемы в зависимости от пути.

Мне кажется неудобным сказать, что яблоко - это ребенок мешка, как собака - ребенок животного. Однако мне нравится идея свободно перемещать манипулирующие яблоки, такие как переключатели, в которые они попадают, просто путем изменения материнской базы. Я не ищу решения конкретных вопросов так, как если бы один из них был лучше (более гибкий, эффективный, интуитивно понятный), то другой, или если мне не хватает чего-то полностью, например, другого метода. Большое спасибо.

P.S. Это не настоящая модель, а довольно приличное представление.

ответ

5

2-й подход кажется явно неправильным с точки зрения моделирования данных: яблоко не a BagOfApples. Наследование должно создавать взаимозаменяемость: можете ли вы всегда положить яблоко, где ожидается пакет BagOfApples? Я так не думаю. Это принцип замены Лискова (и он нарушен).

В терминах базы данных 2-я модель денормализуется. Он может быть создан из первой модели, объединив все 3 таблицы вместе, тем самым создавая избыточные данные. Это анти-шаблон, потому что, когда вы что-то меняете, вы должны изменить его в более чем одном месте (если вы забудете, что это молчание данных).

+0

Хорошо спасибо. Первый способ выглядит нормально, или есть другой лучший способ? Я не доволен этим маршрутом, потому что само яблоко должно знать что-то о его происхождении (например, стране или партии). Например, если бы я захотел поместить яблоки в большой контейнер для сушки, я должен был бы измерить «скорость сушки» », а затем еще найти страну происхождения. – TheBigC

+0

Вы решили бы это, дав яблоку ссылку на BagOfApples. Ваши 3 класса - это дерево с тремя уровнями, и вы хотите, чтобы родители связывались с детьми, используя списки, и дети, связанные с родителем, используя ссылки на объекты. Это делает дерево навигационным в любом направлении. Тем не менее, вы должны быть осторожны, чтобы синхронизировать ссылки. – usr

3

кажется неуклюжим мне сказать, что яблоко ребенок мешка

Бог, потому что это не так. Яблоко не является мешком и, следовательно, не должно унаследовать его.

Ваша первая модель выглядит хорошо.Единственное предложение, которое я считал бы это genericizing Bag поэтому она может быть использована повторно:

public class CrateOfBags<T> 
{ 
    public string crateId { get; set; } 
    public string originCountry { get; set; } 
    public List<Bag<T> bagList { get; set; } 
} 

public class Bag<T> 
{ 
    public double weight { get; set; } 
    public string bagId { get; set; } 
    public List<T> ItemList { get; set; } 
} 

public class apple 
{ 
    public string appleId { get; set; } 
    public string color { get; set; } 
    public Boolean rotten { get; set; } 
} 

Я очень мало знаю о яблоках как своей собственной сущности. Я знаю только, к какому ящику это от начала, начиная петли foreach из ящика.

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