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

Вниз

Статья на хабаре про Делфи «создание и уничтожение объектов...»   Найти похожие ветки 

 
Kolan ©   (2009-10-22 22:38) [0]

Читали?

http://habrahabr.ru/blogs/delphi/72959/

Особенно запомнилось: «Соответственно, в деструкторе достаточно корректно обрабатывать нулевые значения, в чем сильно помогает процедура FreeAndNil, которая освобождает объект, только если ссылка на него уже не nil.»

А Free что делает интересно?


 
Игорь Шевченко ©   (2009-10-22 22:45) [1]

Нормальная статья. Ошибся человек, с FreeAndNil - бывает. Лучше бы задать вопрос ему, а не здесь, но это уже издержки воспитания.


 
GDI+   (2009-10-22 22:54) [2]


> Kolan ©   (22.10.09 22:38)  


Вызови Free любого объекта дважды и поймаешь Exception.
А FreeAndNil корректно обрабатывает эту ситуацию приближая простоту программирования на Delphi к C# и Java.

На том же C++ я в деструкторах обычно пишу
if (NULL != obj){
delete obj;
obj = NULL;
}

кода чуть больше но мне потом спокойнее.


 
Игорь Шевченко ©   (2009-10-22 23:04) [3]


> Вызови Free любого объекта дважды и поймаешь Exception.


а нафига вызывать дважды ?


 
test ©   (2009-10-22 23:09) [4]

Посмотри что ли в source Free еще и FreeAndNil может мысли будут.


 
@!!ex ©   (2009-10-22 23:11) [5]

> [2] GDI+   (22.10.09 22:54)

Ну да!
Замаскировать ошибку в архитектуре(а множественное удаление объекта ничем другим не является), вместо того, чтобы корректно его обработать - это конечно замечательное решение.


 
jack128_   (2009-10-22 23:29) [6]


> Ошибся человек, с FreeAndNil - бывает.

он осознано написал FreeAndNil.
Мы как раз сегодня на работе холиварили на эту тему. Единственный вменяемый довод против FreeAndNil"a был, то что у него параметр - не типизированный.


 
Игорь Шевченко ©   (2009-10-22 23:33) [7]


> Мы как раз сегодня на работе холиварили на эту тему


ну раз вы, тогда конечно...


 
Hint   (2009-10-22 23:33) [8]

Читал и даже код FreeAndNil скопировал, т.к. перепутаны причина и следствие (FreeAndNil устанавливает объект в nil после чего уже не выполняется условии в методе Free, а не наоборот).


 
test ©   (2009-10-22 23:37) [9]

Hint   (22.10.09 23:33) [8]
в начале, ты ничего не контролируешь


 
@!!ex ©   (2009-10-22 23:46) [10]

> [6] jack128_   (22.10.09 23:29)

Не смогу придумать ни одного довода в пользу использования FreeAndNil.
Разве что кто-то делает проверку типа: if Assigned(Object) then
Но
1) Это довольно редко нужно. Ради этого городить кучу лишних никому не нужных вызовов зачем?
2) В таких сулчаях можно и самому проследить за обнулением переменной.


 
jack128_   (2009-10-22 23:52) [11]


>
> Не смогу придумать ни одного довода в пользу использования
> Free.
> Разве что кто-то делает проверку типа: if Assigned(Object)
> then
> Но
> 1) Это довольно редко нужно. Ради этого городить кучу лишних
> никому не нужных вызовов зачем?
> 2) В таких сулчаях можно и самому проследить за обнулением
> переменной.


зы там на харбе ссылка проскочила: http://gunsmoker.blogspot.com/2009/04/freeandnil-free.html


 
Игорь Шевченко ©   (2009-10-22 23:55) [12]

jack128_   (22.10.09 23:52) [11]

Ее уже здесь обсуждали, выяснили, что неполезная


 
oxffff ©   (2009-10-22 23:57) [13]

Все выкрутасы с Freeandnil связаны c избежанием циклических ссылок.
И порядок внутри нее корректен. В остальном он ... не нужен.

Вот упрощенный пример применения freeandnil.

Aobject=class
Link:Tobject;
destructor destroy;override;
end;

procedure TForm4.FormCreate(Sender: TObject);
var a,b:Aobject;
begin
a:=Aobject.Create;
b:=Aobject.Create;
a.Link:=b;
b.Link:=a;
freeandNil(a.Link);
end;

{ Aobject }

destructor Aobject.destroy;
var abcs:Tobject;
begin
link.Free;
showmessage("removed");
inherited;
end;


 
jack128_   (2009-10-22 23:58) [14]


>
> Ее уже здесь обсуждали, выяснили, что неполезная

нда. Жаль, видимо пропустил это обсуждение.


 
Игорь Шевченко ©   (2009-10-22 23:59) [15]

jack128_   (22.10.09 23:58) [14]

Когда в заголовке написано - "Почему всегда следует использовать FreeAndNil вместо Free", дальше можно не читать


 
jack128_   (2009-10-23 00:02) [16]


> В остальном он ... не нужен.

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

а это даже не важно, что в остальном он нужен или же нет. важно то, что _иногда_ он приносит пользу, а вот вреда он не приносит. так что баланс за FreeAndNil


 
Kolan ©   (2009-10-23 00:03) [17]

oxffff, похоже на плохой дизайн. Зачем объект в своем деструкторе удаляет то, что не сам создал?


 
oxffff ©   (2009-10-23 00:05) [18]


> Мы получает гарантированный AV


Это неправда. Гарантированного AV неполучишь.


> а вот вреда он не приносит.


Как не приносит. Дополнительный вызов - лишние наклданые расходы.


 
Игорь Шевченко ©   (2009-10-23 00:07) [19]


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


Это ошибка архитектуры, это не лечится.


 
oxffff ©   (2009-10-23 00:11) [20]


> Kolan ©   (23.10.09 00:03) [17]


Этот пример надуман. Здесь основная идея в том, что декструктор может вызывать другие функции,которые вызовут освобождения других объектов, которые могут вызвать цикл освобождений.

Чтоб его распутать используют freeandnil.
Что касаемо дизайна. Я не могу сказать его ли это последствия или нет.
такие ситуации бывают. Это подход к их решению.


 
jack128_   (2009-10-23 00:12) [21]


>
> Это неправда. Гарантированного AV неполучишь.

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


 
@!!ex ©   (2009-10-23 00:13) [22]

> [16] jack128_   (23.10.09 00:02)

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


 
Игорь Шевченко ©   (2009-10-23 00:14) [23]

jack128_   (23.10.09 00:12) [21]

Если ты борешься за чистоту объектов, почему не борешься на неиспользование после уничтожения ?


 
oxffff ©   (2009-10-23 00:16) [24]


>  если вызываемый метод объекта не обращается к его(обхекта)
> поляим


Он даже может к полям обращаться и AV не будет в одних случаях, при их наличии в других. Это как говориться где объект в куче ляжет.
С виртуальными согласен.


 
jack128_   (2009-10-23 00:22) [25]


>
> Как надо говнокодить, чтобы обращаться к удаленному объекту?
> ?
> Я просто даже ситуации не могу представить не идиотскую
> ситуацию в которой может возникнуть такая проблема.

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


> Он даже может к полям обращаться и AV не будет в одних случаях,
>  при их наличии в других.

obj := TObj.Create;
FreeAndNil(obj);
Caption := obj.StrField; // при каких условиях здесь не возникнет AV ??


> Если ты борешься за чистоту объектов, почему не борешься
> на неиспользование после уничтожения ?

борюсь. Именно для борьбы с использованием объекта после его разрушения и использую FreeAndNil.


 
Игорь Шевченко ©   (2009-10-23 00:31) [26]

jack128_   (23.10.09 00:22) [25]

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

Кстати, у меня не бывает AV. Удивись.


 
oxffff ©   (2009-10-23 00:36) [27]


> Игорь Шевченко ©   (23.10.09 00:31) [26]


Приветствую.

Я бы не очень бы спешил с выводами что это плохой дизайн. Можно привести пример. Есть пул объектов. Они все должны освободиться как только будет принудительно освобожден любой первый из них.


 
oxffff ©   (2009-10-23 00:40) [28]


> obj := TObj.Create;
> FreeAndNil(obj);
> Caption := obj.StrField; // при каких условиях здесь не
> возникнет AV ??


Все зависит где будет объект в кучи. AV возникает как исключение процессора например на отсутствие проекции линейного адреса на физической в каталоге страниц.


 
GDI+   (2009-10-23 00:40) [29]


> @!!ex ©   (22.10.09 23:11) [5]
>
> > [2] GDI+   (22.10.09 22:54)
>
> Ну да!
> Замаскировать ошибку в архитектуре(а множественное удаление
> объекта ничем другим не является), вместо того, чтобы корректно
> его обработать - это конечно замечательное решение.


Тогда Java и C# это одна глобальная ошибка, так как там программист о таких мелочах, как о памяти вообще не беспокоится.


 
@!!ex ©   (2009-10-23 00:56) [30]

> [25] jack128_   (23.10.09 00:22)
> о - я правильно понимаю, что у тебя никогда не бывает AV"шек
> ?? ну могу сказать, что ты крут, как три яйца в крутую =)
> . А вот например дельфя их периодически выдает. Причем AV
> не по нулевому адресу.

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

P.S. Сейчас 90% AV из-за обращения по нулевому адресу. :)


> [29] GDI+   (23.10.09 00:40)

Не путайте кислое с длинным. Там архитектура с GC, это не тоже самое что архитектура в которой допустимо множественное удаление(Вы сможете придумать пример не индусского кода, в котором два раза объект пытаются удалить?).


 
Kolan ©   (2009-10-23 00:59) [31]


> Есть пул объектов. Они все должны освободиться как только
> будет принудительно освобожден любой первый из них.

Тот кто убивает один из объектов, пусть убьёт и остальные. И вообще это, если я правильно понимаю, по смыслу равняется TObjectList.Clear();.


 
Германн ©   (2009-10-23 01:21) [32]


> Игорь Шевченко ©   (23.10.09 00:31) [26]
>
> jack128_   (23.10.09 00:22) [25]
>
> Это не борьба, это приучение к костылям. Ногами ходить гораздо
> удобнее, поверь.
>
> Кстати, у меня не бывает AV. Удивись.
>

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


 
Игорь Шевченко ©   (2009-10-23 01:45) [33]

oxffff ©   (23.10.09 00:36) [27]

Вечер добрый!


> Я бы не очень бы спешил с выводами что это плохой дизайн.
>  Можно привести пример. Есть пул объектов. Они все должны
> освободиться как только будет принудительно освобожден любой
> первый из них.


Как ты понимаешь, всякий механизм имеет право на применение в наиболее подходящих случаях. Можно составить конструкцию, когда необходимо будет применять FreeAndNil (собственно, в VCL и таких примеров есть), но применять FreeAndNil для диагностики огрехов кривой архитектуры - это, боюсь, крайне неуместное применение.

Собственно для диагностики применяются юнит-тесты и просто тесты, они огрехи выявят гораздо эффективнее.


 
Игорь Шевченко ©   (2009-10-23 01:48) [34]

Германн ©   (23.10.09 01:21) [32]


> Но AV бывает регулярно. При завершении работы приложения.


У меня и при завершении не бывает :(


 
Германн ©   (2009-10-23 01:55) [35]


> <Цитата>
>
> Игорь Шевченко ©   (23.10.09 01:48) [34]
>
> Германн ©   (23.10.09 01:21) [32]
>
>
> > Но AV бывает регулярно. При завершении работы приложения.
>
>
>
> У меня и при завершении не бывает :(
>

Нууу. С одной стороны ты, имхо, не используешь, а с другой тоже не используешь.
Это я про сторонние компоненты.


 
Игорь Шевченко ©   (2009-10-23 02:00) [36]

Германн ©   (23.10.09 01:55) [35]

Использую :) Сторонние компоненты - они же тоже пишутся не в расчете на то, что при их использовании AV будет необходимым следствием.


 
Германн ©   (2009-10-23 02:20) [37]


> Игорь Шевченко ©   (23.10.09 02:00) [36]
>
> Германн ©   (23.10.09 01:55) [35]
>
> Использую :)

Не знал. Теперь знаю.
Значит имело значение нечто другое.


 
GDI+   (2009-10-23 04:40) [38]


> @!!ex ©   (23.10.09 00:56) [30]
> > [29] GDI+   (23.10.09 00:40)
>
> Не путайте кислое с длинным. Там архитектура с GC, это не
> тоже самое что архитектура в которой допустимо множественное
> удаление(Вы сможете придумать пример не индусского кода,
>  в котором два раза объект пытаются удалить?).


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

Если архитектуру решения можно без проблем легко описать в документации, то FreeAndNil не нужно. Но так как требования могут поменяться несколько раз в процессе разработки то оно очень нужно. Это лучше чем AV на продакшене, даже если в этом AV виновато чужое кривое планирование.


 
oxffff ©   (2009-10-23 07:39) [39]


> Kolan ©   (23.10.09 00:59) [31]
>
> > Есть пул объектов. Они все должны освободиться как только
>
> > будет принудительно освобожден любой первый из них.
>
> Тот кто убивает один из объектов, пусть убьёт и остальные.
>  И вообще это, если я правильно понимаю, по смыслу равняется
> TObjectList.Clear();.


Потребитель может не знать о существовании других объектов и о пуле в частности. Они например могут использоваться другимим потребителями.


 
jack128_   (2009-10-23 09:56) [40]


> Кстати, у меня не бывает AV. Удивись.

А. Ну тогда конечно.
Кста, а зачем тут: http://delphimaster.net/view/3-1239773025/  в восьмом посте ты вызвал: DBParams.Free; а не DBParams.Destroy ?


> Все зависит где будет объект в кучи.

"объект в куче" расположен по адресу nil, потому что я строчкой выше вызвал FreeAndNil.


 
Ухарь   (2009-10-23 10:02) [41]


> @!!ex ©   (23.10.09 00:13) [22]
>
> > [16] jack128_   (23.10.09 00:02)
>
> Как надо говнокодить, чтобы обращаться к удаленному объекту?
> ?


А ты можешь себе представить ситуацию, когда один и тот же объект находится сразу в нескольких списках?


 
oxffff ©   (2009-10-23 10:04) [42]


> > Все зависит где будет объект в кучи.
>
> "объект в куче" расположен по адресу nil, потому что я строчкой
> выше вызвал FreeAndNil.


Ты говорим о разных вещах.


 
jack128_   (2009-10-23 10:07) [43]


> А ты можешь себе представить ситуацию, когда один и тот
> же объект находится сразу в нескольких списках?

в этом случае FreeAndNil не поможет.


 
oxffff ©   (2009-10-23 10:09) [44]


> Ты говорим


:)
Мы говорим.


 
Alkid ©   (2009-10-23 10:27) [45]


> GDI+   (22.10.09 22:54) [2]

А я на C++ предпочитаю использовать std::auto_ptr и не париться с удалением объекта в деструкторе.


 
Anatoly Podgoretsky ©   (2009-10-23 14:01) [46]


> oxffff ©   (23.10.09 10:09) [44]

До чего Интернет доводит, уже боимся множественное число применять.

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


 
@!!ex ©   (2009-10-23 14:03) [47]

> [41] Ухарь   (23.10.09 10:02)

Могу. У меня есть отдельный список форм  текущем проекте.
Этот список удалением не занимаеться, поскольку формы удаляются в другом месте.
Опять же, это вопрос архитектуры.
Как вариант - научить объект удалять себя из списков куда он помещен.


 
Leonid Troyanovsky ©   (2009-10-23 14:10) [48]


> @!!ex ©   (23.10.09 14:03) [47]

> Могу. У меня есть отдельный список форм  текущем проекте.

See also Screen.Forms.

> Как вариант - научить объект удалять себя из списков

Notification forever!

--
Regards, LVT.


 
@!!ex ©   (2009-10-23 14:13) [49]

> [48] Leonid Troyanovsky ©   (23.10.09 14:10)
> See also Screen.Forms.

О чем я и говорю. Есть Screen.Forms и есть дополнительно мой список. Так что я вполне представляю ситуацию в которой объект может существовать в нескольких списках.


> [48] Leonid Troyanovsky ©   (23.10.09 14:10)
> Notification forever!

Вот и я о том же.


 
GDI+   (2009-10-23 18:01) [50]


> Alkid ©   (23.10.09 10:27) [45]
>
>
> > GDI+   (22.10.09 22:54) [2]
>
> А я на C++ предпочитаю использовать std::auto_ptr и не париться
> с удалением объекта в деструкторе.


Хм, а он разве потокобезопасный? Хотя это от реализации stl зависит. Так что я предпочитаю сам проверить чем потом искать баги. Их и так хватает тех же системных. Вот в Windows7 Gdi+ сломали, теперь она глючит при использовании интерполяции NearestNeighbour и CopyMode при отрисовке графического объекта.


 
Ухарь   (2009-10-23 18:18) [51]


>@!!ex ©  
> Бывает. Но я не могу припомнить случая, чтобы эти AV были
> вызваны удаленным объектом, к которому идет обращение.
>
> P.S. Сейчас 90% AV из-за обращения по нулевому адресу. :
> )


Какая то принципиальная разница между обращением к удаленному объекту, и обращением к еще не созданному объекту есть?
как то странно получается - в первом случае значит "говнокод", а во втором все допустимо?


 
Leonid Troyanovsky ©   (2009-10-23 18:29) [52]


> Ухарь   (23.10.09 18:18) [51]

> Какая то принципиальная разница между обращением к удаленному
> объекту, и обращением к еще не созданному объекту есть?

Разницы, дейс-но, нет. На 90% лечится путем if Assigned(x) then.
Ведь, IMHO, вопрос сводился к валидности хранимых ссылок?

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

--
Regards, LVT.


 
@!!ex ©   (2009-10-23 19:19) [53]

> [51] Ухарь   (23.10.09 18:18)

У меня нет обращения к еще не созданным объектам.
На данный момент AV бывает в двух слячаях:
1) Кривые скрипты - 98% на этом вываливается. Думали вставить проверки, но ни сильно убивают скорость, решили пока не трогать.
2) 1% Обращение к модели, которой физически на диске не существует. Давно зочу исправить, все из головы вылетает... Вот, кстати, сейчас и пойду исправлю.

Ну и оставшийся процент - это банальные косяки в коде, к счастью бывает очень редко.


 
Ухарь   (2009-10-23 19:42) [54]


> @!!ex ©  


> У меня нет обращения к еще не созданным объектам.
> На данный момент AV бывает в двух слячаях:


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


> Leonid Troyanovsky ©   (23.10.09 18:29) [52]



> Ведь, IMHO, вопрос сводился к валидности хранимых ссылок?


Честно говоря, потерял нить -  о чем вопрос. Я в данном случае спорю с утверждением "если у вас обращение к уже разрушенному объекту, то у вас говнокод"

А по FreeAndNil имхо ответ очевиден - где надо - там используем, где не надо - там не используем


 
@!!ex ©   (2009-10-23 19:47) [55]

> [54] Ухарь   (23.10.09 19:42)

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

> [54] Ухарь   (23.10.09 19:42)
> Я в данном случае спорю с утверждением "если у вас обращение
> к уже разрушенному объекту, то у вас говнокод"

Ошибки в коде приводящие к этому - это может быть и не в говнокоде.
Говнокод это в том случае, если мы это дело маскируем как было показано в [2]. Потому что такое не максировать надо, а убирать нафиг.


 
Ухарь   (2009-10-23 19:59) [56]


> @!!ex ©   (23.10.09 19:47) [55]


.
> Говнокод это в том случае, если мы это дело маскируем как
> было показано в [2].


Маскировать то конечно ничего не надо. НО обниливание ссылки приведет скорее к выявлению ошибки, чем к ее маскировке. Потому что при обращении по адресу, где раньше был объект, AV можно и не получить.  А именно двойное разрушение - случай более редкий, чем просто обращение к разрушенному, его частный случай.
Насколько я понимаю, в  [2] показан полный аналог TObject.Free;
Это тоже маскировка ошибок?


 
Kolan ©   (2009-10-23 20:22) [57]


> Потребитель может не знать о существовании других объектов
> и о пуле в частности. Они например могут использоваться
> другимим потребителями.

Если потребитель не знает, то знает сам объект, тогда опять получаем что-то вроде:
Object[I].ParentObjectList.Clear();

А если другими объектами пользуются, то надо делать систему уведомлений, пример в VCL.

А есть реальный пример, почему-то есть подозрение, что плохой дизайн во многом виноват...


 
GDI+   (2009-10-23 22:10) [58]

@!!ex ©   (23.10.09 19:47) [55]

> [54] Ухарь   (23.10.09 19:42)

Ошибки в коде приводящие к этому - это может быть и не в говнокоде.
Говнокод это в том случае, если мы это дело маскируем как было показано в [2]. Потому что такое не максировать надо, а убирать нафиг.


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

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

Так вот, в результате оно даже не очень глючило(при такой ГЛОБАЛЬНОЙ ошибке) и относительно нормально работало.

PS
Во к примеру как вам больше нравится такая обработка ошибок как в Сталкере ЧН(когда при любой ошибке валится игра и отравляется отчёт в поддержку) или тихий глюк как в Обливионе, где при возникновении ошибки может быть просто невозможно пройти один из многочисленных квестов.

PS
Сейчас стандартом похоже стало не работоспособная не смотря не на что программа, а окошко с гламурными кнопочками сигнализирующее падение программы и предлагающее отправить отчёт разработчику. Но многие программисты забывают что ПО это не изделие, а услуга, если она станет не удовлетворять бизнес-модели, пользователь найдёт другую услугу(ПО).


 
@!!ex ©   (2009-10-23 22:14) [59]

> [58] GDI+   (23.10.09 22:10)

Сталкер свалится, ты загрузишься и дальше играть продолжишь.
А тот же Обливион может тебе все запороть, а ты узнаешь об этом после того как уже все сейвы будут дохлые....

Я за первый вариант.
Вообще, если прога после возбуждения исключения может продолжать работать, это надо явно указывать.
А работать с прогой, которая авось дальше норм будет, ну нафиг такой софт...


 
@!!ex ©   (2009-10-23 22:25) [60]

Сейчас мода не на приложения с красивыми окошками, а на быстрый выброс на рынок не тестированного софта.
По поводу продолжения работы после ошибок:
У левелдизайнеров, которые работают сейчас со мной над проектом прямое указание: в случае возникновения ошибки в редакторе, даже если после ошибки редактор дальше нормально работает, перезапускать редактор БЕЗ сохранения работы.
Потому что Эксцепшн - это уже выход системы в нештатоное состояние. AV в частности - это кривой указатель. Что может натворит ькривой указатель вы и без меня знаете.
Это примерно как машина у которой заклинил ГУР. Можно дальше ехать, но в кювет улететь можно без проблем. Всяко лучше остановится и тех помощь вызвать.
Опять же скрытая ошибка так и будет скрытой. А явная, позволит пользователю отправить мессагу в саппорт.
ОДно дело игра, которая через 10 часов будет навсегда с компа удалена. и на ошибки в ней всем плевать.
А другое дело нормальный софт... если в нем будут скрытые ошибки, замаскированные... ну лично я такой софт быстро удалю.


 
GDI+   (2009-10-23 22:33) [61]

>>@!!ex ©   (23.10.09 22:14) [59]
>>> [58] GDI+   (23.10.09 22:10)
>>Сталкер свалится, ты загрузишься и дальше играть продолжишь.

то-то с техподдержкой сталкера игроки матом разговаривали от такого сервиса.

>>А тот же Обливион может тебе все запороть, а ты узнаешь об этом после того как уже все сейвы будут дохлые....

консоль:
resurrect
placeatpc

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


 
GDI+   (2009-10-23 22:35) [62]


> @!!ex ©   (23.10.09 22:25) [60]
> А другое дело нормальный софт... если в нем будут скрытые
> ошибки, замаскированные... ну лично я такой софт быстро
> удалю.



Удаляйте Windows, ставьте linux, там именно такая модель.


 
@!!ex ©   (2009-10-23 22:42) [63]

> [61] GDI+   (23.10.09 22:33)
> то-то с техподдержкой сталкера игроки матом разговаривали
> от такого сервиса.

Это проблемы отдельных представителей бизнеса.


> [62] GDI+   (23.10.09 22:35)
> Удаляйте Windows, ставьте linux, там именно такая модель.

Меня и под виндой все устраивает.


 
GDI+   (2009-10-23 22:58) [64]


> @!!ex ©   (23.10.09 22:25) [60]
> У левелдизайнеров, которые работают сейчас со мной над проектом
> прямое указание: в случае возникновения ошибки в редакторе,
>  даже если после ошибки редактор дальше нормально работает,
>  перезапускать редактор БЕЗ сохранения работы.


ЗЫ
Кстати у вас все ошибки логируются или нет, или как потом разработчик может исследовать ошибку?

Используют ваши гейм-дизайнеры svn/cvs?


 
@!!ex ©   (2009-10-23 22:59) [65]

> [64] GDI+   (23.10.09 22:58)

SVN мы используем. Логируется конечно. Исключения не логируются, они просто шоты делают.
Но эксцепшены это редкость к счастью.


 
GDI+   (2009-10-23 23:00) [66]

>>@!!ex ©   (23.10.09 22:42) [63]
>>Это проблемы отдельных представителей бизнеса.

Которые перейдут на более "стабильный" аналог вашего ПО и знакомым предложат перейти.

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

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


 
GDI+   (2009-10-23 23:05) [67]


> @!!ex ©   (23.10.09 22:59) [65]


Ну у нас есть свой логгер на обрабатываемые исключения и Еврикалог на необрабатываемые.

При возникновении исключения более важное - сохранить как можно более полную информацию о нем, чем всё остальное.

> @!!ex ©   (23.10.09 22:59) [65]
> SVN мы используем. Логируется конечно. Исключения не логируются,
>  они просто шоты делают.


Попробуйте заставить не пользователей внутреннего ПО а внешних заставить делать скриншоты.

xxx: тааак, вы исправили ошибку?
yyy: Если честно, то мы везде по несколько раз проверяли и не нашли.
xxx: прога не работает, а вы проблему не нашли? это 3.14здец какой-та! мля фсё, утоплю всех фкровииии!!!
yyy: Вышлите скриншоты ошибок, мы определим причину, если скриншоты будут информативные.
xxx: я тебе скриншот своего голого ануса щас пришлю
yyy: Проблема предположительно именно в нём?


 
@!!ex ©   (2009-10-23 23:09) [68]

> [66] GDI+   (23.10.09 23:00)
> По поводу редактора - использование любой из систем контроля
> версий дало бы большую безопасность данных чем ваша рекомендация.

Одно другое не исключает.

> [67] GDI+   (23.10.09 23:05)
> Попробуйте заставить не пользователей внутреннего ПО а внешних
> заставить делать скриншоты.

Зачем заставлять? Это автоматом делается. :D

Вы мне сейчас что сказать хотите? Что исключения надо сохранять и сообщать о них? Я с этим и не спорил.
Я спорл с тем, что софт должен продолжаться работать замалчивая исключения.


 
GDI+   (2009-10-24 00:00) [69]


> @!!ex ©   (23.10.09 23:09) [68]
> Зачем заставлять? Это автоматом делается. :D
>
> Вы мне сейчас что сказать хотите? Что исключения надо сохранять
> и сообщать о них? Я с этим и не спорил.
> Я спорл с тем, что софт должен продолжаться работать замалчивая
> исключения.


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

То же самое как из-за ошибок в javascript сайтов я не хотел бы падения бровзера или надоедливого модального сообщения об этом.


 
@!!ex ©   (2009-10-24 00:03) [70]

> [69] GDI+   (24.10.09 00:00)

С этим я тоже спорить не буду.
Я буду спорить с тем что использование:
if (NULL != obj){
delete obj;
obj = NULL;
}

Во всех деструкторах как штатный код это нормально.
Это не нормально.


 
@!!ex ©   (2009-10-24 00:03) [71]

Ну и с тем что Обливион действует правильно игнорируя ошибки. С этим я тоже спорить буду.


 
GDI+   (2009-10-24 02:52) [72]


> @!!ex ©   (24.10.09 00:03) [71]
>
> Ну и с тем что Обливион действует правильно игнорируя ошибки.
>  С этим я тоже спорить буду.


Ну и спорьте. Обливион пока Top1 в RPG от первого лица. Они могут себе позволить сами устанавливать правила.


 
@!!ex ©   (2009-10-24 08:59) [73]

> [72] GDI+   (24.10.09 02:52)

А Microsoft Top1 в операционных системах. И как же мы. простые программисты смеем указывать им на ошибки! Это же MICROSOFT!
;)


 
GDI+   (2009-10-25 02:43) [74]


> @!!ex ©   (24.10.09 08:59) [73]
>
> > [72] GDI+   (24.10.09 02:52)
>
> А Microsoft Top1 в операционных системах. И как же мы. простые
> программисты смеем указывать им на ошибки! Это же MICROSOFT!


Укажите на конкретные ошибки в архитектуре ОС от Microsoft.

Здесь мы говорим не ошибках вообще, а об архитектурных ошибках.


 
Игорь Шевченко ©   (2009-10-25 02:53) [75]


> Укажите на конкретные ошибки в архитектуре ОС от Microsoft.


ОС от Microsoft, кстати, при ошибке ломается мгновенно и навсегда (в смысле, до перезагрузки). И сделано это намерено.


 
GDI+   (2009-10-25 03:11) [76]


> Игорь Шевченко ©   (25.10.09 02:53) [75]
> ОС от Microsoft, кстати, при ошибке ломается мгновенно и
> навсегда (в смысле, до перезагрузки). И сделано это намерено.


При ошибке в Kernel mode.

С одной стороны это хорошо, так как у обычных "активных" пользователей которые использую несколько десятков программ Windows более полугода не живёт. А цена за её переустановку позволяет кормить десятки фирм "компьютерной скорой помощи".


 
Игорь Шевченко ©   (2009-10-25 11:40) [77]

GDI+   (25.10.09 03:11) [76]


> С одной стороны это хорошо, так как у обычных "активных"
> пользователей которые использую несколько десятков программ
> Windows более полугода не живёт.


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


 
Игорь Шевченко ©   (2009-10-25 11:44) [78]

GDI+   (25.10.09 03:11) [76]

Что-то я смотрю, знакомое...



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

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

Наверх




Память: 0.71 MB
Время: 0.016 c
2-1257940219
Tornado
2009-11-11 14:50
2009.12.27
Вопрос по DBComboBox


3-1232472889
RustB
2009-01-20 20:34
2009.12.27
ADO, access, и как прочитать результат запроса.


1-1231859045
Игорь_Залозных
2009-01-13 18:04
2009.12.27
DrawText и текст, который не вместился в прямоугольник


1-1229944689
dmitry_12_08_73
2008-12-22 14:18
2009.12.27
Получение ссылки на файл после нажатия в проводнике "Копировать"


6-1208506264
VK
2008-04-18 12:11
2009.12.27
передача файлов по сети