Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Какими новшествами языка вы уже пользуетесь... их довольно много... 
:(
    Опции темы
 
Какими новышествами языка delphi 2009 вы пользуетесь
Шаблоны (Generics) [ 4 ]  [36.36%]
Exit(<Результат функции>) [ 7 ]  [63.64%]
Анонимные методы [ 0 ]  [0.00%]
Всего проголосовавших: 11
В этом опросе возможен один вариант ответа
Гости не могут голосовать 
CodeMonkey
Дата 12.1.2009, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



А что, TList и TObjectList никто не пользуется в своих программах, что-ли?

Вот вместо них и можно использовать TList<конкретный-класс>, TObjectList<конкретный-класс>.

Это не единственный, но первый и самый близкий пример - ибо с этими классами наверняка работали все.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Alexeis
Дата 12.1.2009, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(kemiisto @  11.1.2009,  12:46 Найти цитируемый пост)
Кстати, сам Марко Кэнту прголосовал бы за Generics, ибо именно их он считает наиболее важным расширением языка Object Pascal с момента появления интерфейсов в Delphi 3.

  Я чуток покопался в хелпе 2009й. Все таки то что есть в Delphi for Win32 нельзя назвать Женериками, это на самом деле шаблоны. Делфийские шаблоны инстанцируются во время компиляции и для каждый инстанциированного шаблон является новым классом со своим RTTI и своим метаклассом. В Win32 нет динамического инстанцирования. Нельзя сделать шаблон по переменной метакласса. Проще говоря это то что есть в С++, только в упрощенном виде, со всеми вытекающими последствиями (ограничениями).


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
lukas
Дата 13.1.2009, 13:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 23.2.2007

Репутация: 3
Всего: 15



а вот кто нашел реальное применение анонимным методам??? это же по сути тот же процедурный тип.


--------------------
http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi.
PM MAIL WWW   Вверх
Bose
Дата 13.1.2009, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Цитата(lukas @  13.1.2009,  12:40 Найти цитируемый пост)
а вот кто нашел реальное применение анонимным методам??? это же по сути тот же процедурный тип.

+1 вот! меня смущает эта схожесть. Я пока не вижу что такого особенного в анонимных методах, чего нельзя было сделать с помощью процедурных типов.
PM MAIL WWW Skype   Вверх
bems
Дата 13.1.2009, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



lukas, 
Bose, вам нравится в каждом колбэке передавать явный указатель на контекст?



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Bose
Дата 13.1.2009, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Цитата(bems @  13.1.2009,  16:29 Найти цитируемый пост)
Bose, вам нравится в каждом колбэке передавать явный указатель на контекст?

Это случается не так часто, но пока что меня это не напрягало. К тому же это приводит к необходимости чётко определять входные параметры callback-процедур, что в свою очередь делает код более структурированным и уменьшает число возможных ошибок.
PM MAIL WWW Skype   Вверх
lukas
Дата 14.1.2009, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 23.2.2007

Репутация: 3
Всего: 15



ладно тогда покажите что можно реализовать такого через анонимные методы, чего нельзя реализовать через процедурные типы???


--------------------
http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi.
PM MAIL WWW   Вверх
CodeMonkey
Дата 14.1.2009, 16:44 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Цитата(lukas @  14.1.2009,  15:46 Найти цитируемый пост)
ладно тогда покажите что можно реализовать такого через анонимные методы, чего нельзя реализовать через процедурные типы???

http://forum.sources.ru/index.php?showtopi...t&p=2059967 :
Цитата
What can I do with an anonymous method which I can’t do without an anonymous method? Nothing.


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

Вообще же код:

Код
type
  TTest: reference to procedure;

var
  AnonMeth: TTest;

procedur Test;
var
  I, N, P: Integer;
begin
  I := 1;
  N := 2;
  P := 3;
  AnonMeth := (procedure (N: Integer);
               begin
                 P := I + N;
               end;);
  AnonMeth(N);
  ShowMessage(P);
end;

...

begin
  AnonMeth(3);
  AnonMeth := nil;
end;


Эквивалентен (грубый псевдо-код):

Код
type
  TTest: procedure of Object;

  ITestHelper = interface
     procedure Helper(N: Integer);
  end;

  TTestHelper = class(TInterfacedObject, ITestHelper)
  public
     I, P: Integer;
     procedure Helper(N: Integer);
  end;

procedure TTestHelper.Helper(N: Integer);
begin
   P := I + N;
end;

var
  AnonMeth: ITestHelper;

procedur Test;
var
  N: Integer;
begin
  AnonMeth := TTestHelper.Create;

  AnonMeth.I := 1;
  N := 2;
  AnonMeth.P := 3;
  // skipped
  AnonMeth.Helper(N);
  ShowMessage(AnonMeth.P);
end;

...

begin
  AnonMeth.Helper(3);
  AnonMeth := nil;          // здесь освобождается интерфейс => удаляется объект => заканчивают жизнь захваченные "локальные переменные"
end;


- В качестве базы используется объект, реализующий вспомогательный интерфейс. 
- Использование интерфейса позволяет автоматически производить очистку ресурсов (все "локальные переменные" удаляются автоматически, как только вы обнулите последнюю ссылку на анонимный метод).  
- Использование локальной переменной в процедуре фактически делает эту переменную полем внутреннего объекта. В нашем случае I и P уже не локальные переменные - это поля невидимого объекта.
- Вы можете увидеть этот интерфейс и вживую, если после имени переменной типа анонимный метод поставите точку: там будут методы IInterface + метод Invoke.
- Компилятор различает вспомогательные интерфейсы и обычные и не даёт их смешивать.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
bems
Дата 14.1.2009, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(Bose @  13.1.2009,  19:04 Найти цитируемый пост)
К тому же это приводит к необходимости чётко определять входные параметры callback-процедур, что в свою очередь делает код более структурированным
не согласен. Подумайте о случаях когда код явно разделен на обслуживающий (что-то типа api enumThreadWindows) и обслуживаемый (там то что вызывает эту апи и коллбэк там же). Если утверждать, что тип контекста было бы лучше определять четко, то это значит, что в модуле, где реализована EnumThreadWindows должен быть известен этот тип, что только ухудшит структурность (потому что этой функции не должно быть важно, что и как собрался делать вызывающий код с каждым окном - значит давать ей доступ к записи или объекту коллбэка - это создавать лишнюю связь между модулями)



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2211 ]   [ Использовано запросов: 24 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.