Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

А я и не знал...   Найти похожие ветки 

 
Дмитрий С ©   (2010-03-05 03:34) [0]

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


 
Дмитрий С ©   (2010-03-05 03:35) [1]

Теперь понятно зачем во Free проверка на Self <> nil


 
Lamer@fools.ua ©   (2010-03-05 09:18) [2]

>>Дмитрий С ©   (05.03.10 03:34)

>.. что если поднять исключение в конструкторе, то автоматически вызовется деструктор destroy.
"Как много нам открытий чудных..."

>Теперь понятно зачем во Free проверка на Self <> nil
Неправильно Вам понятно :-)


 
KSergey ©   (2010-03-05 09:34) [3]

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


 
oxffff ©   (2010-03-05 09:59) [4]


> Дмитрий С ©   (05.03.10 03:35) [1]
> Теперь понятно зачем во Free проверка на Self <> nil


Выход по исключению из конструктора находится за пределами операции присваивания. Поэтому воздействия на переменную-приемник никакого.


 
@!!ex ©   (2010-03-05 10:00) [5]

> [3] KSergey ©   (05.03.10 09:34)
> Да, к сожалению этот момент как-то обойден вниманием в книгах
> совершенно.

По одной простой причине:
Только в дельфи можно вызывать исключения в конструкторе.
И вообще, конструктор не должен делать ничего такого, что может вызвать исключение.
Для этого есть другие методы, например Init и LoadFromFile...
По хорошему конструктор должен только инициализировать объект значениями по умолчению.
А настраиватся объект должен отдельно.
Хотя я и сам в Дельфи частенько делаю лишнее в конструкторе.


 
Владислав ©   (2010-03-05 10:10) [6]


> @!!ex ©   (05.03.10 10:00) [5]


А мужики то не знают...


 
@!!ex ©   (2010-03-05 10:11) [7]

> [6] Владислав ©   (05.03.10 10:10)

Это точно.
Дельфи способствует говнокоду, встречал код написанный !мастерами! с вещами, за которые эти же мастера обычно новичков опускают. :)


 
brother ©   (2010-03-05 10:19) [8]

> новичков опускают. :)

опускают на зоне, а новичков тут сильно критикуют))))
зы не люблю подобные выражения просто...


 
@!!ex ©   (2010-03-05 10:21) [9]

> [8] brother ©   (05.03.10 10:19)

согласен. не имел ввиду зоновский смысл. :)


 
KilkennyCat ©   (2010-03-05 10:45) [10]


> Дельфи способствует говнокоду

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


 
Игорь Шевченко ©   (2010-03-05 10:55) [11]


> Дельфи способствует говнокоду


а народ вот другие языки тут не любит, говорит, что паскаль ваще рулез. странно, да ?


 
DrPass ©   (2010-03-05 10:59) [12]


> @!!ex ©   (05.03.10 10:11) [7]
> > [6] Владислав ©   (05.03.10 10:10)Это точно.Дельфи способствует
> говнокоду

Странный у тебя образ мышления.

> И вообще, конструктор не должен делать ничего такого, что
> может вызвать исключение.Для этого есть другие методы, например
> Init и LoadFromFile...По хорошему конструктор должен только
> инициализировать объект значениями по умолчению.А настраиватся
> объект должен отдельно.

...и понятия о правильной архитектуре


 
Ega23 ©   (2010-03-05 10:59) [13]


> Теперь понятно зачем во Free проверка на Self <> nil


Разницу между Free и Destroy осчусчаешь?  :)


 
oxffff ©   (2010-03-05 11:05) [14]


> @!!ex ©   (05.03.10 10:11) [7]
> > [6] Владислав ©   (05.03.10 10:10)
>
> Это точно.
> Дельфи способствует говнокоду,


Ощущается влияние gamedev.ru на тебя.


 
@!!ex ©   (2010-03-05 11:05) [15]

> [10] KilkennyCat ©   (05.03.10 10:45)

Ну да. Глобальные формы пользователь сам создает, а не Delphi это делает. :))


> [12] DrPass ©   (05.03.10 10:59)
> ...и понятия о правильной архитектуре

Если что - VCL так сделан.


 
@!!ex ©   (2010-03-05 11:07) [16]

> [14] oxffff ©   (05.03.10 11:05)

Не. gamedev.ru тут мало влияния оказывает.
Скорее Шлее и МакКоннелл


 
oxffff ©   (2010-03-05 11:07) [17]


> @!!ex ©   (05.03.10 11:05) [15]
> > [10] KilkennyCat ©   (05.03.10 10:45)
>
> Ну да. Глобальные формы пользователь сам создает, а не Delphi
> это делает. :))


Это делает программист.


 
@!!ex ©   (2010-03-05 11:10) [18]

> [17] oxffff ©   (05.03.10 11:07)

:))


 
DVM ©   (2010-03-05 11:14) [19]


> @!!ex ©   (05.03.10 10:00) [5]


> Только в дельфи можно вызывать исключения в конструкторе.

не только, в с++ тоже можно.


 
jack128_   (2010-03-05 11:18) [20]


> >Теперь понятно зачем во Free проверка на Self <> nil
> Неправильно Вам понятно :-)


>
> Выход по исключению из конструктора находится за пределами
> операции присваивания. Поэтому воздействия на переменную-
> приемник никакого.


вообще Free имеет непосредственное отношение к сабжевому вопросу.
Free было специально введено, для такого сценария работы с объектами:

type
 TMyObj = class
   FInnerObj: TObject;
 end;

constructor TMyObj.Create
begin
 DoWork(); // тут туча кода, который может кинуть исключение

 FInnerObj := TObject.Create;
end;

destructor TMyObj.Destroy;
begin
 FInnerObj.Free;
end;


 
@!!ex ©   (2010-03-05 11:21) [21]

> [19] DVM ©   (05.03.10 11:14)

http://www.cyberguru.ru/programming/cpp/cpp-programming-rules2-page73.html


 
DVM ©   (2010-03-05 11:24) [22]


> @!!ex ©   (05.03.10 11:21) [21]

Ненадежно и нельзя - это же разные вещи. То, что такой подход не самый лучший - очевидно.


 
@!!ex ©   (2010-03-05 11:27) [23]

> [22] DVM ©   (05.03.10 11:24)

Можно все.
Нельзя с точки зрения хорошего программирования. Вроде разговор именно в этом контексте.


 
Игорь Шевченко ©   (2010-03-05 11:34) [24]


> Free было специально введено, для такого сценария работы
> с объектами:


Источник ?


 
Piter ©   (2010-03-05 11:58) [25]

Дмитрий С ©   (05.03.10 3:34)
... что если поднять исключение в конструкторе, то автоматически вызовется деструктор destroy.


что очень логично. И это единственный нормальный способ прервать создание объекта.

@!!ex ©   (05.03.10 10:00) [5]
И вообще, конструктор не должен делать ничего такого, что может вызвать исключение.
Для этого есть другие методы, например Init и LoadFromFile...
По хорошему конструктор должен только инициализировать объект значениями по умолчению.
А настраиватся объект должен отдельно.


кто это сказал?

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


 
KSergey ©   (2010-03-05 12:54) [26]

> Игорь Шевченко ©   (05.03.10 11:34) [24]
> > Free было специально введено, для такого сценария работы с объектами:
> Источник ?

А что, есть возражения??
По-моему, как раз правильно написано, все в дельфи как раз и заточено именно под такой сценарий, включая автоматический вызов десруктора при исключениях в конструкторе.
Если это не так - просьба пояснить что и где именно.


 
Kerk ©   (2010-03-05 12:59) [27]


> @!!ex ©   (05.03.10 10:00) [5]
>
> По хорошему конструктор должен только инициализировать объект
> значениями по умолчению.
> А настраиватся объект должен отдельно.

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


 
@!!ex ©   (2010-03-05 13:03) [28]

> [27] Kerk ©   (05.03.10 12:59)

Тебя же не удивляет, что, например, TidTCPServer
все настройки идут после конструктора, а конструктор делает только базовую инициализацию.
Еще раз:
весь(во всяком случае большая часть, весь я его просто не видел) VCL сделан по такому принципу.


 
Kerk ©   (2010-03-05 13:06) [29]


> @!!ex ©   (05.03.10 13:03) [28]
> Тебя же не удивляет, что, например, TidTCPServer
> все настройки идут после конструктора, а конструктор делает
> только базовую инициализацию.

Не удивляет, но часто такой подход ничего кроме потенциальных проблем в себе не несет.


 
TUser ©   (2010-03-05 13:10) [30]

В шарпе можно исключения в конструкторе


 
KSergey ©   (2010-03-05 13:19) [31]

Kerk ©   (05.03.10 13:06) [29]
@!!ex ©   (05.03.10 13:03) [28]

По-моему, здесь надо четко различать разные языки.
Дельфи вполне заточен под исключения в конструкторе благодаря автовызову деструктора.
С++ - не заточен нифига, хотя руками на нем это сделать и можно, но только надеясь на свои руки и следование определенным шаблонам построения кода, пользоваться определенными классами, заточенными на автовызов деструктора при покидании области видимости.
С другой строны - просто не надо в С++ использовать указатели; автовызов деструктора есть и там, просто он в других ситуациях выполняется.


 
KSergey ©   (2010-03-05 13:21) [32]

> KSergey ©   (05.03.10 13:19) [31]
> С другой строны - просто не надо в С++ использовать указатели;

здесь имелось ввиду, что не надо использовать лишь указатели для хранения ссылок на объекты. Надо создавать полноценный объект, умеющий в деструкторе освобождать вверенный ему на хранение объект.


 
Ega23 ©   (2010-03-05 13:22) [33]


> В шарпе можно исключения в конструкторе


Дык и в Delphi можно, никто не запрещает. В VCL где-то видел. Сам использовал 1 раз в жизни, и то только потому, что иначе очень геморно получалось.


 
Игорь Шевченко ©   (2010-03-05 13:29) [34]

KSergey ©   (05.03.10 12:54) [26]


> А что, есть возражения??


Есть пожелания указывать источник, что TObject.Free был специально введен для подобных случаев.

Поскольку довольно часто встречаю конструкции вида:

destructor TFoo.Destroy;
...
if Assigned(FBar) then
  FBar.Free;
...
end;


или

destructor TFoo.Destroy;
...
if Assigned(FBar) then
  FreeAndNil(FBar);
...
end;


 
KSergey ©   (2010-03-05 13:36) [35]

> Игорь Шевченко ©   (05.03.10 13:29) [34]
> Поскольку довольно часто встречаю конструкции вида:

Я тоже могу привести примеры того, что "много где встречается". Плоховатого кода от незнания - его много, и что из того?
Источник, к стати, вами тоже не указан.

Реализация автоматического обнуления выделенной памяти под объект, автовызов деструктора, введение спец. метода Free с проверкой на nil - на мой взгляд явно указывает на то, что все это в комплексе сделано отнюдь не случайно, а для реализации именно такого стандартного кода, который приведен у jack128_   [20] и который мы повсеместно встречаем в VCL. Хотя не исключаю, что где-то в VCL есть и приведенный в [34] код, но разве это указывает на то, что в [20] написано что-либо некорректно?


 
DVM ©   (2010-03-05 13:39) [36]


> @!!ex ©   (05.03.10 13:03) [28]


> Тебя же не удивляет, что, например, TidTCPServer
> все настройки идут после конструктора, а конструктор делает
> только базовую инициализацию.

Это сделано по другой причине. Это компонент в первую очередь и должна быть возможность настройки менять в DesignTime потому так и сделано.


 
@!!ex ©   (2010-03-05 14:02) [37]

> [36] DVM ©   (05.03.10 13:39)

StringList тоже надо в DesignTime менять? ;)


 
Ega23 ©   (2010-03-05 14:08) [38]


> StringList тоже надо в DesignTime менять? ;)


А что с ним не так?


 
GrayFace ©   (2010-03-05 14:08) [39]

Piter, опередил :)
В С++ и других языках с убогими конструкторами я бы с процитированным согласился, частично. Там полноценная инициализация вообще невозможна в конструкторе - виртуальную функцию, перегруженную в наследнике, не вызвать, до конструктора предка что-то исполнить проблематично. Про исключения не знал.
А приминительно к Дельфи эта религиозная заповедь бессмысленна.


 
Kerk ©   (2010-03-05 14:09) [40]


> @!!ex ©   (05.03.10 14:02) [37]

Плохой пример. TStringList сразу после создания готов к работе. Речь о случаях, когда классу требуется дополнительная инициализация.



Страницы: 1 2 3 4 5 6 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.064 c
15-1269198653
windaws
2010-03-21 22:10
2010.08.27
Разработка АИС на Delphi


15-1273012753
Игорь
2010-05-05 02:39
2010.08.27
madCodeHook


2-1269519135
Влад
2010-03-25 15:12
2010.08.27
ActiveX


2-1268734595
MAcKZloy
2010-03-16 13:16
2010.08.27
ошибка в CBLRTSS.DLL


15-1275405572
AKE
2010-06-01 19:19
2010.08.27
Кто-нибудь пользовал браузер Fine Browser?