Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.07.26;
Скачать: CL | DM;

Вниз

Обновился 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;
Скачать: CL | DM;

Наверх




Память: 0.62 MB
Время: 0.025 c
2-1243785925
Сергей
2009-05-31 20:05
2009.07.26
Проблема с TTreeView


15-1242460113
PEAKTOP
2009-05-16 11:48
2009.07.26
Обновился Delphi RoadMap


2-1243933787
Igor2010
2009-06-02 13:09
2009.07.26
TabSheet в PageControl


15-1242893418
makvell
2009-05-21 12:10
2009.07.26
Вопрос знатокам oracle


15-1242798394
palva
2009-05-20 09:46
2009.07.26
Сегодня умер Олег Янковский