![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Кто должен передавать посетителя?
Kolan © (2008-01-27 11:10:00)Здравствуйте,
Еще вопрос по проектированию
Допустим у нас есть два объекта А и Б. И есть интерфейс И.
Пусть Б реализует И (Б = class ( , И))
А классу А нужен посетитель реализующий интерфейс И. Раз он ему нужен, то хорошо бы запросить его при создании:
A = class
public
constructor Create(AVisitor: И);
end;
Вопрос кто должен передать классу а посетителя.
Вариант первый тут все прозрачно:
Допустим сам Б инстанцирует А. Тогда
MyА := А.Create(Self)
Вариант второй, сам вопрос:
А что если А и Б синглетоны? Кто и как тогда должен связать А и Б?
oxffff (2008-01-27 16:26:00) [21]
> Kolan © (27.01.08 16:25) [18]
О каких слоях идет речь?
Kolan (2008-01-27 16:25:00) [22]> с точной формулировки
Постараюсь уточнить
При использовании посетителя получается что у нас еть два слоя, разделенных интерфейсом:
А И Б
Дупустим что таких слоев не да, а хотябы три:
А И1 Б И2 С.
В этом случае если использовать менеджер, то он будет знать о всех. То есть он все эти слои нарушает
А-И1-Б-И2-С.
\ | /
Manager
oxffff (2008-01-27 16:23:00) [23]
> Kolan © (27.01.08 16:15) [15]
Я честно говоря не могу понять, что у тебя за задача и почему посетителю нужно реализовывать интерфейс.
Ты ничего не напутал?
Опиши словестно задачу. И чего ты хочешь добиться в итоге.
А то я честно не могу понять задачи.
Семеныч (2008-01-27 16:21:00) [24]> Kolan © (27.01.08 15:48) [13]
> А проблемма в том, что мне ненравится такой метод связывания.
Не нравится на уровне эстетики вообще, или не нравится чем-то конкретным?
Если первое, то никакой проблемы на самом деле нет, она высосана из пальца. А если второе, то начинать надо с точной формулировки того, "чем конкретно мне это решение не нравится". Это будет уже половина решения.
Kolan (2008-01-27 16:15:00) [25]> Причем несколькими способами.
Ну какими? Я вижу только вариант с внешнем классом ненравится он тем, что этот класс нужен только для связи и не для чего больше
oxffff (2008-01-27 16:14:00) [26]
> Задачи нет. Есть проблемма.
Любую проблему можно решить. Причем несколькими способами.
Но возникает другая проблема - какой из способов выбрать?
Kolan (2008-01-27 15:48:00) [27]> У кого-то выработался стойкий иммунитет:)
Вырабатываю его у себя :).
> Может. Рассказать задачу и не мудрствовать сверх необходимости.
Задачи нет. Есть проблемма.
Так и есть синглетон А, которому для работы нуже кто-то поддерживающий интерфейс.
Сейчас я ему этого кого-то даю при старте приложения. То есть у меня есть StartUpConterller, ктороый знает о А, о Б и о интерфейсе.
А проблемма в том, что мне ненравится такой метод связывания.
Игорь Шевченко (2008-01-27 15:40:00) [28]
> может еще че-нить можно придумать…?
Может. Рассказать задачу и не мудрствовать сверх необходимости.
Многие переболели паттернами, универсализацией, повторным использованием кода и так далее.
У кого-то выработался стойкий иммунитет:)
Семеныч (2008-01-27 15:36:00) [29]> Kolan © (27.01.08 13:26) [10]
Наверное, можно. Но зачем? Просто так, из любви к искусству, или существующее решение чем-то устраивает? Если второе, то чем?
Kolan (2008-01-27 13:26:00) [30]> Значит, нужен менеджер посетителей.
Это решение и используется может еще че-нить можно придумать ?
Семеныч (2008-01-27 13:14:00) [31]> Kolan © (27.01.08 13:07) [8]
Значит, нужен менеджер посетителей.
Kolan (2008-01-27 13:07:00) [32]> И тогда A либо использует своего текущего посетителя
Так откуда он его возмет этого текущего?
> Судя по слову «посетитель»
Под словом посетитель подразумевается Visitor из GoF.
Семеныч (2008-01-27 13:03:00) [33]> Kolan © (27.01.08 12:37) [6]
> А.ДелайСвоюРаботу.
И тогда A либо использует своего текущего посетителя, либо запрашивает еще кого-то (менеджера, очередь посетителей и т.п.) - "дай мне посетителя".
Вообще, для более предметного разговора надо бы лучше знать задачу. Судя по слову "посетитель" и по тому, что А - синглтон, моделируется что-то вроде процесса обслуживания посететелей одним продавцом. Тогда уместно ввести именно очередь посетителей - она и будет тем менеджером, который назначает продавцу текущего посетителя.
Kolan (2008-01-27 12:37:00) [34]> А тогда не вижу проблемы. Тот, кто запрашивает А, должен
> знать посетителя
Ан нет
Ток кто запрашивает А не знает (в некоторых случиях) о том, что а нужен посетитель.
Вызывающий А говорит ему:
А.ДелайСвоюРаботу.
И все, а то что для выполнения работы А нужно еще что-то он может незнать.
Единственный вариант, который у меня есть это использование класса, который как-бы инициализирует систему. Он то и назначит нужные посетители Только не очень мне нравится это вариант.
Семеныч (2008-01-27 12:28:00) [35]А тогда не вижу проблемы. Тот, кто запрашивает А, должен знать посетителя И и в запросе передать ссылку на него. Если это первый запрос А, то произойдет реальное создание А и инициализация его поля (ссылки на И), а если не первый - произойдет переключение А на другого посетителя.
Kolan (2008-01-27 12:16:00) [36]
> Вот что убивает смысл конкретного посетителя его единственность.
Да наверно пример не корректный, синглетон это только А Б не обязательно. Как тогда?
Семеныч (2008-01-27 11:55:00) [37]> Kolan © (27.01.08 11:51) [2]
> Но ведь тогда А будет знать о конкретном Б. Это убьет весь смысл
> использования посетителя.
Убъет, но не это. Вы же сами сказали, что Б - синглтон. Вот что убивает смысл конкретного посетителя - его единственность.
Kolan (2008-01-27 11:51:00) [38]> 1. Не обязательно передавать И через конструктор, можно
> через свойство.
Ну смысл от этого не меняется.
Просто будет в 1 варианте:
MyА := А.Create
MyA.И := Self
Проблемма не исчезает.
То есть, фабрика класса A или метод A.NewInstance.
А если нет фабрики? Синглетон создается по требованию.
или метод A.NewInstance.
Хм. Но ведь тогда А будет знать о конкретном Б. Это убьет весь смысл использования посетителя.
Семеныч (2008-01-27 11:31:00) [39]1. Не обязательно передавать И через конструктор, можно через свойство.
2. Тот, кто обеспечивает "синглтонность". То есть, фабрика класса A или метод A.NewInstance.