Форум: "Прочее";
Текущий архив: 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