![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как убить объект из его же метода? [D7]
Ega23 © (2007-10-12 13:17:00)Собственно, сабж.
Есть идея с PostMesage WM_DESTROY, но возникает вопрос - а если это не "оеонный" класс?
Leonid Troyanovsky (2007-10-15 20:14:00) [21]
> oxffff © (15.10.07 19:39) [82]
> Да я то понял, что вся наша дискуссия как всегда ни к чему
> не привела.
Меня привела ;)
--
Regards, LVT.
Leonid Troyanovsky (2007-10-15 20:12:00) [22]
> oxffff © (15.10.07 19:29) [79]
lv.t[&]rambler.ru
--
Regards, LVT.
oxffff (2007-10-15 19:39:00) [23]
> Leonid Troyanovsky © (15.10.07 19:36) [81]
Да я то понял, что вся наша дискуссия как всегда ни к чему не привела.
Точнее привела конечно же.
К тому, что в .NET таких вопросов в managed коде нет.
Leonid Troyanovsky (2007-10-15 19:36:00) [24]
> oxffff © (15.10.07 19:28) [78]
> Тогда каждый объект убивает себя сам.
> Destroy, FreeInstance чьи методы? :)
Наши методы.
А речь-то была о не наших.
Т.е., о том, чтоб не рядили методы в белые одежды деструктора, f.e.
Тем более, что они могут сработать через раз.
--
Regards, LVT.
Leonid Troyanovsky (2007-10-15 19:31:00) [25]
> Ins © (15.10.07 19:19) [76]
> Вот менее очевидный пример:
Эх, жаль, что он не более очевиден :)
Но, в любом случае, думаю, что все желающие сумели
сделать правильные выводы о надлежащем проектировании.
--
Regards, LVT.
oxffff (2007-10-15 19:29:00) [26]
> Leonid Troyanovsky © (15.10.07 19:21) [77]
Возможно ли с вами как то связаться?
oxffff (2007-10-15 19:28:00) [27]
> Видимо, речь шла о том, что видимо.
> Убиение объекта из его же метода, см. сабж.
Тогда каждый объект убивает себя сам.
Destroy, FreeInstance чьи методы? :)
Leonid Troyanovsky (2007-10-15 19:21:00) [28]
> oxffff © (15.10.07 19:16) [75]
> Речь видимо шла об управлением временем жизни объекта?
Видимо, речь шла о том, что видимо.
Убиение объекта из его же метода, см. сабж.
Вот, поэтому, IMHO, и обсуждения простых вещей столь длительны.
Потому, как каждый позволяет себе вольность восприятия темы
и ее предыдущих обсуждений.
--
Regards, LVT.
Ins (2007-10-15 19:19:00) [29]
> Например, Release & ProcessMessages.
Вот менее очевидный пример:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
protected
procedure WndProc(var Message: TMessage); override;
procedure WtiteToLog(Message: TMessage); virtual;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Release;
end;
procedure TForm1.WndProc(var Message: TMessage);
begin
inherited;
WtiteToLog(Message);
end;
procedure TForm1.WtiteToLog(Message: TMessage);
begin
// Do something
end;
end.
oxffff (2007-10-15 19:16:00) [30]
> Palladin © (15.10.07 18:07) [73]
> ну, млин, из-за такой ерунды такую страшную дилему развели.
> .. реально, ИМХО, если вдруг объекту требуется самое себя
> уничтожить, то это уже ошибка проектирования...
Странно, вообще все объекты себя сами убивают. См. destroy
Речь видимо шла об управлением временем жизни объекта?
Leonid Troyanovsky (2007-10-15 18:23:00) [31]
> Palladin © (15.10.07 18:07) [73]
> .. реально, ИМХО, если вдруг объекту требуется самое себя
> уничтожить, то это уже ошибка проектирования...
Уже два ИМХО :)
Но, к сожалению (?), такие вещи голосованием не решают.
А самые длиные топики растут из ерунды, вроде
PChar & String, global variable - MD, формы в dll & etc :)
--
Regards, LVT.
Palladin (2007-10-15 18:07:00) [32]ну, млин, из-за такой ерунды такую страшную дилему развели... реально, ИМХО, если вдруг объекту требуется самое себя уничтожить, то это уже ошибка проектирования...
Leonid Troyanovsky (2007-10-15 18:03:00) [33]
> Суслик (15.10.07 17:07) [70]
> Убиение себя - вещь неординарная. У меня в моем OPF фреймворке
> есть несколько таких моментов. Но каждый из них продокументирован
> жесточайщим образом с акцентами на тонкостях жизни после
> смерти.
Ну, а стоит ли делать столько оговорок, типа: после этого
вызова нельзя делать то-то и то-то, а это предварять этим.
Нам должно быть достаточно знать, что конструктор создает,
а Destroy - убивает, никакие компромиссы вроде функций,
возвращающих объект или методов-убийц нам не нужны.
А если при выполнении метода что-то пошло не так, то
исключение - вполне достойный способ известить об этом.
> ЗЫ Перечитал - ни о чем написал. Ну так и топик вобщем-то
> не особо информативен :)
Может и так.
Однако, мне удалось, надеюсь, избавиться от некоторых
заблуждений на эту тему.
--
Regards, LVT.
Leonid Troyanovsky (2007-10-15 17:49:00) [34]
> Игорь Шевченко © (15.10.07 16:27) [69]
> > Кроме того, мне не нравится, что после вызова "терминатора"
> > может происходить еще что-то неочевидное.
> Например, что ?
Например, если после вызова Free произойдет _неявный_
вызов еще чего-либо и в, конечном счете, к обращению
к уже несуществующему объекту.
Ну, не можем мы гарантировать, что вызов Free - последнее,
что выполняется в методе. Например, Release & ProcessMessages.
> Но городить дополнительный огород, чтобы все-таки разрешать
> суицид, и, как следствие, неочевидный код - тут я впаду
> в еще больший ступор.
А я его и не разрешал, более того, никак не оправдывал.
Все, что я предложил в [61] - достаточно академично:
try
foo.smthng; // при вызове метода объект может стать негоден к жизни
except
on E: EFreeObject do
begin
foo.Free;
raise; // дальнейшее выполнение кода с foo не имеет смысла
end;
end;
Или освобождать foo в секции finally.
Вот, собс-но.
--
Regards, LVT.
Суслик (2007-10-15 17:07:00) [35]
> [60] Leonid Troyanovsky © (13.10.07 12:31)
> > Сусл © (13.10.07 11:44) [59]
> > tobject.free посмотри
> Посмотри остальные 57 сообщений.
Осилил, ух...
Ну что сказать - разговор очень ни о чем, ибо знать надо контекст задачи лучше, чем это раскрыто в тексте топика.
Убиение себя - вещь неординарная. У меня в моем OPF фреймворке есть несколько таких моментов. Но каждый из них продокументирован жесточайщим образом с акцентами на тонкостях жизни после смерти.
Посему мое имхо - убивать себя объекту плохо, но если нужно, то почему нет? Free для этого вполне подходит.
ЗЫ Перечитал - ни о чем написал. Ну так и топик вобщем-то не особо информативен :)
Игорь Шевченко (2007-10-15 16:27:00) [36]Leonid Troyanovsky © (15.10.07 16:12) [68]
> Кроме того, мне не нравится, что после вызова "терминатора"
> может происходить еще что-то неочевидное.
Например, что ?
> А я про неявное уничтожение.
> Т.е., мы делаем:
> foo.Smthng;
> foo.Smthng2; // а в предыдущем вызове произошел суицид
Я с чем могу согласиться - что суицид объекта не самый ясный из примеров кода сам по себе. Читаешь код, видишь суицид, впадаешь в краткий ступор. С этим согласен и не спорю, лучше объект убивать принудительно извне - по крайней мере, читабельно.
Но городить дополнительный огород, чтобы все-таки разрешать суицид, и, как следствие, неочевидный код - тут я впаду в еще больший ступор.
Так как я считаю, чем меньше ступора, тем лучше, то и задал вопрос [62] - а нафига ? :)
Leonid Troyanovsky (2007-10-15 16:12:00) [37]
> Игорь Шевченко © (15.10.07 15:59) [67]
> Или я чего-то здорово не понимаю ? :)
Ты снова подозреваешь меня в:
foo.Free;
foo.Smthng; :)
А я про неявное уничтожение.
Т.е., мы делаем:
foo.Smthng;
foo.Smthng2; // а в предыдущем вызове произошел суицид
Кроме того, мне не нравится, что после вызова "терминатора"
может происходить еще что-то неочевидное.
--
Regards, LVT.
Игорь Шевченко (2007-10-15 15:59:00) [38]Leonid Troyanovsky © (15.10.07 15:51) [66]
Если (уж извини!) ты в методе другого объекта обратишься к уничтоженному, то получишь тоже массу неприятных эффектов :)
Не следует ли из этого, что уничтожение объектов надо запретить вообще ?
Или я чего-то здорово не понимаю ? :)
Leonid Troyanovsky (2007-10-15 15:51:00) [39]
> Игорь Шевченко © (15.10.07 15:46) [64]
> Можно уничтожить. Если потом не обращаться к уничтоженному
> объекту :)
Мне не нравится "если". Умерла - так умерла.
Если добавить, например, к Release честное описание всех
условий (ограничений) ее применения, то применять ее не будут.
Хотя, и сама нужда в примение подобных вещей подозрительна :)
--
Regards, LVT.
Ins (2007-10-15 15:49:00) [40]
> Игорь Шевченко © (15.10.07 15:46) [64]
Мне тут недавно Юрий Зотов объяснял, что переходить дорогу не на переходе тоже можно. И курить на бочке с порохом тоже ;-) По-моему случай из той же оперы...