Осведомленность многих объектов об одном объекте
От: S.Yu.Gubanov Россия http://sergey-gubanov.livejournal.com/
Дата: 26.08.04 07:50
Оценка:
Есть немаленькое дерево владения объектов и листья этого дерева должны быть осведомлены об одном единственном объекте:
               e-f - - - - +
              /            |
             /             |
          c-d--e-f - - - - +
         /   \             |
        /     \            |
       /       e-f - - - - +
      /                    |
     /         e-f - - - - +
    /         /            |
   /         /             |
a-b-------c-d--e-f - - - - +
   \         \             |
    \         \            |
     \         e-f - - - - +
      \                    |
       \       e-f - - - - +
        \     /            |
         \   /             |
          c-d--e-f - - - - +
             \             | 
              \            |
               e-f - - - - +
                           |
                           |             
                           g

Объект "a" владеет объектом "b". Объект "b" владеет несколькими объектами "c". Каждый из объектов "c" владеет объектом "d". Каждый из объектов "d" владеет несколькими объектами "e". Каждый из объектов "e" владеет объектом "f". И, наконец, каждый из объектов "f" должен быть осведомлен об одном единственном объекте "g". Причем всем "высшим" объектам "a", "b", "c", "d" и "e" нет никакого дела до объекта "g". Они о нем знать не обязаны.

До недавнего времени объект "g" был просто напросто доступен через глобальную переменную, что элементарно решало все проблемы.

Но теперь ситуация изменилась. Теперь у меня должно быть несколько объектов "а", каждый со своим "деревом объектов", и в каждом "a"-дереве объектов должен быть свой единственный объект "g". Объект "g" больше не может быть представлен глобальной переменной.

Что делать?
Приписывать каждый "g" к соответствующему объекту "a" и спускать его по дереву вниз? Это конечно выход, но, как я уже говорил, "высшие" объекты "a", "b", "c", "d" и "e" по своему смыслу не имеют никакого отношения к объекту "g", так что появление в их интерфейсе спускающей по дереву функции будет выглядеть диковато...
Re: Осведомленность многих объектов об одном объекте
От: Nuald Россия http://nuald.blogspot.com
Дата: 26.08.04 07:57
Оценка: 15 (1)
Здравствуйте, S.Yu.Gubanov, Вы писали:

SYG>Есть немаленькое дерево владения объектов и листья этого дерева должны быть осведомлены об одном единственном объекте:

SYG>Что делать?
SYG>Приписывать каждый "g" к соответствующему объекту "a" и спускать его по дереву вниз? Это конечно выход, но, как я уже говорил, "высшие" объекты "a", "b", "c", "d" и "e" по своему смыслу не имеют никакого отношения к объекту "g", так что появление в их интерфейсе спускающей по дереву функции будет выглядеть диковато...

Дерево — это концепция, имеющая начальный элемент "а" и конечный "g". Если у вас дерево представлено в виде класса, то я не вижу причин, почему бы g не сделать просто членом класса, а f будет просто ссылаться на него.
Re: Осведомленность многих объектов об одном объекте
От: S.Yu.Gubanov Россия http://sergey-gubanov.livejournal.com/
Дата: 26.08.04 07:57
Оценка:
P. S.

Возможно надо завести дополнительный объект "domain" агрегирующий объекты "a" и "g", и в каждом из объектов a,b,c,d,e,f,g сделать ссылку на domain к которому они принадлежат????
Re[2]: Осведомленность многих объектов об одном объекте
От: S.Yu.Gubanov Россия http://sergey-gubanov.livejournal.com/
Дата: 26.08.04 08:03
Оценка:
Здравствуйте, Nuald, Вы писали:

N>Дерево — это концепция, имеющая начальный элемент "а" и конечный "g". Если у вас дерево представлено в виде класса, то я не вижу причин, почему бы g не сделать просто членом класса, а f будет просто ссылаться на него.


То есть, сделать так: http://www.rsdn.ru/Forum/Message.aspx?mid=780596&only=1
Автор: S.Yu.Gubanov
Дата: 26.08.04
где под domain подразумевается "концепция дерева"?
Re[2]: Осведомленность многих объектов об одном объекте
От: Nuald Россия http://nuald.blogspot.com
Дата: 26.08.04 08:10
Оценка:
Здравствуйте, S.Yu.Gubanov, Вы писали:

SYG>Возможно надо завести дополнительный объект "domain" агрегирующий объекты "a" и "g", и в каждом из объектов a,b,c,d,e,f,g сделать ссылку на domain к которому они принадлежат????


Немного не так. Давайте просто опишем структуру:
class Domain {
 Domain* a, g;
 //internal members
public:
 GetFirst() {return a;};
 GetLast() {return g;}
 GetNext(Domain*);
};


Класс Domain инкапсулирует в себе объекты дерева (a,b,c,d,e,f,g) и хранит ссылки на начальный и конечный элементы. В данном случае, если взять ваше предложение "ссылка на domain к которому они принадлежат" — является this.
Re: Осведомленность многих объектов об одном объекте
От: AndreyFedotov Россия  
Дата: 26.08.04 08:11
Оценка: 3 (1)
Здравствуйте, S.Yu.Gubanov, Вы писали:

Можно развернуть ситуацию наоборот — сделать объект G ответсвенным за знание того, кто к нему относится.
То есть:
При создании объекта A — который находится в вершине иерархии — явным образом указывать к какому объекту G от относится. Затем — реализовать синглетон или глобальную функцию — которая будет возвращать для любого объекта в иерархии — к какому объекту G от относится (для тех объектов, которые уже были внесены во внутренние списки объектов G). При создании нового объекта иерархии — указывать связь между этим новым объектом и объектом G (регистрировать его в списке объектов G) — при разрушении — дерегистрировать его — убирая из списка объектов.
Простейший способ — наследовать все классы для объектов иерархии от класса, в котором хранится ссылка на объект G, и при создании объекта требовать, что бы в его конструктор передавался указатель на уже существующий объект (т.е. тот, который уже в курсе, к какому объекту G он относится). При таком взгляде объект G — сам может быть производным от этого общего класса и указывать на самого себя — своеобразная "вершина иерархии".
То же самое можно поддержать на уровне интерфейсов — при этом каждый объект должен выставлять интерфейс, через который можно узнать, к какому объекту G он относится, а при создании объекта — передавать ему указатель на уже зарегистрированный в списках G объект.
Re: Осведомленность многих объектов об одном объекте
От: eugals Россия  
Дата: 26.08.04 08:12
Оценка: 27 (2)
Здравствуйте, S.Yu.Gubanov, Вы писали:

SYG>Что делать?

SYG>Приписывать каждый "g" к соответствующему объекту "a" и спускать его по дереву вниз? Это конечно выход, но, как я уже говорил, "высшие" объекты "a", "b", "c", "d" и "e" по своему смыслу не имеют никакого отношения к объекту "g", так что появление в их интерфейсе спускающей по дереву функции будет выглядеть диковато...

А какого рода связи между этими всеми объектами a, b... e? Одно или двунаправленные?
Можно ли из f по цепочке получить доступ к a?

В таком абстрактном виде, в котором ты сформулировал, я вижу такие варианты:
Первый. Вввести ещё один класс объектов: Context (варианты: Document, Appartment, Process...), который будет владеть и a и g.
Второй. Сделать глобальный словарь сопоставляющий a и g и функцию findGforA, чтобы её звали все f.

А вообще, тебе наверное стоит более детально расшифровать что значат все эти a и б, тогда тебе местный народ гораздо более интересные советы сможет дать
... << RSDN@Home 1.1.3 stable >>
Re[3]: Осведомленность многих объектов об одном объекте
От: S.Yu.Gubanov Россия http://sergey-gubanov.livejournal.com/
Дата: 26.08.04 08:13
Оценка:
Здравствуйте, S.Yu.Gubanov, Вы писали:

SYG>Здравствуйте, Nuald, Вы писали:


N>>Дерево — это концепция, имеющая начальный элемент "а" и конечный "g". Если у вас дерево представлено в виде класса, то я не вижу причин, почему бы g не сделать просто членом класса, а f будет просто ссылаться на него.


SYG>То есть, сделать так: http://www.rsdn.ru/Forum/Message.aspx?mid=780596&amp;only=1
Автор: S.Yu.Gubanov
Дата: 26.08.04
где под domain подразумевается "концепция дерева"?



Да кажется так будет очень правильно. Причем интерфейс domain-объекта на каждом уровне дерева можно сделать разным, так чтобы "низшие" объекты ничего не знали о "высших" и наоборот. Каждому уровню дерева — свой интерфейс domain-объекта!!!
Re[2]: Осведомленность многих объектов об одном объекте
От: S.Yu.Gubanov Россия http://sergey-gubanov.livejournal.com/
Дата: 26.08.04 08:24
Оценка: +1
Здравствуйте, eugals, Вы писали:

E>Здравствуйте, S.Yu.Gubanov, Вы писали:


E>А какого рода связи между этими всеми объектами a, b... e? Одно или двунаправленные?

E>Можно ли из f по цепочке получить доступ к a?

Связи однонаправленные, причем объекты-агрегаты инкапсулируют в себе своих подчиненных, так что "прыжки" через уровень невозможны. Можно двигаться только из корня дерева к вершинам проходя все узлы. Все объекты находящиеся на разных уровнях дерева принадлежат разным типам.


E>Первый. Вввести ещё один класс объектов: Context (варианты: Document, Appartment, Process...), который будет владеть и a и g.


Да, эта идея мне понравилась. Я собираюсь сделать объект Domain реализующий различные интерфейсы для разных уровней дерева. Например, на уровне дерева "f"-объектов его интерфейс будет представлен одной функцией возвращающей объект "g".
Re: Осведомленность многих объектов об одном объекте
От: kelvin  
Дата: 26.08.04 09:50
Оценка:
Здравствуйте, S.Yu.Gubanov, Вы писали:

SYG>Что делать?

SYG>Приписывать каждый "g" к соответствующему объекту "a" и спускать его по дереву вниз? Это конечно выход, но, как я уже говорил, "высшие" объекты "a", "b", "c", "d" и "e" по своему смыслу не имеют никакого отношения к объекту "g", так что появление в их интерфейсе спускающей по дереву функции будет выглядеть диковато...
IMHO правильней всего сделать так:
объекты "a" и "f" должны быть объектами _разных_ классов но при этом реализовывать один интерефейс.
Таким образом ссыслку на объект "g" можно будет хранить только в объектах класса "f" как и требуется по условию.
Рекомендую обратить внимание на такой паттерн как Компановщик(Composite). Возможно также в качестве "g" можно будет использовать недовно обсуждавшийся здесь паттерн как Приспособленец(Flyweight).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.