Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.57 MB
Время: 0.038 c
6-1154691688
digger
2006-08-04 15:41
2007.01.07
TIdSimpleServer грузит процессор


15-1166439510
zdm
2006-12-18 13:58
2007.01.07
Бесплатный Инсталлятор


2-1166208980
=[)eSTr0YYeR=
2006-12-15 21:56
2007.01.07
Как получить список файлов в каталоге?


15-1166111663
ferr
2006-12-14 18:54
2007.01.07
Вопросик)


3-1161522213
Piero
2006-10-22 17:03
2007.01.07
Database Desktop