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

Вниз

delphi = pascal = языки для начинающих   Найти похожие ветки 

 
Юрий Зотов ©   (2007-11-14 16:23) [80]

Чтобы уж совсем разобраться в этом вопросе. В джаве все объекты имеют метод finalize, про который в доке сказано вот что: "Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. A subclass overrides the finalize method to dispose of system resources or to perform other cleanup".

Казалось бы, это и есть то самое место, которое я просил показать. Однако же, не все так просто. Пишем примерчик:

public class DisposableObject {

 public DisposableObject() {
   super();
   System.out.println("created");
 }

 protected void finalize() throws Throwable {
   System.out.println("finalized");
   super.finalize();
 }

}

И запускалку к нему:

public class Tester {

 public static void main(String[] args) {
   DisposableObject obj = new DisposableObject();
   obj = null;
   obj = new DisposableObject();
   obj = null;
 }

}

И вот что имеем в консоли:
created
created

и ни разу заветного слова finalized. О как! У GC, оказывается, своя логика.

Итак, мы выяснили, что метод finalize либо не вызывается совсем (что прямо противоречит документации и является вопиюще бездарным глюком), либо GC может вызывать finalize не сразу после обнуления счетчика ссылок, а когда сочтет нужным (но тогда, увы, толку от finalized немного - например, я хочу повторно открыть файл, а он еще не закрыт, оказывается, хотя должен был).

===========================

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

И другой вопрос - а если программа с аналогичными "закидонами" управляет рабочим местом диспетчера аэропорта, то чем виноваты пассажиры в лайнере?


 
Romkin ©   (2007-11-14 16:26) [81]

А что такое throws Throwable ?


 
DiamondShark ©   (2007-11-14 16:29) [82]


> Юрий Зотов ©   (14.11.07 15:35) [76]

Я действительно попутал. Нет такого в жабе.
Но Object.finalize() есть.


> Не могли бы Вы привести конкретный код непосредственного
> потомка Object, один из методов которого вызывается при
> попадании объекта под сборку мусора?

Object.finalize() перекройте. Только нафига дожидаться сборки мусора? Напишите свой метод освобождения unmanaged ресурсов, и вызывайте его детерминировано.


> Нет, Пушкин гарантированно вызовет деструктор. Большего
> от него и не требуется.

Это где это такое?
Единственный случай -- экземпляры на стеке в Ц++.
Для экземпляров на куче деструктор вызывается руками, оператором delete в Ц++ и явным вызовом деструктора в Дельфи.

Какая вам разница, в каком методе код освобождения размещать в деструкторе или в своём методе, если и то и другое надо явно вызывать?

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


 
Zeqfreed ©   (2007-11-14 16:31) [83]

> Юрий Зотов ©   (14.11.07 16:23) [80]

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


 
DiamondShark ©   (2007-11-14 16:31) [84]


> И другой вопрос - а если программа с аналогичными "закидонами"
> управляет рабочим местом диспетчера аэропорта, то чем виноваты
> пассажиры в лайнере?

Это не программа с закидонами.
Это програмер тупой.


 
DiamondShark ©   (2007-11-14 16:32) [85]


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

Потому что тогда нельзя будет тупо побычить на язык, который ниасилил патамучта GC.


 
Zeqfreed ©   (2007-11-14 16:33) [86]

> DiamondShark ©   (14.11.07 16:29) [82]


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

Вот я этого тоже пока не понял. Не вижу принципиальной разницы. Возможно, Юрий смотрит куда-то глубже? :)


 
Юрий Зотов ©   (2007-11-14 16:37) [87]

> All

> Marser ©   (14.11.07 02:07) [44]
> в Яве всё-таки больше всего завораживает кросс-платформенность.

Тут, на форуме, не так давно человек задал вопрос: есть java-программа для мобилки, как запустить ее на PC?

И выяснилось... что нужен эмулятор!

LOL.

=================

Только не надо рассказывать про J2ME и J2SE, я это и сам знаю. Лучше давайте перестанем рассказывать про хваленую кроссплатформенность. Потому что под эмулятором можно и Delphi-программу где угодно запустить, был бы эмулятор. И будет такая же кроссплатформенность, ничуть не хуже.


 
Юрий Зотов ©   (2007-11-14 16:42) [88]

> DiamondShark ©   (14.11.07 16:32) [85]

Не хами. Это раз.

Если возникает вопрос, "почему нельзя явно вызывать метод, освобождающий ресурсы" - то марш учить ООП. Это два.


 
Skier ©   (2007-11-14 16:43) [89]


> Потому что под эмулятором можно и Delphi-программу где угодно
> запустить, был бы эмулятор.

с этого места по-подробнее, пожалуйста.


 
Reindeer Moss Eater ©   (2007-11-14 16:44) [90]

> в Яве всё-таки больше всего завораживает кросс-платформенность.

А так же куча зачем-то написанных платформенно зависимых third party библиотек.


 
Юрий Зотов ©   (2007-11-14 16:48) [91]

> Romkin ©   (14.11.07 16:26) [81]

Это информация компилеру, что метод может возбудить исключение определенного класса (или нескольких классов, через запятую). Ежели метод с таким заголовком вызвать из в другого метода, то компилер потребует либо написать то же самое в заголовке этого другого метода, либо обработать исключения внутри него.


 
Azize ©   (2007-11-14 16:50) [92]

Предлагаю со спором что лучше перебраться сюда
http://delphimaster.net/view/15-1195048125/


 
DiamondShark ©   (2007-11-14 17:02) [93]


> Юрий Зотов ©   (14.11.07 16:42) [88]


> Не хами. Это раз.

Я тебе не хамил, я констатировал факт.


> Если возникает вопрос, "почему нельзя явно вызывать метод,
>  освобождающий ресурсы" - то марш учить ООП. Это два.

А, так тебя смущает, что получится, если во что-то вроде TObjectList напихать чего-то вроде TFileStream и отобрать возможность явно вызвать деструктор?

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


 
pasha_golub ©   (2007-11-14 17:05) [94]


> Юрий Зотов ©   (14.11.07 16:48) [91]


> Это информация компилеру, что метод может возбудить исключение
> определенного класса (или нескольких классов, через запятую).
>

А зачем? Это что за станция такая? Почему я не могу возбуждать произвольное исключение?


 
Черный Шаман   (2007-11-14 17:09) [95]


> Юрий Зотов ©   (14.11.07 16:37) [87]
>
> Только не надо рассказывать про J2ME и J2SE, я это и сам
> знаю. Лучше давайте перестанем рассказывать про хваленую
> кроссплатформенность. Потому что под эмулятором можно и
> Delphi-программу где угодно запустить, был бы эмулятор.
> И будет такая же кроссплатформенность, ничуть не хуже.


Не. Будет точно хуже. Так как эмулятор для мобилки есть, а Wine(ака эмулятор для Delphi) не очень то винит.

Для Java максимум нужно эмулировать Hal, а для Delphi всю операционку. Поэтому для перехода под Линукс с программы на Delphi часто выгоднее полностью переписать эту программу на Java или не переходить на Линукс.

Программы на Java я с бубнами на Линукс запущу, а большинство реальных программ написанных на .NET. Только не надо про Mono, видели, кушали, обляпались...


 
Zeqfreed ©   (2007-11-14 17:10) [96]

> pasha_golub ©   (14.11.07 17:05) [94]

Чтобы метод открытия файла не возбуждал исключения ошибки деления на нуль.


 
Piter ©   (2007-11-14 17:16) [97]

Юрий Зотов ©   (14.11.07 12:07) [59]
Миш, научись спорить конкретно. Или не спорь совсем.

Тебе приводят конкретные факты - а в ответ, извини, словоблудие


что не понравилось? Есть мнение, что в ОС Windows нет и не было участков кода, которые приводили / могли привести к утечке памяти?

Юрий Зотов ©   (14.11.07 15:35) [76]
Не могли бы Вы привести конкретный код непосредственного потомка Object, один из методов которого вызывается при попадании объекта под сборку мусора?


Юрий, а я не понял. Вы сетуете на то, что никакой метод не вызывается при сборке муссора. Ок, но ведь в том же Delphi тоже нет никакого метода, который вызывается при сборке мусора, поскольку там сборка мусора отсутствует.

Идем дальше... Если вы хотите именно дельфого подхода, ну так создавайте сами, уничтожайте тоже сами, можете даже соответствующему методу дать название Destroy для пущей "совместимости с Delphi".

Я правильно понял - вы ругаете Java за то, что там есть дополнительные возможности по сравнению с дельфи, но эти возможности не так хороши как хотелось бы. Поэтому делаем вывод, что дельфи лучше. Все верно?


 
Черный Шаман   (2007-11-14 17:16) [98]


> Zeqfreed ©   (14.11.07 17:10) [96]
>
> > pasha_golub ©   (14.11.07 17:05) [94]
>
> Чтобы метод открытия файла не возбуждал исключения ошибки
> деления на нуль.


Тю, я почти в каждом методе пишу

try

код метода с другими try

except
Logger.Log(..., E.message);
edn;

Ошибка не должна вылезти за метод обработки, но должна быть сохранена для изучения и устранения.


 
Romkin ©   (2007-11-14 17:16) [99]


> А зачем? Это что за станция такая? Почему я не могу возбуждать
> произвольное исключение?

Тонкий вопрос :)
По видимому, нет централизованного места обработки исключений...


 
Romkin ©   (2007-11-14 17:17) [100]


> Ошибка не должна вылезти за метод обработки, но должна быть
> сохранена для изучения и устранения.

Мама, роди меня обратно...


 
@!!ex ©   (2007-11-14 17:18) [101]

> Так как эмулятор для мобилки есть, а Wine(ака эмулятор для
> Delphi) не очень то винит

Хм. Странно. Мой проект с использованием OpenGL 2.0(шейдеры, VBO, мультитекстуринг) + FMod(объемный звук) + DevIL спокойно запсукается и работат со скоростью сравнимую с виндой.


 
Канадец   (2007-11-14 17:18) [102]


> DiamondShark ©   (14.11.07 16:29) [82]


> Единственный случай -- экземпляры на стеке в Ц++.


Это не совсем верно. Нормальные программисты в таких случаях используют auto_ptr и shared_ptr


 
@!!ex ©   (2007-11-14 17:19) [103]

> Юрий, а я не понял. Вы сетуете на то, что никакой метод
> не вызывается при сборке муссора. Ок, но ведь в том же Delphi
> тоже нет никакого метода, который вызывается при сборке
> мусора, поскольку там сборка мусора отсутствует.

Хм. в дельфе я всегда знаю, в какой момент будет удален объект.
а в яве?


 
pasha_golub ©   (2007-11-14 17:20) [104]


> Zeqfreed ©   (14.11.07 17:10) [96]
>
> > pasha_golub ©   (14.11.07 17:05) [94]
>
> Чтобы метод открытия файла не возбуждал исключения ошибки
> деления на нуль.
>

Да ну блин?! А какое его (ее) дело, что я собираюсь возбудить? :)


> Черный Шаман   (14.11.07 17:16) [98]


> Ошибка не должна вылезти за метод обработки, но должна быть
> сохранена для изучения и устранения.

Вопрос спорнейший. Это ежели так действовать, то мы должны из каждого метода еще и код возврата вернуть. Типа вышло али не вышло. А лог можно и на "верху" построить. Более того со стеком вызовов, и где шо упало. Живой пример EurekaLog.

А, извините, после вызова метода каждый раз его case"ами окружать для выяснения чего там с ним случилось внутре, это не дело. Хотя как вариант существует. Вон вся BDE таким макаром крутится. DBIResult тебе вернули, а ты уж будь добр выясняй.


 
Zeqfreed ©   (2007-11-14 17:21) [105]

В C++ тоже есть спецификация исключений.  В принципе явную какую-то пользу от них вряд ли можно получить, но они могут выступать в качестве дополнительного самодокументирования кода.


 
Zeqfreed ©   (2007-11-14 17:22) [106]

> Да ну блин?! А какое его (ее) дело, что я собираюсь возбудить?
>  :)

Это все вопросы этики :)


 
Romkin ©   (2007-11-14 17:23) [107]


> Вопрос спорнейший. Это ежели так действовать, то мы должны
> из каждого метода еще и код возврата вернуть. Типа вышло
> али не вышло. А лог можно и на "верху" построить. Более
> того со стеком вызовов, и где шо упало. Живой пример EurekaLog.
> А, извините, после вызова метода каждый раз его case"ами
> окружать для выяснения чего там с ним случилось внутре,
> это не дело. Хотя как вариант существует. Вон вся BDE таким
> макаром крутится. DBIResult тебе вернули, а ты уж будь добр
> выясняй.

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


 
Черный Шаман   (2007-11-14 17:25) [108]


>
> Romkin ©   (14.11.07 17:17) [100]
>
>
> > Ошибка не должна вылезти за метод обработки, но должна
> быть
> > сохранена для изучения и устранения.
>
> Мама, роди меня обратно...


А что вам не нравится или показ Exception для пользователя это ему чем-то поможет?


 
Romkin ©   (2007-11-14 17:29) [109]


> А что вам не нравится или показ Exception для пользователя
> это ему чем-то поможет?

Обычно помогает. А то получается: нажал пользователь на кнопочку, а выполнилось или нет - у Пушкина спрашивать надо :)
Программа-то молчит как партизан!
Плюс исключение тем и хорошо, что всплывает по стеку вызовов, это его главное назначение. И отказываться от этой возможности по меньшей мере значит жить в каменном веке программирования.


 
Reindeer Moss Eater ©   (2007-11-14 17:30) [110]

А что вам не нравится или показ Exception для пользователя это ему чем-то поможет?

так вот оказывается кто придумал конструкцию типа:
try
...
except
ShowMessage("Ошибка какая-то, фик знает какая");
end;


 
pasha_golub ©   (2007-11-14 17:31) [111]


> Romkin ©   (14.11.07 17:29) [109]


> Плюс исключение тем и хорошо, что всплывает по стеку вызовов,
>  это его главное назначение.

Вот-вот, и без этой его особенности оно и нафиг никому не нужно.


> Черный Шаман   (14.11.07 17:25) [108]


> А что вам не нравится или показ Exception для пользователя
> это ему чем-то поможет?

А пользователю можно показать красивую мордашку, мол не волнуйтесь, уважаемый. У нас тут внутре неонка барахлит, так шо мы тут лог запишем, туда положим, а вы будьте добры по этому адресу его отправьте. И будет юзер довольный аки слон. Надеюсь :)


 
Romkin ©   (2007-11-14 17:34) [112]


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

А если на Application.OnException пустой обработчик присобачить - то вообще все всеглда работать будет!


 
pasha_golub ©   (2007-11-14 17:35) [113]


> Reindeer Moss Eater ©   (14.11.07 17:30) [110]


> так вот оказывается кто придумал конструкцию типа:

Это цветочки. Как вам такое:


Obj := TSomeClass.Create;
try
 try
   {чего-то там...}
 except
 end;
finally
Obj.Free;
end;


Шобы, как говориться, "наверняка". И комар носа не подточит


 
Черный Шаман   (2007-11-14 17:36) [114]


> Romkin ©   (14.11.07 17:29) [109]
>
>
> > А что вам не нравится или показ Exception для пользователя
> > это ему чем-то поможет?
>
> Обычно помогает. А то получается: нажал пользователь на
> кнопочку, а выполнилось или нет - у Пушкина спрашивать надо
> :)


Вот вы дошли к тому что и я.

Я из всех нетривиальных методов(где стоит перехват исключений) возвращаю булевый код успеха. А по какой причине операция не выполнилась пользователя очень редко интересует, его интересует общий результат(Да/Нет).

А лог ошибки поможет уже мне понять что у него на самом деле произошло.

Мой вариант учитывает психологию. А так как продукт работает на десятках тысяч компьютеров мира, то всегода пользователя можно попросить выслать error.log в случае проблемы.


 
DiamondShark ©   (2007-11-14 17:39) [115]


> Канадец   (14.11.07 17:18) [102]
>
> > Единственный случай -- экземпляры на стеке в Ц++.
>
> Это не совсем верно. Нормальные программисты в таких случаях
> используют auto_ptr и shared_ptr


Во-первых, это библиотечные штучки, а речь идёт о языке.
Во-вторых, а что такое auto_ptr и shared_ptr? Экземпляры на стеке, в которые завёрнуты ссылки.
Те же яйца, вид сбоку.


 
Romkin ©   (2007-11-14 17:41) [116]


> Вот вы дошли к тому что и я. Я из всех нетривиальных методов(где
> стоит перехват исключений) возвращаю булевый код успеха.
>

Я дошел?! Да эта технология использовалась еще... хм, думаю, не ошибусь,  лет тридцать назад. Вот об этом я и говорю, каменный век. Человеку дали великолепный механизм обработки исключений - и он от него отказался...


 
Reindeer Moss Eater ©   (2007-11-14 17:42) [117]

А если на Application.OnException пустой обработчик присобачить - то вообще все всеглда работать будет!

Только не всегда это надо.
Пример.
Модульное приложение, в котором мой модуль (bpl).
К основому приложению прикрутили либу MadException. Все замечательно, ловит все несловленное внизу и шлет письма.
А я по привычке при вызове метода предварительно проверяю права текущего юзера:

if not HasRights then raise Exception.Create("Сори, дорогой, нету у тебя прав на эту функцию");
<остальной код>


 
DiamondShark ©   (2007-11-14 17:42) [118]


> pasha_golub ©   (14.11.07 17:05) [94]
>
> А зачем? Это что за станция такая? Почему я не могу возбуждать
> произвольное исключение?

И что исполняющей среде с твоим произвольным исключением делать?


 
DiamondShark ©   (2007-11-14 17:44) [119]


> Хм. в дельфе я всегда знаю, в какой момент будет удален
> объект.
> а в яве?

а зачем это знать?


 
Reindeer Moss Eater ©   (2007-11-14 17:46) [120]

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

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



Страницы: 1 2 3 4 5 6 7 8 9 
10 11 вся ветка

Форум: "Прочее";
Текущий архив: 2007.12.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.72 MB
Время: 0.069 c
2-1195649367
{ент
2007-11-21 15:49
2007.12.16
List box


3-1186755739
koss_
2007-08-10 18:22
2007.12.16
сортировка датасета


5-1164199192
Provodnick
2006-11-22 15:39
2007.12.16
Добавление Object в TRichEdit.Lines


15-1195058193
VmR
2007-11-14 19:36
2007.12.16
По какому принципу изменяют версию программы


11-1181380412
mdw
2007-06-09 13:13
2007.12.16
Версия 2.65





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