Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1274170139
Крапивин Олег
2010-05-18 12:08
2010.08.27
Переключение датасетов


2-1269157020
Delphist2
2010-03-21 10:37
2010.08.27
вставка из буфера


15-1273613051
bd
2010-05-12 01:24
2010.08.27
usb hdd перестал определяться


15-1274405740
Дмитрий С
2010-05-21 05:35
2010.08.27
Мост в Волгограде


15-1265697833
12
2010-02-09 09:43
2010.08.27
Не будет ли так любезен сенсей дать скачать для offline познания?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский