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

Вниз

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

 
PEAKTOP ©   (2009-05-16 11:48) [0]

На блоге Марко Кэнту появился отчет о конференции Embarcadero об Delphi RaodMap

Из интересных новшевств:
1) компилятор для Win64
2) возрождение Kylix в виде проекта DelphiX для компиляции под LINUX и MacOS
3) ориентация на Windows7 и новые устройства ввода данных (например, TouchScreen)

В общем, читаем сами
http://blog.marcocantu.com/blog/delphi_live_2009_2_roadmap.html


 
speller ©   (2009-05-16 12:33) [1]

Давно пора ) Только бы еще старые баги поправили )


 
Рамиль ©   (2009-05-16 12:33) [2]


> компилятор для Win64

У меня такое чувство, что когда делфи научится компилировать под x64, уже появится x128.


 
oxffff ©   (2009-05-16 12:49) [3]


> PEAKTOP ©   (16.05.09 11:48)  


Самое интересное extended RTTI.


 
Григорьев Антон ©   (2009-05-16 14:03) [4]


> PEAKTOP ©   (16.05.09 11:48)  
> 2) возрождение Kylix в виде проекта DelphiX для компиляции
> под LINUX и MacOS

Ну вот, опять путаница будет. Имя DelphiX уже занято.


 
oxffff ©   (2009-05-16 15:52) [5]

Можно еще здесь посмотреть картинки. Более информативно

http://robstechcorner.blogspot.com/2009/05/delphilive-pictures.html


 
Pavia ©   (2009-05-16 16:09) [6]


> > компилятор для Win64У меня такое чувство, что когда делфи
> научится компилировать под x64, уже появится x128.

По плану в конце текущего года должны.Если планы неменяли.


 
Кто б сомневался ©   (2009-05-16 16:38) [7]


> Давно пора ) Только бы еще старые баги поправили )


во - во. Баги хоть бы поправили. Из за некоторых трудно работать под 150% dpi, а в некоторых случаях даже нереально.


 
Кто б сомневался ©   (2009-05-16 16:42) [8]

а это сейчас мода такая, пальцами тыкать на большом экране с презентацией? указки (втч и лазерные) уже не рулят?


 
ZeroDivide ©   (2009-05-17 01:51) [9]

В целом, мне показалось, что новый Project Manager трезвый и ненакуренный. А именно из-за ошибок в проджект менеджменте, кастомеры с недоумением смотрели на все, что происходило с Delphi в последние годы.

Надежда есть. Я доволен. Думаю, сделают все что обещали, с учетом того что инвестиции в R&D по Delphi теперь в несколько раз больше. В общем, Delphi - forever, однозначно.


 
Eraser ©   (2009-05-17 02:50) [10]

> В целом, мне показалось, что новый Project Manager трезвый
> и ненакуренный.

да уж! радует, что последние несколько лет свернули они на праведный путь, подальше от .net и прочих ECO )


 
тимохов ©   (2009-05-17 12:31) [11]

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


 
pasha_golub ©   (2009-05-17 17:49) [12]


> тимохов ©   (17.05.09 12:31) [11]


> аспекто-оринетированное программирование

Шо це?


 
тимохов ©   (2009-05-17 19:22) [13]

2Павел.

Начни с этого http://ru.wikipedia.org/wiki/%D0%90%D1%81%D0%BF%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5

Я перечитал, в общем-то близко к моему пониманию АОС.
Вопросы будут, спрашивай.


 
T&F   (2009-05-19 05:00) [14]

Планы конечно радуют, как минимум 25% должно быть реализовано уже в этом году (хочется надеяться)

* Delphi Weaver – основной целью которого является улучшение юзабилити IDE, поддержка командной разработки(интеграция с SVN), DataSnap с поддержкой http, поддержка touchscreen-ов, поддержка Firebird-a в DbExpress, Soap 1.2, поддержка Windows 7 и кое-что ещё.
* Delphi “X” – кроссплатформенность(Linux + MacOs)
* Project Chromium – Pascal Code Formatter, документация по OpenToolsApi, новая модель привязки к данным(не через датасеты), более тесная интеграция с БД-тулзами от Embarcadero.
* Project Commodore – долгожданные 64-бита, поддержка многопоточности в RTL.


 
tesseract ©   (2009-05-19 09:56) [15]


> 2) возрождение Kylix в виде проекта DelphiX для компиляции
> под LINUX и MacOS


Надеюсь будет получше, чем в Kylix. И для маков Cocoa сделают. А то LCL пока не слишком-то под Cocoa собирается, да и сам лазер  не фонтан.


 
pasha_golub ©   (2009-05-19 16:44) [16]


> Я перечитал, в общем-то близко к моему пониманию АОС.

Херь какая-то. На кошках есть пример?


 
Тимохов_   (2009-05-19 17:00) [17]

2Павел

Вот статья вроде неплохая.
http://www.ibm.com/developerworks/ru/library/pollice/index.html
Их много в интернете.

Цитата оттуда:
Аспекты - это пересекающиеся (crosscutting) отношения. Поэтому аспекты непросто инкапсулировать в отдельный класс. Кроме того, если строго следовать объектно-ориентированной парадигме, необходимо представить такие отношения в единой, удобной для сопровождения форме.

Собственно здесь вся идея изложена. Тут надо почитать, подумать. Я не сразу понял, но сейчас активно пользую методологию АОП.


 
test ©   (2009-05-19 17:02) [18]

тимохов ©   (17.05.09 19:22) [13]
Ссылки на книги есть?


 
Юрий Зотов ©   (2009-05-19 17:06) [19]

> pasha_golub ©   (19.05.09 16:44) [16]

> На кошках есть пример?

Есть.

Пусть имеется здоровенная программа, работающая с БД. В ней куча классов, которые пишут данные в кучу таблиц. Все отлажено, все работает, но в один прекрасный день потребовалось ввсти логирование - что, куда и когда было в БД записано.

Что делать? Перекапывать здоровенные исходники и добавлять в кучу мест запись в лог? Это долго и чревато ошибками (что-нибудь обязательно будет упущено).

Пусть, к примеру, мы знаем, что реальные изменения в БД вносит метод Exec класса TQuery. Можно было бы переписать только его (добавив логирование), но портить генофонд не имеем права. Тогда используем АОП.

Пишем еще один класс и некий дескриптор к нему. Смысл этого действа заключается в том, что теперь, когда бы и откуда бы ни был вызван метод TQuery.Exec, этот вызов будет перехвачен и управление попадет в заранее определенный метод X нашего нового класса, а уж из этого метода X мы можем вызвать метод TQuery.Exec.

Поэтому добавляем в наш метод X ведение лога - и задача решена.


 
Тимохов_   (2009-05-19 17:15) [20]

2Павел. На пальцах.

Самый стандартный пример - это проверка прав доступа и логирование.

Вот представь, что у тебя есть программа в которой есть много-много методов, в которых нужно проверять права доступа, а в конце писать в лог. Каждый из этих методов состоит (допустим) из трех кусков:

1. Проверка прав.
2. Бизнес-логика.
3. Логирование.

1 и 3 - это паразиты, которые есть в каждом методе и которые есно, хочется обобщить и автоматизировать - т.е. чтобы они по факту были, но чтобы не болела голова об их добавлении в код.

Для подобного рода обобщений есть масса методологий. Например, можно методы засунуть в супер-класс, в нем сделать виртуальные методы для бизне-логики, а п.п. 1 и 3 вызывать в супер-классе. Можно еще как-то.

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

Например (это только пример!) в Delphi код может выглядеть так:


{$method_type "business"}
procedure PayMoney(...);
begin
  // только бизнес-логика
end;


при этом где-то для типа "business" описано, что нужно добавлять в конец и начало метода.

Текущие реализации есть в Java. Вроде JAspect называется штука.

Что это тебе даст? Посредством АОП ты сможешь сконцентрировать определенный *распределенный* по коду функционал в одно место. Вот, проверка прав и логирование хороший тому пример. Т.е.ты сплошные макароны разнопланового кода сможешь разделить по типам, а вместе тебе это все соберет компилятор.

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


 
Sergey Masloff   (2009-05-19 17:23) [21]

Тимохов_
 Эта фигня (не в плохом смысле) была известна задолго до придумавания слов АОП ;-)
 А вот с отладкой этого дела проблемы не возникают?


 
tesseract ©   (2009-05-19 17:42) [22]


> Смысл этого действа заключается в том, что теперь, когда
> бы и откуда бы ни был вызван метод TQuery.Exec, этот вызов
> будет перехвачен и управление попадет в заранее определенный
> метод X нашего нового класса, а уж из этого метода X мы
> можем вызвать метод TQuery.Exec.


Шуточки Smalltalk / Objective-C лохматых годов ?


 
Тимохов_   (2009-05-19 17:43) [23]

2Сергей.

Сам понимаешь, что программируя на дельфи я не могу давать директивы компилятору, какие аспекты куда вставлять, ибо таких директив таких пока нет.

У меня есть свое преломление данной методологии. В моем представлении АОП проблем с отладкой нет. Даже есть достоинства.

Если интересно, то могу поделиться своим подходом.

Представь, что есть некий самописный фреймворк для работы с БД в объектом стиле. Т.е. в памяти объекты, на диске реляционка. Фреймворк берет на себя все проблемы с мепингом, транзакциями и пр. Не сказать, что очень это производительно, но для задач построения систем бух. и фин. учета вполне хватает.

Объекты имеют супер-класс. В нем есть виртуальные методы: после_создания, перед_сохранением, после_ввода_значения и т.д. - штук 20.

Для прописывания конкретной логики я наследую от супер-класса, переопределяю нужные события и т.д.

Так я писал долгое время. Но со временем я понял, что простым наследованием для реализации парадигмы повторного использования кода не обойтись. Я пришел к выводу, что нужна какая-то смешанная методология, когда вроде бы разным классам можно прививать общую функциональность.

В результате искания в интернете (где-то 2005 год) я нашел АОП. Мне очень понравилась идеология разделения макаронного кода на аспекты (темы, точки зрения, как угодно :) ). В итоге я реализовал технологию, при которой каждому классу можно было приписывать один или более спец. классов, которых я назвал аспектами. Эти классы реализуют одну конкретную тему - будь то безопасность, или реализация конкретного бизнес-правила.

Все не так, конечно, просто. Но идейно получилась так, что теперь повторное использование кода в рамках моего фреймворка оказывается существенно упрощенным. К тому же чувствуешь себя спокойней - не забудешь что-то важное прописать: это за тебя сделает аспект. К тому же можно добиться того, чтобы сложные классы (более 100 полей, гора взаимосвязей и бизнес-правил) реализуются в декларативном стиле - набрал аспектов в класс, задал им параметры, прописал чуточку специальной логики и все. К тому же упрощяется тестирование: можно понять, какие аспекты привязаны к классу, посмотреть их описание и тестить именно по темам.

Конечно, это не совсем АОП, но с идейной точки зрения, ИМХО, это очень похоже на АОП. В зависимости от того, что эти ребята придумают в Delphi я может быть перееду на их АОП.


 
Игорь Шевченко ©   (2009-05-19 19:54) [24]

А в C++ примерно тем же самым занимается множественное наследование...На которое так долго ругались программисты на Паскале. Ан нет, идея-то жива, только очередные яйцеголовые ее по-другому обозвали - точки зрения там всякие и прочее словофлудие.


 
jack128_   (2009-05-19 22:29) [25]


> {$method_type "business"}
> procedure PayMoney(...);
> begin
>   // только бизнес-логика
> end;


насколько я понимаю технически такие вещи можно реализовать макросами LISP"а или например Nemerle.  Но в дельфи таких возможностей нет и не будет. Если CodeGear дженереки не осилил, то о таких продвинутых фишках можно и не мечтать.


 
jack128_   (2009-05-19 22:40) [26]

2 Тимохов
> Ан нет, идея-то жива, только очередные яйцеголовые ее по-
> другому обозвали - точки зрения там всякие и прочее словофлудие.
>

А как в той же задаче логирования вызовов тучи методов как те поможет множ. насл-ние - я не очень понимаю.


 
DVM ©   (2009-05-19 22:42) [27]


> Юрий Зотов ©   (19.05.09 17:06) [19]

На мой взгляд, это все выгладит как костыль. Если, конечно, только очень быстро надо - то это выход.


 
тимохов ©   (2009-05-19 22:43) [28]

2Женя

Я так понимаю, что Игорь говорил про мою интерпретацию АОП, а не про исходные примеры. В целом я с ним согласен. АОП и его интерпретации не панацея, а одна из методологий.

И вообще, задача с логированием - это частный случай. Просто он для примера хорош. Применений подхода много больше, нежели одно логирование.


 
Игорь Шевченко ©   (2009-05-19 22:46) [29]

jack128_   (19.05.09 22:40) [26]

Ты наверное ко мне хотел обратиться ? :)

Как в Turbo Vision на C++, где классы с какого-то момента в иерархии обладают свойством сериализации себя - подмешивается дополнительный предок, который умеет сериализовать.

Не думаешь же ты, что написание какого-то атрибута перед методом класса волшебным образом изменяет его поведение во всех языках программирования (насколько я слышал, в Java для этого изменяется byte-код)

На мой взгляд - это еще одна разновидность множественного наследования, только обозванная аспектно-ориентированным программированием.


 
Игорь Шевченко ©   (2009-05-19 22:50) [30]

тимохов ©   (19.05.09 22:43) [28]


> Я так понимаю, что Игорь говорил про мою интерпретацию АОП,
>  а не про исходные примеры


А иначе как сделать ? Механизм остается один - внедряется набор дополнительных функций, вероятно, еще одна таблица виртуальных методов, исправляется основная таблица, чтобы ее вызовы перенаправлялись во вновь созданную, там вокруг основных вызовов делаются обертки (before/after) - и вуаля.

Если ты это делал вручную, то понимаешь, насколько это выглядит в исходном коде.


 
Eraser ©   (2009-05-20 02:22) [31]

> [19] Юрий Зотов ©   (19.05.09 17:06)

хелперы, отчасти, решают эту проблему.


 
Псалтырь ©   (2009-05-20 08:25) [32]


> Игорь Шевченко ©   (19.05.09 19:54) [24]
>
> А в C++ примерно тем же самым занимается множественное наследование.
> ..На которое так долго ругались программисты на Паскале.
>  Ан нет, идея-то жива, только очередные яйцеголовые ее по-
> другому обозвали - точки зрения там всякие и прочее словофлудие.
>

+100


 
test ©   (2009-05-20 08:49) [33]

Игорь Шевченко ©   (19.05.09 22:46) [29]
А как же конечные автоматы? Там выставление состояний может менять поведение.


 
jack128_   (2009-05-20 10:05) [34]

2 Игорь
> Ты наверное ко мне хотел обратиться ? :)

Да такие философские темы идут, пока пост пишешь мысль так далеко ускачет, что забудешь с чего начинал и кому хотел ответить :-)


> Как в Turbo Vision на C++, где классы с какого-то момента
> в иерархии обладают свойством сериализации себя - подмешивается
> дополнительный предок, который умеет сериализовать.

таки нужно было просто добавить дополнительного предка и класс стал уметь себя стримить?? Или кроме собственно наследования нуно было было еще реализовать пару (десятков) виртуальных методов??  Если второе - то этот "доп. предок, который умеет сериализовать" - фактически всего лишь интерфейс. ничего более. А если второе - то тут конечно другое дело -)  
Но я се не представляю, как это было реализовано :-)


> Не думаешь же ты, что написание какого-то атрибута перед
> методом класса волшебным образом изменяет его поведение
> во всех языках программирования (насколько я слышал, в Java
> для этого изменяется byte-код)

Зависит от языка. В Java - не знаю, что там намутили, а например в Nemerle макросы - это процедуры, которые на вход получают AST и могут менять его. То есть банально вставить в в начало каждого метода, помечанного конкретным атрибутом, код:  Log.Write("<<<< " + AST.CurrentMethodName);


> Eraser ©   (20.05.09 02:22) [31]
>
> > [19] Юрий Зотов ©   (19.05.09 17:06)
>
> хелперы, отчасти, решают эту проблему.

Хм.  Единственный вариант с хелпером, который я вижу - это реализовать TQueryHelper.Exec и подключить модуль с этим хелпером в каждый модуль проэкта. Но это решение - суть макроподстановка. Некрасиво.. Или у тя другой вариант решения?


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

test ©   (20.05.09 08:49) [33]


> А как же конечные автоматы? Там выставление состояний может
> менять поведение.


Также, как конечные пулеметы

jack128_   (20.05.09 10:05) [34]


> а например в Nemerle макросы - это процедуры, которые на
> вход получают AST и могут менять его


Афигеть. То есть, программист пишет одно, а потом легким движением руки код превращается в вовсе не то, что кодом хотели сказать.

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


 
Petr V. Abramov ©   (2009-05-20 11:12) [36]


> новая модель привязки к данным(не через датасеты)

а через, пардон, что?


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

>Игорь Шевченко ©   (20.05.09 10:52) [35]

АОП и множественное наследование пересекаются только в случае implemetation injection.. когда хочется наделить объект уже готовой реализацией интерфейса. Но АОП на этом не заканчивается, достоинства его в декларативности, например заставляем метод работать в транзакции, проверяем права доступа и при этом ведем лог

[Transactional]
[Log]
[CheckPermission]
public void ChangeDocumentState(int id)
{
//business logic
}

такого эффекта невозможно достичь существующими средствами языка


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

Polevi ©   (20.05.09 11:27) [37]


> такого эффекта невозможно достичь существующими средствами
> языка


Пардон, какого языка ?


 
Polevi ©   (2009-05-20 11:35) [39]

Delphi, C#


 
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.68 MB
Время: 0.009 c
4-1213253318
DJ Kondakov
2008-06-12 10:48
2009.07.26
Отследить выгрузку DLL-ки


15-1242852156
Германн
2009-05-21 00:42
2009.07.26
Копирование таблицы из pdf в doc


15-1243404241
Unknown user
2009-05-27 10:04
2009.07.26
Windows Forms


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


15-1243262430
Unknown user
2009-05-25 18:40
2009.07.26
быстрый TTreeView





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский