Передача сообщений между объектами - Как обратиться к целевому объекту?

Самая основная задача в объектно-ориентированной среде — это выполнение метода над объектом. Для этого у вас должна быть ссылка на объект, для которого вы вызываете метод. Является ли правильный способ установить эту ссылку для передачи объекта в качестве параметра конструктору (или методу инициализатора) вызывающего объекта?

Если объект foo вызывает объект bar, правильно ли сказать (в псевдокоде):

bar = new barClass()
foo = new fooClass(bar)

Что произойдет, если вам нужно передавать сообщения туда и обратно? Вам нужен метод для регистрации целевого объекта?

foo = new fooClass()
bar = new barClass()

foo.register(bar)
bar.register(foo)

Есть ли шаблон, который решает эту проблему?


person Jonathan Adelson    schedule 19.09.2008    source источник


Ответы (5)


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

Что, если вам нужен контролирующий объект, на который другие объекты регистрируются для событий. Тогда было бы целесообразно использовать метод Register (который может добавить к делегату).

См. шаблон Observer.

person Rob Gray    schedule 19.09.2008

Фреймворки внедрения зависимостей, такие как Spring и Guice предоставляет решение для циклических зависимостей в Java с помощью прокси-серверов, которые могут определять получателя сообщения в первый раз, когда оно требуется. Однако это не общеприменимая модель объектно-ориентированного программирования.

person tgdavies    schedule 19.09.2008
comment
Спасибо! Я провел немного времени, глядя на Spring, но не так много. Обязательно посмотрю глубже. - person Jonathan Adelson; 19.09.2008

Ну, в зависимости от уровня обмена сообщениями, вы можете реализовать службу обмена сообщениями. Объекты прослушивают сообщения или регистрируются как MessageListener в каком-либо MessageProvider.

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

person scubabbl    schedule 19.09.2008
comment
Спасибо! Это имело бы смысл, если бы у вас были сообщения, на которые могли бы ответить многие объекты. Меня больше интересует общий случай, когда два объекта довольно тесно связаны и разговаривают друг с другом. Штука типа ООП-101. :) - person Jonathan Adelson; 19.09.2008

Один из ваших типов объектов может быть фабрикой для другого. Когда Foo извлекает новый Bar, соединение уже установлено:

foo = new Foo();
bar = Foo.Poop();

function Foo::Poop()
{
    bar = new Bar(this);
    myChildren.Add(bar);
    return bar;
}

bar.SayHiToParent();
foo.SayHiToChildren();
person xanadont    schedule 19.09.2008

Я думаю, что это сильно зависит от того, какова точная связь между двумя объектами.

person Rik    schedule 19.09.2008