Эффективный доступ к родительским элементам в объектной модели - PullRequest
3 голосов
/ 20 ноября 2008

У меня есть следующая объектная модель:

- Book 
-- Chapter 1
--- Page 1
---- Image 1 
---- Image 2
---- Text 1
--- Page 2 
...

Ресурсы находятся на уровне страницы. Но мне нужно знать полный путь к ресурсам с точки зрения ресурсов.

Один из способов - это быть осведомленными о своих родителях.

Таким образом, мой объект Image может иметь свойство parentPage, которое, в свою очередь, может иметь свойство parentChapter. Таким образом, я мог получить доступ к полному пути через currentImage.parentPage.parentChapter. Есть ли лучший способ?

Пару слов о том, почему мне нужно знать полный путь с точки зрения ресурса. У меня есть объектная модель, которая проходит и отображается на экране. Рендерер спускается с уровня главы до уровня элемента / ресурса (здесь происходит рендеринг). Однако для отображения ресурсов мне нужно знать, где они находятся (т.е. фактический путь на диске), и эта информация обычно указывается на уровне главы.

Спасибо!

- Правка - Просто чтобы уточнить, является ли этот родительский / родительский подход лучшим? Это заставляет детей узнавать о родителях, что мне неудобно. Сцепление

Ответы [ 4 ]

6 голосов
/ 20 ноября 2008

Я бы предложил древовидную структуру, тогда как каждый из ваших классов наследует от узла дерева.

Пример в c #:

class TreeNode {
 public TreeNode Parent { get; set; }
 public List<TreeNode> Children { get; set; }
}

class Book : TreeNode {
 ... book attributes ...
}

... other classes ...

На самом деле, если вы беспокоитесь о связи, задайте себе вопрос: это хорошая связь или плохая связь? Если связь действительно добавляет ценность, и для этого есть логическая причина, сделайте это. Если нет, то это потраченный впустую код. Если вы используете язык, который поддерживает дженерики, вы можете отделить его немного дальше:

class TreeNode<TParent, TChild>  
{
    public TParent Parent { get; set; }
    public List<TChild> Children { get; set; }
}

class Book : TreeNode<object, Chapter> { }
class Chapter : TreeNode<Book, Page> { }
class Page : TreeNode<Chapter, object> { }

Надеюсь, это поможет!

2 голосов
/ 22 ноября 2008

Независимо от того, используете ли вы древовидную структуру Захари или вы делаете это более специфичным для типа способом, вопрос о связи остается в силе.

Если есть много изображений, которые не имеют никакого отношения к тому, как изображение «размещается» на странице, вы можете использовать промежуточный тип, который имеет контекстно-зависимый аспект и который содержит экземпляр изображения (ссылка).

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

0 голосов
/ 20 ноября 2008

Возможно, вы сможете сериализовать объект в xml и использовать linq для xml для анализа информации.

Если вам необходимо использовать экземпляры объектов, другим вариантом может быть просмотр составного шаблона ( см. Википедию )

Эрик

0 голосов
/ 20 ноября 2008

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

...