Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.12.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.7 MB
Время: 0.007 c
15-1256496465
palva
2009-10-25 21:47
2009.12.27
Какой-то тупой развод


1-1231711857
Илья_
2009-01-12 01:10
2009.12.27
Установка собственного шрифта


2-1257285507
Jaroslight
2009-11-04 00:58
2009.12.27
Вызов диалога настроек печати


4-1225873060
Андрей
2008-11-05 11:17
2009.12.27
Скопировать файл в буфер обмена


15-1256427069
Игорь Шевченко
2009-10-25 02:31
2009.12.27
Вот и кончилось лето...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский