пятница, 30 ноября 2007 г.

Четвертый день коференции Code  

На сайте CodeGear выложены материалы докладов в разбивке по дням конференции. Есть только flash-файлы. Исходников нет, но обычно в презентациях указывается где можно взять исходники.

На третьем и пятом дне (т.е. 28 и 30 ноября) я не был.
Зато был 29 ноября.

С большим удовольствием я послушал оба доклада Джима МакКи (Jim McKeeth): Exceptional Exceptions и Class Helpers: Friend or Foe.

Второй доклад мне лишний раз доказал, что хелперы есть хорошая разминка для ума, не более того. Я пока не решаюсь их широко использовать в работе - плохо документировны и имеют не всегда очевидное поведение (имхо). Для небольших вливаний (добавок) в класс вполне сгодятся. Главное - самому не запуться.
Замечу, что в презентации есть небольшой обзор блогов, которые писали о хелперах. Есть что почитать.

Первый доклад на тему исключений мне подкинул пару идей.
Я иногда вижу на форумах вопросы о том, как уменьшить размер консольного приложения.
Вот такое минимальное приложение у меня занимает 17920 байт

program Project1;
{$APPTYPE CONSOLE}
begin
end.


Если требуется наследование от Exception, то нужно подключать SysUtils, а это уже 44032 байта.

program Project1;
{$APPTYPE CONSOLE}
uses
 SysUtils;
begin
end.


Но ведь можно сделать проще - возбуждать не потомков Exception, а потомков TObject:

program Project1;
{$APPTYPE CONSOLE}
type
 TMyException = class
 end;
procedure Test;
begin
 raise TMyException.Create;
end;
begin
 try
  Test;
 except
  on E: TMyException do
   do something
 end;
end.


Такая программа уже весит 19456. Я, конечно, понимаю, что идиотизм экономить 20Кб, но это чем не ответ на вопрос о том, как сделать маленький EXE?

Также в докладе Джима об исключениях меня заинтересовала методика использования функции AcquireExceptionObject для управления временем жизни объекта исключения. К сожалению есть некий баг, относящийся к функции AcquireExceptionObject и парной ей функции ReleaseExceptionObject (если кратко, то в документации все неверно написано). Однако идея выбрасывать в качестве исключений объекты и при этом не давать им уничтожаться имеет право на жизнь.

program Project1;
{$APPTYPE CONSOLE}
type
 TMyException = class
 end;
procedure Test;
begin
 raise TMyException.Create;
end;
var
 C: TMyException = nil;
begin
 try
 Test;
 except
  on E: TMyException do
   C := AcquireExceptionObject;
 end;
 if C <> nil then
 begin
  здесь можно использовать C, но его нужно
  потом явно удалить, т.к. после вызова
  функции AcquireExceptionObject нарушен
  обычный контроль над временем жизни
  исключения.
  C.Free;
 end;
end.


Замечу, что подобным образом можно выбросить в качестве исключения, например, кнопку на форме, например так:

raise Button1;

Только нужно быть готовым к тому, что кнопка пропадет с экрана после такого вызова, т.к. будет удалена :)

Также имхо стоит обратить внимание на доклад Fighting Memory Leaks for Dummies, который сделал Francois Gaillard. Доклад про FastMM. В принципе материал схож с тем, который я приводил ранее. По теме сложно что-то сказать нового, т.к. вся документация по FastMM состоит из поисания в *.inc файле, поставляемом с FastMM.

Комментариев нет: