Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.07.26;
Скачать: [xml.tar.bz2];

Вниз

Обновился Delphi RoadMap   Найти похожие ветки 

 
Polevi ©   (2009-05-20 11:37) [40]

вот еще пример - кеширование вызовов метода

[Cachable]
public string SelectSomeData(int p1, int p2)
{
...
}

много можно придумать полезного...


 
Polevi ©   (2009-05-20 11:40) [41]

если кому интересно, рекомендую http://www.postsharp.org/
там есть примеры


 
test ©   (2009-05-20 11:49) [42]

Игорь Шевченко ©   (20.05.09 10:52) [35]
Про пулеметы не слышал поищу на досуге.

http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B9_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82
Конечный автомат — в теории алгоритмов математическая абстракция, позволяющая описывать пути изменения состояния объекта в зависимости от его текущего состояния и входных данных, при условии что общее возможное количество состояний конечно. Конечный автомат является частным случаем абстрактного автомата.

Многие с ним уже сталкивались, регулярные выражения(разбор текста) это как раз конечный автомат применительно к тексту. В игре Fear если я не ошибаюсь на конечных автоматах построена логика поведения врагов(обычных салдат а не босов).


 
Polevi ©   (2009-05-20 11:49) [43]

чтото меня проперло.. :)

например в Java есть ключевое слово seriallizable
public serializable void SomeMethod() - VM гарантирует что только один поток одновременно сможет выполнять этот метод

с помощью АОП возможно добавить такую функциональность в язык где она отсутствует - пишем аспект, который до вызова входит в критическую секцию, а после вызова выходит из нее

[Serializable]
public void SomeMethod()
{
...
}


 
Юрий Зотов ©   (2009-05-20 11:51) [44]

> test ©   (20.05.09 11:49) [42]

А логика поведения боссов построена на бесконечных автоматах.

Все как в жизни...
:o)


 
Palladin ©   (2009-05-20 11:54) [45]


> например в Java есть ключевое слово seriallizable

ээ.. я дико извиняюсь, а не synchronize ?


 
test ©   (2009-05-20 11:55) [46]

Юрий Зотов ©   (20.05.09 11:51) [44]
Нет босы на обычной логике и тупые, только живучие очень.

1 Искать пока не найдеш
2 нашел
3 стрелять
4 пункт 1

Инфузория туфелька во всем своем великолепии ))


 
Polevi ©   (2009-05-20 12:09) [47]

>Palladin ©   (20.05.09 11:54) [45]
да возможно, давно не писал на Java


 
Юрий Зотов ©   (2009-05-20 12:26) [48]

synchronized


 
Jack128_   (2009-05-20 13:24) [49]


>
> Удачи в сопровождении:)

Ну я не пишу на этих языках.

Без сомнения написание макросов требует определенных проф. навыков.  С другой стороны систему легко поломать и при обычном ООП, достаточно непродуманно изменить какой нить базовый класс.  
Тут все зависит от легкости отладки. А это уже проблема IDE.

> Polevi ©  
Nemerle, Nemerle, Nemerle.. Все твои примеры на раз два реализуются на этом языке..


 
Jack128_   (2009-05-20 13:40) [50]


> если кому интересно, рекомендую http://www.postsharp.org/

Хе. Прикольно


 
oxffff ©   (2009-05-20 13:41) [51]


> Polevi ©   (20.05.09 11:27) [37]
> >Игорь Шевченко ©   (20.05.09 10:52) [35]
>
> АОП и множественное наследование пересекаются только в случае
> implemetation injection.. когда хочется наделить объект
> уже готовой реализацией интерфейса. Но АОП на этом не заканчивается,
>  достоинства его в декларативности, например заставляем
> метод работать в транзакции, проверяем права доступа и при
> этом ведем лог
>
> [Transactional]
> [Log]
> [CheckPermission]
> public void ChangeDocumentState(int id)
> {
> //business logic
> }
>
> такого эффекта невозможно достичь существующими средствами
> языка


Это не правда.


 
Polevi ©   (2009-05-20 13:43) [52]

>Jack128_   (20.05.09 13:24) [49]
>Nemerle, Nemerle, Nemerle.. Все твои примеры на раз два реализуются на этом языке..

возможно, но это не мейнстрим а надстройка над ним.. так же как и postsharp


 
Polevi ©   (2009-05-20 13:44) [53]

>oxffff ©   (20.05.09 13:41) [51]
очень содержательно, продолжение будет или еще не придумали ?


 
pasha_golub ©   (2009-05-20 13:52) [54]

А как компилятор должен поступить со словечками, которые в квадратных скобульках? подставить реализацию? Откуда взять? А если реализация зависит от контекста вызова? Вообщем, во что превращается

[Transactional]
[Log]
[CheckPermission]
function Tralala

в итоге?

Простите, если туплю :)


 
Polevi ©   (2009-05-20 14:09) [55]

в скобульках названия классов-аспектов
если рассматривать реализацию АОП на примере пост шарп - то эта библиотека получает управление после сборки проекта, анализирует атрибуты, ищет в них классы-наследники своих типов и модифицирует IL-код, обрамляяя его вызовами или вообще заменяя реализацию (поведение будет зависеть от типа атрибута)

пример

   [Serializable]
   public sealed class Synchronized : PostSharp.Laos.OnMethodBoundaryAspect
   {
       public override void OnEntry(PostSharp.Laos.MethodExecutionEventArgs eventArgs)
       {
           //enter crytical section
       }

       public override void OnExit(PostSharp.Laos.MethodExecutionEventArgs eventArgs)
       {
           //exit crytical section
       }
   }

вызов любого метода помеченного атрибутом [Synchronized] PostSharp обернет примерно так

OnEntry()
try
{
 SomeMethod();
}
finally
{
 OnExit();
}


 
Polevi ©   (2009-05-20 14:12) [56]

а контекст вызова - имя метода, типа, список значений параметров и тд доступны из PostSharp.Laos.MethodExecutionEventArgs eventArgs, то есть реализация аспекта может зависеть от контекста


 
Jack128_   (2009-05-20 14:15) [57]


> pasha_golub ©   (20.05.09 13:52) [54]

конкретно в шарпе - компилятор создает экземпляры клоассов TransactionalAttribute/LogAttribute/CheckPermissionAttribute  стримит их в генерируемый exe.
Соответственно в exe"шнике где то должен быть код, который смотрит какие аттрибуты связаны с конкретным методом и что то делать.

то есть сам компилер шарпа не изменяет метод ChangeDocumentState, чтобы добавить логирование.

Насколько я понял - Пост шарп работает после компилера C# смотрит для каких методов заданы какие атрибуты и соответственно меняет тело этих методов.


 
Игорь Шевченко ©   (2009-05-20 14:20) [58]

Polevi ©   (20.05.09 11:35) [39]


> Delphi, C#


Если не секрет, каким образом добавление атрибутов в Delphi позволяет менять поведение классов ?


 
Polevi ©   (2009-05-20 14:27) [59]

>Игорь Шевченко ©   (20.05.09 14:20) [58]
а в Delphi уже есть атрибуты ?
Атрибуты это метаданные. Поведение может меняться при их анализе (компилятором или библиотекой)
Я могу написать код который будет анализировать RTTI типа и делать то или иное в зависимости от того что он там найдет.


 
Игорь Шевченко ©   (2009-05-20 14:29) [60]

Polevi ©   (20.05.09 14:27) [59]

Извини, прочитал слово "невозможно" в посте [37], как "возможно" :)

пост [58] прошу считать за срабатывание генератора случайных мыслей


 
boriskb ©   (2009-05-20 16:38) [61]

Извините за офтопик.

Это одна из самых замечательных веток, виденных мною на этом форуме за последние года 2.

Спасибо всем, прежде всего за стиль общения. :))

"Какое наслаждение - уважать людей"
А.П. Чехов.
:))


 
oxffff ©   (2009-05-20 19:07) [62]


> Polevi ©   (20.05.09 13:44) [53]
> >oxffff ©   (20.05.09 13:41) [51]
> очень содержательно, продолжение будет или еще не придумали
> ?


У меня есть идеи как это сделать. Но желания показывать нет. :)

Вкраце
Если делегирование на входе и выходе худо, бедно решается.
И даже можно будет намутить что то вроде задания в сравнимом синтаксисе
(прикрутив сюда анонимные методы)
[Serializable]
  public sealed class Synchronized : PostSharp.Laos.OnMethodBoundaryAspect
  {
      public

То вот с универсальной передачей параметров вызова делагату реализатору чуть сложнее, но тоже решается. Рекомендую обратиться к TInvokeableVariantType.
Да вызов будет через variant. Однако заполучить контекст вызова мы можем. И компилятор сделает их метаописание за нас.
и соответственно передать их в класс аспект.

procedure DispInvoke(Dest: PVarData; const Source: TVarData;
     CallDesc: PCallDesc; Params: Pointer); override;
Будет вам аналог PostSharp.Laos.MethodExecutionEventArgs

Единственное с чем я не согласен, так это ваша категоричность,
что этого сделать нельзя. Можно.


 
oxffff ©   (2009-05-20 19:10) [63]


> oxffff ©   (20.05.09 19:07) [62]


Хотя если будет не лень напишу об этом в своем блоге.


 
Polevi ©   (2009-05-21 09:54) [64]

>oxffff ©   (20.05.09 19:07) [62]
я знаю что такое IDispatch, и в курсе что перехватив GetIdsOfNames и Invoke можно реализовать прокси. Но причем тут АОП, где декларативность ?
К тому же назвать это средствами языка можно с большой натяжкой.. Это скорее COM а не Delphi


 
oxffff ©   (2009-05-21 10:42) [65]


> Polevi ©   (21.05.09 09:54) [64]
> >oxffff ©   (20.05.09 19:07) [62]
> я знаю что такое IDispatch, и в курсе что перехватив GetIdsOfNames
> и Invoke можно реализовать прокси. Но причем тут АОП, где
> декларативность ?
> К тому же назвать это средствами языка можно с большой натяжкой.
> . Это скорее COM а не Delphi


Я очень рад что вы знаете IDispatch.
Но он здесь не причем.
CustomVariant в руки + модуль objauto.
Декларативность очень простая.

Taspect=abstract class
 Enter(CallDesc: PCallDesc; Params: Pointer); );virtual;abstract
 Leave(CallDesc: PCallDesc; Params: Pointer); );virtual;abstract
end;

RegisterAspects(Tmytype,"MethodName",[Tsyncronyzed,TLogged,....]);

Обертка CustomVariant при вызове метода через objauto для типа вызывает

GetRegisteredAspectsForTypeMethod(Type:TClass;MethodName:string):Tlist<Taspect>

Далее мы можем run time добавлять, удалять aspects.

Декларативность вот
RegisterAspects(Tmytype,"MethodName",[Tsyncronyzed,TLogged,....]);

Idea By oxffff.


 
Polevi ©   (2009-05-21 11:08) [66]

а CustomVariant не через IDispatch работает ? (нет делфи под рукой не могу посмотреть исходники)

>Декларативность вот
>RegisterAspects(Tmytype,"MethodName",[Tsyncronyzed,TLogged,....]);

ну если это назвать декларативностью..
впрочем если вы считаете что эта реализация "средствами языка" - ради бога
ООП можно и на ассемблере реализовать конечно.. ручками VTABLE формировать и прочее..


 
oxffff ©   (2009-05-21 11:54) [67]


> Polevi ©   (21.05.09 11:08) [66]
> а CustomVariant не через IDispatch работает ? (нет делфи
> под рукой не могу посмотреть исходники)


Нет. Он работает параллельно.

procedure _DispInvoke(Dest: PVarData; const Source: TVarData;
 CallDesc: PCallDesc; Params: Pointer); cdecl; var
 LHandler: TCustomVariantType;
 LDest: TVarData;
 LDestPtr: PVarData;
begin
 // dereference source
 if Source.VType = varByRef or varVariant then
   _DispInvoke(Dest, PVarData(Source.VPointer)^, CallDesc, Params)
 else
 begin

   // figure out destination temp
   if Dest = nil then
     LDestPtr := nil
   else
   begin
     VariantInit(LDest);
     LDestPtr := @LDest;
   end;

   // attempt it
   try

     // we only do this if it is one of those special types
     case Source.VType of
       varDispatch,
       varDispatch + varByRef,
       varUnknown,
       varUnknown + varByRef,
       varAny:
         if Assigned(VarDispProc) then
           VarDispProc(PVariant(LDestPtr), Variant(Source), CallDesc, @Params);
     else
       // finally check to see if it is one of those custom types
       if FindCustomVariantType(Source.VType, LHandler) then
         LHandler.DispInvoke(LDestPtr, Source, CallDesc, @Params)        else
         VarInvalidOp;
     end;
   finally

     // finish up with destination temp
     if LDestPtr <> nil then
     begin
       _VarCopy(Dest^, LDestPtr^);
       _VarClear(LDest);
     end;
   end;
 end;
end;


> ну если это назвать декларативностью..


По другому это не назвать.


 
Polevi ©   (2009-05-21 12:02) [68]

да называйте как хотите, все равно ваша реализация не попадает по определение "средствами языка", а именно это я оспаривал в [37]


 
oxffff ©   (2009-05-21 13:10) [69]


> Polevi ©   (21.05.09 12:02) [68]
> да называйте как хотите, все равно ваша реализация не попадает
> по определение "средствами языка", а именно это я оспаривал
> в [37]


Ну да точно, я же это сделал сферическим конем в вакууме.


 
Polevi ©   (2009-05-21 14:01) [70]

именно конем
при желании добавить аспект к методу необходимо найти все его вызовы и обернуть в CustomVariant или
написать его прокси-обертку который обернет вызов в CustomVariant
если бы это было "средством языка" этим бы компилятор занимался



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2009.07.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.61 MB
Время: 0.007 c
15-1242852156
Германн
2009-05-21 00:42
2009.07.26
Копирование таблицы из pdf в doc


2-1243865732
Black
2009-06-01 18:15
2009.07.26
"Подсветка даты" в TMonthCalendar А здесь смотрели?


15-1242935407
Эстет
2009-05-21 23:50
2009.07.26
Чему равно 2*2,222


2-1243428554
Mishenka
2009-05-27 16:49
2009.07.26
Как отловить событие закрытия ToolBar a ?


15-1243109560
Tornado
2009-05-24 00:12
2009.07.26
Вопрос по вебу





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский