![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Освобождение ресурса в finally
Arinyshka © (2008-04-23 12:17:00)
Страницы: < 1 2 ... 19 20 21 22 23 24 25 ... 32 33 >
Не подскажете еще один момент:
Есть процедура, выглядит примерно так
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]
> я переношу в отдельную функцию код, если он повторяется более одного
> раза.
Нормальный подход для процедурного программирования, но неполный для ООП. Для ООП нужно еще учитывать, нужен ли данному коду полиморфизм (то есть, может ли его функциональность быть изменена в классах-потомках). Если да, то код тоже надо выносить в отдельный метод и делать его виртуальным (или динамическим, если замещение маловероятно).