Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Какими новшествами языка вы уже пользуетесь...


Автор: lukas 9.1.2009, 10:54
Стало интересно какими новыми возможностями языка люди начали активно пользоваться.

Мне например очень понравилась конструкция Exit(<Результат функции>), т.к. меня часто раздражало что то типа этого:


схематично...

Код

for i := 0 to 200 do
  if a = b then
    begin
         Result := bla bla bla
         exit;
    end;


а теперь намного легче..

Код

for i := 0 to 200 do
  if a = b then
         exit(bla bla bla)


Для меня это аналог return'a из Си.


UPD

Модераторы, пожалуйста, добавьте в опрос опцию выбора нескольких вариантов ответа.

Автор: kemiisto 9.1.2009, 12:03
Generics. Кстати, мне кажется более удачным переводом этого термина "параметризованные типы данных". Лучше отражает суть.

Автор: Bose 9.1.2009, 16:44
Я пока только exit использую. Я даже старые возможности использую не на полную. Например, только недавно стал пользоваться явными указателями на Boolean, integer. опять-таки только недавно стал шире использовать процедурные типы. smile А классовые функции вообще никогда не использовал. Классовые типы(type T1Class = class of T1) тоже только недавно стал применять. До сих пор избегаю конструкции for..in, ибо ещё непривычно. 

На анонимные методы пока только облизываюсь издалека, ещё не придумал где их полезнее заюзать. С Generics аналогично. 

К слову сказать, я думаю, что старые возможности на полную мощность использут вообще единицы программистов. ;-) Как думаете?



Автор: CodeMonkey 9.1.2009, 17:41
Во-первых, список не полон, во-вторых низзя выбрать несколько значений ;)
Лично я уже использую генерики, exit, новые исключения, ну и unicode, разумеется. Ну и может ещё какие более мелкие хрюшки, о которых вот так сходу и не упомнишь.

Автор: Bose 9.1.2009, 17:58
CodeMonkey, а разве новые исключения исключения нужно как-то специально использовать? [*]

[*] Кроме http://blog.marcocantu.com/blog/fun_delphi_2009.html; 


Кстати вот какие новшевства http://blog.marcocantu.com/blog/6hidden_delphi2009.html:
    * InnerException (that is you raise an exception while handling one... and both exception objects are kept around)
    * TTextReader interface for streams (and strings), this is so nice you won't care about StringBuilder
    * You can change the internal classes used by any DataSet by changing a global variable holding a class (FieldDefs, IndexDefs, Params... and many more)
    * TObject.ToString and the other new methods of the TObject class
    * commented deprecated (that is, deprecated with a string indicating an extra compiler hint, too bad it is not used much by the VCL)

Автор: bems 9.1.2009, 18:51
Цитата(kemiisto @  9.1.2009,  12:03 Найти цитируемый пост)
"параметризованные типы данных"

это слишком мелко. Я за "абстракции параметрического полиморфизма"
Цитата(CodeMonkey @  9.1.2009,  17:41 Найти цитируемый пост)
новые исключения

это шо за звери?

Автор: THandle 9.1.2009, 22:39
Ничего из перечисленного не использую.

Exit конечно удобно, но, ИМХО, лучше оставить обратную совместимость в этом деле smile

Не настолько уж сложно написать

Код

Result := хто_то;
Exit;


Unicode использую smile


С генериками разобрался, но где использовать пока не вижу... smile

А вообще:
Цитата(CodeMonkey @  9.1.2009,  17:41 Найти цитируемый пост)
Во-первых, список не полон, во-вторых низзя выбрать несколько значений ;)


smile

Всем привет кстати. Что то давно в общих не писал...

Автор: CodeMonkey 10.1.2009, 02:56
Не, ну как же. Впервые в истории Delphi изменился класс Exception - и не использовать это? 
Да, в первую очередь я имею ввиду именно InnerException. В предыдущих Delphi мне приходилось его эмулировать вручную в своих классах.

Автор: Akella 10.1.2009, 21:39
а TStringBuilder забыли  smile

Добавлено через 2 минуты и 2 секунды
Цитата(Bose @  9.1.2009,  17:58 Найти цитируемый пост)
Кстати вот какие новшевства упоминает Марко Канту:
    * InnerException (that is you raise an exception while handling one... and both exception objects are kept around)
    * TTextReader interface for streams (and strings), this is so nice you won't care about StringBuilder
    * You can change the internal classes used by any DataSet by changing a global variable holding a class (FieldDefs, IndexDefs, Params... and many more)
    * TObject.ToString and the other new methods of the TObject class
    * commented deprecated (that is, deprecated with a string indicating an extra compiler hint, too bad it is not used much by the VCL)

а можно на русском?

Добавлено через 3 минуты и 24 секунды
Не голосовал пока что, может через годик проголосую, я в D2009 пока только балуюсь.

Автор: Bose 11.1.2009, 01:25
Цитата(Akella @  10.1.2009,  21:39 Найти цитируемый пост)
а можно на русском?

Я затрудняюсь перевести, потому что сам толком не понимаю. smile

Автор: CodeMonkey 11.1.2009, 03:57
    * InnerException (т.е. вы можете возбудить исключение при обработке другого... и оба объекта исключения будут сохранены для последующей обработки)
    * Интерфейс TTextReader для потоков (и строк)
    * Вы можете менять внутренние классы, используемые любым DataSet, меняя глобальные переменные (FieldDefs, IndexDefs, Params... и другие)
    * TObject.ToString и другие новые методы класса TObject
    * deprecated с комментами (т.е. ключевое слово deprecated с дополнительной строкой-хинтом, очень жаль что эта возможность пока не слишком используется в самой VCL)

P.S. Но это изменения только RTL и то далеко не все.

Автор: Bose 11.1.2009, 04:27
Ещё некоторые новшевства(из Delphi 2009 Help)

Новая директива компилятора: $POINTERMATH [ON|OFF]. включает выполнение математических операций над указателями.
(надеюсь, что даже сталкиваться с таким кодом не придётся)

VCL и RTL

Новые компоненты 
Ribbon Controls, TButtonedEdit и TCategoryPanel, TCategoryPanelGroup, TLinkLabel, TTListGroup, TListGroups, TCustomHint, TBalloonHint


Новые классы:
TCharacter, TEncoding, TStringBuilder, TStringReader, TStringWriter , TStreamReader, TStreamWriter.

Добавлено через 6 минут и 21 секунду
Ещё 2 заметки с комментариями о новинках в блоге romkin:
http://vingrad.ru/blogs/romkin/2008/09/08/delphi-2009-chto-novogo/
http://vingrad.ru/blogs/romkin/2008/09/09/delphi-2009-chto-novogo-2/

Автор: Akella 11.1.2009, 13:03
Ну вот, уже лучше, а то три новшества написал и голосуйте smile 

Автор: kemiisto 11.1.2009, 13:46
Кстати, сам Марко Кэнту прголосовал бы за Generics, ибо именно их он считает наиболее важным расширением языка Object Pascal с момента появления интерфейсов в Delphi 3. smile 

Автор: lukas 12.1.2009, 10:08
я вот тоже пока не знаю где использовать Шаблоны, а ведь есть какие то уже встроенные шаблоны, кто знает какие есть и как ими пользоваться могут рассказать.

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

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

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

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

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

Автор: lukas 13.1.2009, 13:40
а вот кто нашел реальное применение анонимным методам??? это же по сути тот же процедурный тип.

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

+1 вот! меня смущает эта схожесть. Я пока не вижу что такого особенного в анонимных методах, чего нельзя было сделать с помощью процедурных типов.

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

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

Это случается не так часто, но пока что меня это не напрягало. К тому же это приводит к необходимости чётко определять входные параметры callback-процедур, что в свою очередь делает код более структурированным и уменьшает число возможных ошибок.

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

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

http://forum.sources.ru/index.php?showtopic=248615&view=findpost&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.
- Компилятор различает вспомогательные интерфейсы и обычные и не даёт их смешивать.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)