Текущий архив: 2007.01.07;
Скачать: CL | DM;
Вниз
Вопрос для Cyraxa. Как модифицировать GOF паттерн Visitor Найти похожие ветки
← →
oxffff © (2006-12-12 22:56) [0]Cyrax
Специально для вас
Как модифицировать "GOF паттерн" Visitor для расширения состава "посейщаемых объектов" приминительно к Delphi
← →
Джо © (2006-12-12 22:59) [1]> состава "посейщаемых объектов"
И что ви такое гойворите? :D
← →
oxffff © (2006-12-12 22:59) [2]Естественно расширение "Посетителя" должно происходить динамически.
← →
oxffff © (2006-12-12 23:01) [3]
> Джо © (12.12.06 22:59) [1]
> > состава "посейщаемых объектов"
>
> И что ви такое гойворите? :D
А что вас не устраивает?
← →
Kostafey © (2006-12-12 23:03) [4]> Джо © (12.12.06 22:59)
Вот какой смысл было меня расспрашивать по поводу
http://delphimaster.net/view/2-1165941009/
Все равно ни от кого ответа не дождался.
Вы -то не подскажете ?
← →
Vovan#2 (2006-12-12 23:05) [5]Удалено модератором
← →
oxffff © (2006-12-12 23:06) [6]Удалено модератором
← →
Vovan#2 (2006-12-12 23:07) [7]Удалено модератором
← →
Kolan © (2006-12-12 23:08) [8]> для расширения состава "посейщаемых объектов
не понял что нужно сделать. Можно подробнее. Интересно просто...
← →
oxffff © (2006-12-12 23:08) [9]:)
ОК. ОК. Только сейчас прочитал.
Ну естественно "посещаемых". Пардон.
Джо прав.
← →
oxffff © (2006-12-12 23:12) [10]У нас есть объект разнообразных типов.
Есть посетитель.
Мы хотим добавить разновидности объектов причем старые "посетители" их игнорируют.
А новые посетители обрабатывают.
Без перекомпиляции.
← →
oxffff © (2006-12-12 23:18) [11]Я то собственно ответ знаю.
Поэтому было бы посмотреть на другие варианты решения задачи.
И возможно реализовать VisitorEx для удобства всех.
← →
Kolan © (2006-12-12 23:18) [12]> Без перекомпиляции.
Дмаю без этого не обойдется :)
> Мы хотим добавить разновидности объектов причем старые "посетители"
> их игнорируют.
Так а пытаться отвечать можно? Или ждать Cyrax?
← →
Джо © (2006-12-12 23:20) [13]> [4] Kostafey © (12.12.06 23:03)
> > Джо © (12.12.06 22:59)
>
> Вот какой смысл было меня расспрашивать по поводу
> http://delphimaster.net/view/2-1165941009/
Смысл в том, что изначальный вопрос задан был некорректно.
> Все равно ни от кого ответа не дождался.
> Вы -то не подскажете ?
Вот сижу я перед монитором и думаю, когда Костафей наконец описание проблемы даст. Прям отойти никуда не могу и все жду и жду...
← →
oxffff © (2006-12-12 23:25) [14]
> Kolan © (12.12.06 23:18) [12]
> > Без перекомпиляции.
>
> Дмаю без этого не обойдется :)
>
> > Мы хотим добавить разновидности объектов причем старые
> "посетители"
> > их игнорируют.
>
> Так а пытаться отвечать можно? Или ждать Cyrax?
А он ответит? Или вопросы задавать будет?
Вопрос(Проблема) всем понятен?
← →
Gero © (2006-12-12 23:25) [15]> [0] oxffff © (12.12.06 22:56)
Для личной переписки есть почта, ICQ и другие средства.
← →
Kolan © (2006-12-12 23:25) [16]Мы хотим добавить разновидности объектов причем старые "посетители" их игнорируют.
А новые посетители обрабатывают.
Без перекомпиляции.
И так дано:
TConcreteElement = class;
IVisitor = interface;
IElement = interface
procedure Accept(AVisitor :IVisitor);
end;
IVisitor = interface
procedure VisitTConcreteElement(AElement :TConcreteElement);
end;
TConcreteVisitor = class(TInterfacedObject, IVisitor)
public
procedure VisitTConcreteElement(AElement :TConcreteElement);
end;
TConcreteElement = class(TInterfacedObject, IElement)
public
procedure Accept(AVisitor :IVisitor);
end;
Добавляем новый объект.TNewElement = class(TInterfacedObject, IElement)
public
procedure Accept(AVisitor :IVisitor);
end;
Дальше незнаю - сдаюсь :(
← →
Kostafey © (2006-12-12 23:26) [17]> Смысл в том, что изначальный вопрос задан был некорректно.
OK ! А сейчас я исправился ?
← →
Kostafey © (2006-12-12 23:29) [18]> [13] Джо © (12.12.06 23:20)
Да я просто немного поэкспериметировал тут, всяко разно, память помучил.
После такого всякого на флуд потянет.
← →
oxffff © (2006-12-12 23:31) [19]Есть посетитель
ObjectAbstractVisitor=class
protected
procedure AbstractContainer(obj:TAbstractContainer);
public
procedure AbstractObject(obj:TAbstractObject);virtual;
procedure Container(obj:TContainer);virtual;
procedure SomeType1(obj:TSomeType1);virtual;
procedure SomeType2(obj:TSomeType2);virtual;
procedure SomeType3(obj:TSomeType3);virtual;
procedure SomeType4(obj:TSomeType4);virtual;
end;
Есть объект
TSomeBaseclass=class
procedure accept(visitor:ObjectAbstractVisitor)
end;
Надо модифицировать "GOF паттерн" visitor таким образом,
чтобы можно было добавлять TSomeType5,TSomeType6,TSomeType7,..
Да так чтобы старые посетители работали только с им известными объектами (старыми типами), а новые посетители работали со всеми.
И все это без перекомпиляции.
← →
Kolan © (2006-12-12 23:35) [20]Удалено модератором
← →
Cyrax © (2006-12-12 23:38) [21]>oxffff © (12.12.06 22:56)
Ну, вот это другое дело... а то один флуд...
К какому сроку тебе предоставить ответ ?
← →
oxffff © (2006-12-12 23:41) [22]Собственно не ответ.
А совместный труд.
Который можно реализовать и использовать всем.
Аля GOD (GAND OF DELHI).
Ведь наверняка кто то сталкивался с такимим трудностями и хотел бы решить. А тут готовые подходы, да еще и Ex
← →
Marser © (2006-12-12 23:42) [23]Удалено модератором
← →
oxffff © (2006-12-12 23:42) [24]Аля GOD (GAND OF DELPHI). опять опечатался.
← →
oxffff © (2006-12-12 23:46) [25]Да что такое
Аля GOD (GANG OF DELPHI).
Опять. опять опечатался.
Боюсь, а то ДЖО наругает. И будет прав кстати.
← →
oxffff © (2006-12-12 23:49) [26]
> Marser © (12.12.06 23:42) [23]
> > [1] Джо © (12.12.06 22:59)
> > > состава "посейщаемых объектов"
> >
> > И что ви такое гойворите? :D
>
> И не что, а шё :-)
Человек ошибся.
Ты бы лучше подкинул вариант. Или настолько умный, что не до нас.
Я уже написал, что опечатался.
← →
Marser © (2006-12-13 00:15) [27]Удалено модератором
← →
Суслик © (2006-12-13 00:45) [28]Сделать расширяемый состав посещаемых объектов можно только если ты сделаешь *своих* посредников, знающих как посещать объект, который ранее не предполагался для посещения. т.е. что-то типа прокси+визитор.
← →
oxffff © (2006-12-13 00:52) [29]
> Суслик © (13.12.06 00:45) [28]
> Сделать расширяемый состав посещаемых объектов можно только
> если ты сделаешь *своих* посредников, знающих как посещать
> объект, который ранее не предполагался для посещения. т.
> е. что-то типа прокси+визитор.
Кстати никто не мешает переделать вообще схему взаимодействия.
Варианты есть, я лично знаю 3.
← →
oxffff © (2006-12-13 00:57) [30]Намекну.
Поскольку типы объектов добавляются динамически, расширяя количество типов. То и схему взаимодействия надо менять.
Основываясь не на статической привязки к смещению в VTB.
А на чем то более динамическом.
Основная идея паттерна, "мы не опрашиваем объект, а он сам говорит кто он"
Один из вариантов.
А почему бы не использовать dynamic методы.
← →
oxffff © (2006-12-13 01:02) [31]То есть диспетчеризация происходит динамически.
← →
Суслик © (2006-12-13 01:04) [32]
> oxffff © (13.12.06 00:57) [30]
> Намекну.
если честно, то не интересно, ибо задача лишена промышленной ценности (для меня).
← →
Kolan © (2006-12-13 08:57) [33]Интересно. А как разнести посетителя и элемент по модулям? Corcular unit refrence получается...
← →
isasa © (2006-12-13 10:33) [34]Kolan © (13.12.06 08:57) [33]
А COM-ом это животное не пробовали?
← →
Kolan © (2006-12-13 10:46) [35]> А COM-ом это животное не пробовали?
Нет. Пока я не пойму как сделать так чтобы паттерны был в разных модулях. А то так выходит все посещаемые классы должны быть в одном модул....
← →
Kolan © (2006-12-14 10:24) [36]Ну как всегда, не ответа на вопрос. Ни решения. :(
← →
ЮЮ © (2006-12-14 10:41) [37]Что значит работали с новым типом TSomeType5?
ещё один метод
procedure SomeType5(obj:TSomeType5);virtual; ? это, по твоему работа?
О обычное наследование разве не решает этих проблем.
а это вообще кошмар с точки зрения высшей степени абстракции :)
procedure SomeType1(obj:TSomeType1);virtual;
procedure SomeType2(obj:TSomeType2);virtual;
procedure SomeType3(obj:TSomeType3);virtual;
procedure SomeType4(obj:TSomeType4);virtual;
Нет ли ссылки на человеческое описание "GOF паттерн Visitor", а то ни смысла, ни проблемы не вижу :(
← →
oxffff © (2006-12-14 11:16) [38]
> Kolan © (14.12.06 10:24) [36]
> Ну как всегда, не ответа на вопрос. Ни решения. :(
См. посты выше.В них есть намеки на решения.
Что касаемо контретной реализации, то я хотел написал статью по этому поводу" , но в силу обстоятельств сделать это сейчас не могу.
> ЮЮ © (14.12.06 10:41) [37]
> Что значит работали с новым типом TSomeType5?
>
> ещё один метод
> procedure SomeType5(obj:TSomeType5);virtual; ? это, по твоему
> работа?
> О обычное наследование разве не решает этих проблем.
>
> а это вообще кошмар с точки зрения высшей степени абстракции
> :)
> procedure SomeType1(obj:TSomeType1);virtual;
> procedure SomeType2(obj:TSomeType2);virtual;
> procedure SomeType3(obj:TSomeType3);virtual;
> procedure SomeType4(obj:TSomeType4);virtual;
>
> Нет ли ссылки на человеческое описание "GOF паттерн Visitor",
> а то ни смысла, ни проблемы не вижу :(
Возможно вам стоит обратить внимание на книгу "Банды четерых"
"Приемы объектно-ориентированного проектирования. Паттерны проектирования"
Гамма, Хелм, Джонсон, Влиссидес.
Хотя все примеры этой книги написаны на С++.
Поэтому при портирования их на Delphi(язык, почему теперь его так стали называть? Всегда был OP), часть их них использовать не имеет смысла.
А часть можно(нужно) модифицировать для более расширенного использования.
Простой пример "фабрика классов". Есть встроенное решение в Delphi - метаклассы (class of).
← →
Kolan © (2006-12-14 11:32) [39]> язык, почему теперь его так стали называть? Всегда был OP
Ты что, с 7 версии так.
> Хотя все примеры этой книги написаны на С++.
В BDS все они поддерживаются. [16] - я не руками написал.
← →
oxffff © (2006-12-14 11:53) [40]
> ЮЮ © (14.12.06 10:41) [37]
> Что значит работали с новым типом TSomeType5?
>
> ещё один метод
> procedure SomeType5(obj:TSomeType5);virtual; ? это, по твоему
> работа?
> О обычное наследование разве не решает этих проблем.
>
> а это вообще кошмар с точки зрения высшей степени абстракции
> :)
> procedure SomeType1(obj:TSomeType1);virtual;
> procedure SomeType2(obj:TSomeType2);virtual;
> procedure SomeType3(obj:TSomeType3);virtual;
> procedure SomeType4(obj:TSomeType4);virtual;
>
> Нет ли ссылки на человеческое описание "GOF паттерн Visitor",
> а то ни смысла, ни проблемы не вижу :(
У нас есть объект разнообразных типов.
Есть посетитель.
Мы хотим добавить разновидности объектов причем старые "посетители" их игнорируют.
А новые посетители обрабатывают.
Без перекомпиляции.
Страницы: 1 2 вся ветка
Текущий архив: 2007.01.07;
Скачать: CL | DM;
Память: 0.56 MB
Время: 0.01 c