Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Освобождение ресурса в finally


Страницы:   1 2 ... 19 20 21 22 23 24 25 ... 32 33

Arinyshka ©   (2008-04-23 12:17:00) 

Не подскажете еще один момент:
Есть процедура, выглядит примерно так

procedure TSetPayFrm.BtnAddImageClick(Sender: TObject);
var  TempBitmap:TBitmap;
begin
if not(opendialog1.Execute) then  exit;
try
 TempBitmap  := TBitmap.Create;
 TempBitmap.LoadFromFile(OpenDialog1.FileName);
finally
TempBitmap.Free;
end;
end;

На освобождение  TempBitmap.Free; выдает варнинг
[Warning] uSetPaymentMain.pas(313): Variable 'TempBitmap' might not have been initialized
Не смертельно, но непонятно... почему варнинг? При изменениии условия и включении всей конструкции в один блок begin..end ситуация не менялась.


Восхищенный   (2008-04-25 15:51:00) [421]

> Leonid Troyanovsky ©   (25.04.08 15:48) [230]

Динамический действительно компактнее. Но медленнее. Поэтому ты неправ.


Восхищенный   (2008-04-25 15:49:00) [422]

> jack128_   (25.04.08 15:43) [224]

>  чем поможет наследование БЕЗ полиморфизма??

??????????????!!!!!!!!!!!!!!

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


Leonid Troyanovsky   (2008-04-25 15:48:00) [423]


> Восхищенный   (25.04.08 14:35) [213]

>  и делать его виртуальным
> (или динамическим, если замещение маловероятно).

Наоборот.
Динамический - компактней.

--
Regards, LVT.


Восхищенный   (2008-04-25 15:46:00) [424]

> jack128_   (25.04.08 15:27) [221]

Кстати, в отдельный метод ты вынес как раз НЕповторяющийся кусок кода (Sin и Cos). Что полностью противоречит [211] и о чем говорилось в [213].


jack128_   (2008-04-25 15:45:00) [425]


>
> Не. Статический не нужен

Ну с такой позиции - статические методы вообще не нужны ;-)  Кроме хаков, а-ля TObject.Free


Anatoly Podgoretsky   (2008-04-25 15:44:00) [426]

> ANB  (25.04.2008 15:10:38)  [218]

Хочешь знать как я сделаю?
Это будет зависить от задачи и от настроения иногда.


jack128_   (2008-04-25 15:44:00) [427]

в данном случае, я имею в виду..


Leonid Troyanovsky   (2008-04-25 15:44:00) [428]


> jack128_   (25.04.08 15:27) [221]

> // теперь мы вынесли общую часть кода - в статический метод.
>  Уменьшили дубляж кода..

Не. Статический не нужен.

function TMyBaseClass.VirtMethod(D: Double): Double; // virtual;
begin
Result := 152*D - D*D + sqr(D);
end;

function TMyClass1.VirtMethod(D: Double): Double; // override;
begin
Result := inherited VirtMethod(D);
Result := Result + sin(D);
end;

--
Regards, LVT.


jack128_   (2008-04-25 15:43:00) [429]


> Таким образом, для уменьшения дубляжа кода ты использовал
> наследование, а никакой не полиморфизм.

хе.  чем поможет наследование БЕЗ полиморфизма??


Восхищенный   (2008-04-25 15:41:00) [430]

> jack128_   (25.04.08 15:27) [221]

> я сделал тоже самое - нашел повторяющийся кусок кода - и вынес его в
> отдельную функцию(метод)

Таким образом, для уменьшения дубляжа кода ты использовал наследование, а никакой не полиморфизм. Для чего это самое наследование, собственно, и предназначено.

А полиморфизмты использовал не для уменьшения дубляжа кода, а для реализации разного поведения предка и наследника. Для чего этот самый полиморфизм, собственно, и предназначен.


Ega23   (2008-04-25 15:39:00) [431]


> "ну практически" и совсем нулевая - разные вещи.


Загляни прикола ради в конструктор TBitmap.
"ну практически" - здесь - пнули ногой системник, какой-то сбой операционки и т.п.


jack128_   (2008-04-25 15:27:00) [432]


> > полиморфизм используется для того же, для уменьшения дубляжа
> кода,


function TMyClass.MyFunc1(D: Double): Double;
begin
 Result := 152*D - D*D + sqr(D) + sin(D);
end;

function TMyClass.MyFunc2(D: Double): Double;
begin
 Result := 152*D - D*D + sqr(D) + cos(D);
end;


различие в двух функциях минимальное.

теперь прикрутим сюда полиморфизм:

type
 TMyBaseClass =class
   function VirtMethod(D: Double): Double; virtual; abstract;
   function MyFunc(D: Double): Double;
 end;

// теперь мы вынесли общую часть кода - в статический метод. Уменьшили дубляж кода..

function TMyBaseClass.MyFunc(D: Double): Double;
begin
 Result := 152*D - D*D + sqr(D) + VirtMethod(D);
end;

function TMyClass1.VirtMethod(D: Double): Double;
begin
 Result := sin(D);
end;

function TMyClass2.VirtMethod(D: Double): Double;
begin
 Result := cos(D);
end;


> так же подподает под критерий ANB


ну цитирую:

> я переношу в отдельную функцию код, если он повторяется
> более одного

я сделал тоже самое - нашел повторяющийся кусок кода - и вынес его в отдельную функцию(метод)


ANB   (2008-04-25 15:26:00) [433]


> ну практически нулевая.

"ну практически" и совсем нулевая - разные вещи.

Обниление до трая сожрет несколько тиков проца. И намного меньше, чем само создание объектов. Это так критично ?

Фри нилового объекта тоже пара тактов.


Ega23   (2008-04-25 15:21:00) [434]


> А для 6 как сделаешь ?


1. Я постараюсь такого не делать. Ну не встречал я ещё такой необходимости по созданию 6 объектов внутри одного метода, с обязательным их гроханием в том же методе.
2. Если всё-таки надо создать больше одного (ну, например, битмап в jpg), то тупо
bmp := TBitmap.Create;
jpg := TJPEGImage.Create;
try
 ..... работаем с ними
finally
 jpg.Free;
 bmp.Free;
end;


Дело в том, что вероятность того, что TBitmap или TJPEGImage дадут exception в конструкторе - ну практически нулевая.


ANB   (2008-04-25 15:10:00) [435]


> Ega23 ©   (25.04.08 14:57) [216]

А для 6 как сделаешь ?


Ega23   (2008-04-25 14:57:00) [436]


> Дык это Ega23 любит вложенные трай.


Где я такое говорил? Моё максимальное, что за 8 лет было -

......
try
 ........
 try
   ........
   try
     .......
   except

   end;
 finally

 end;
.......
except

end


Я просто такой фигнёй не страдаю, чтобы создать 6 объектов и в finally их грохать. Если тебе так писать понятнее и удобнее - ради бога.


Восхищенный   (2008-04-25 14:57:00) [437]

> jack128_   (25.04.08 14:51) [215]

> полиморфизм используется для того же, для уменьшения дубляжа кода,
??????????????!!!!!!!!!!!!!!!!!!!

> так же подподает под критерий ANB
??????????????


jack128_   (2008-04-25 14:51:00) [438]


> Для ООП нужно еще учитывать, нужен ли данному коду полиморфизм
> (то есть, может ли его функциональность быть изменена в
> классах-потомках). Если да, то код тоже надо выносить в
> отдельный метод и делать его виртуальным (или динамическим,
>  если замещение маловероятно).

какая разница, полиморфизм используется для того же, для уменьшения дубляжа кода, так что вынос общего кода в статический метод,а "переменного" кода - в виртуальные методы, так же подподает под критерий ANB ;)


ANB   (2008-04-25 14:44:00) [439]


> Восхищенный   (25.04.08 14:35) [213]

Да я как то не прусь от ООП. Пользуюсь, только если очень надо. Как то без него быстрее и понятней получается. Есно, это сугубо личное впечатление.


> Игорь Шевченко ©   (25.04.08 13:57) [212]

Вот выдержку не найду. Не уверен, что запрещены параллельные фетчи из одной сессии. Скорее всего опен у вас быстро отрабатывает и вы не нарывались на пересечение, когда они работают одновременно.
А сессия лежит на ДМ основного потока и на ошибку не нарывались при работе с ней из доп.потоков ?

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


Восхищенный   (2008-04-25 14:35:00) [440]

> ANB   (25.04.08 13:44) [211]

> я переношу в отдельную функцию код, если он повторяется более одного
> раза.

Нормальный подход для процедурного программирования, но неполный для ООП. Для ООП нужно еще учитывать, нужен ли данному коду полиморфизм (то есть, может ли его функциональность быть изменена в классах-потомках). Если да, то код тоже надо выносить в отдельный метод и делать его виртуальным (или динамическим, если замещение маловероятно).


Страницы:   1 2 ... 19 20 21 22 23 24 25 ... 32 33

Наверх

Титульная страница Поиск, карта сайта Написать письмо