Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизА я и не знал... Найти похожие ветки
← →
Дмитрий С © (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;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.066 c