Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как убить объект из его же метода? [D7]


Страницы:   1 2 3 4 5 6

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]

Мне тут недавно Юрий Зотов объяснял, что переходить дорогу не на переходе тоже можно. И курить на бочке с порохом тоже ;-) По-моему случай из той же оперы...


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо