OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 20 Апрель, 2019 03:21

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 52 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
 Заголовок сообщения: Финализация аварийной процедуры
СообщениеДобавлено: Среда, 09 Февраль, 2011 10:09 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
:idea:
До меня, наконец, довели простую, но важную мысль: необходим механизм финализации аварийной продедуры/функции! Другими словами, прежде, чем уйти в небытие, аварийная процедура должна "подчистить за собой", в частности, освободить системные ресурсы. Делать это должна она сама, так как только она обладает необходимой для этого информацией.

Поэтому в любой процедуре/функции, которая может вызвать исключение, должен быть блок finally, код в котором будет гарантированно исполнен вне зависимости от того, возникло исключение или нет. Например, если в процедуре/функции был открыт файл, то независимо от того, возникнет исключение или нет, файл все равно нужно в конце работы закрыть. В таком случае, код, отвечающий за закрытие файла целесообразно разместить в блоке finally.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 09 Февраль, 2011 21:43 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Сергей Прохоренко писал(а):
До меня, наконец, довели простую, но важную мысль: [b]необходим механизм финализации аварийной продедуры/функции...

:?

Теперь мне больше нравится другое решение:

При завершении функции/процедуры (независимо от того, возникло ли исключение) должны быть автоматически освобождены все ресурсы, занятые этой функцией/процедурой. Например, должны быть закрыты открытые в ней файлы. Ответственность за это возлагается на компилятор, действие которого аналогично действию конструкции using в C#.

Естественно, блок finally теперь не нужен.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 11 Февраль, 2011 08:24 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3039
Откуда: Астрахань
Я склонен к первому, а не второму. Для начинающих - надо все писать явно и ручками. Если блок finally обязателен, то и думать, что туда писать - обязательно. А думать для начинающего - всегда хорошо.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 11 Февраль, 2011 10:58 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Валерий Лаптев писал(а):
Я склонен к первому, а не второму. Для начинающих - надо все писать явно и ручками. Если блок finally обязателен, то и думать, что туда писать - обязательно. А думать для начинающего - всегда хорошо.


Я совершенно против такого подхода. Это все равно как заставлять студентов вместо while end и if elsif else end использовать goto - чтобы студенты "понюхали порорху". Привыкать нужно к хорошему, а плохого в любом случае будет предостаточно, когда они перйдут на "промышленные" языки. Никто же не требует, чтобы начинающие брали на себя сборку мусора, контроль за выходом индекса за границы массива, контроль типов, а перепоручают это всё компилятору и среде времени исполнения.

Корни такого подхода преподавателей мне понятны: за неимением хороших учебных проектов, на которых студентам можно потренироваться, им предлагается вручную повторить то, что давно реализовано в компиляторах и библиотеках. При этом им явным образом запрещают пользоваться удобными и надежными инструментами. Будущим системным программистам, может быть, это иногда полезно - чтобы лучше понимать кухню. Но есть риск, что студенты так и не освоят нормальные инструменты программирования, а извращения "промышленных" языков будут воспринимать как должное. Кстати, ненавязчивый отказ от finally в пользу using даже в "промышленном" C# - это аргумент в пользу моей позиции.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 11 Февраль, 2011 11:35 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Вот еще один аргумент против finally.
Если во время выполнения блока finally возникнет исключение, то что тогда делать? Эта проблема не имеет хорошего решения, то есть сам по себе блок finally небезопасен!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 11 Февраль, 2011 16:51 

Зарегистрирован: Среда, 30 Сентябрь, 2009 14:45
Сообщения: 147
Сергей Прохоренко писал(а):

Теперь мне больше нравится другое решение:

При завершении функции/процедуры (независимо от того, возникло ли исключение) должны быть автоматически освобождены все ресурсы, занятые этой функцией/процедурой. Например, должны быть закрыты открытые в ней файлы. Ответственность за это возлагается на компилятор, действие которого аналогично действию конструкции using в C#.

Естественно, блок finally теперь не нужен.

Кажется, это противоречит ООП (не то, чтобы я сторонник, так, просто замечаю),
поскольку ООП организует программу не иерархически, а хаотически.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 11 Февраль, 2011 18:08 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Тем хуже для ООП. :wink:
Тем более, что там уже, кажется, начался разброд и шатания.

А как Вы оцениваете саму идею?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 11 Февраль, 2011 18:11 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3039
Откуда: Астрахань
Сергей Прохоренко писал(а):
Валерий Лаптев писал(а):
Я склонен к первому, а не второму. Для начинающих - надо все писать явно и ручками. Если блок finally обязателен, то и думать, что туда писать - обязательно. А думать для начинающего - всегда хорошо.


Корни такого подхода преподавателей мне понятны: за неимением хороших учебных проектов, на которых студентам можно потренироваться, им предлагается вручную повторить то, что давно реализовано в компиляторах и библиотеках. При этом им явным образом запрещают пользоваться удобными и надежными инструментами. Будущим системным программистам, может быть, это иногда полезно - чтобы лучше понимать кухню. Но есть риск, что студенты так и не освоят нормальные инструменты программирования, а извращения "промышленных" языков будут воспринимать как должное. Кстати, ненавязчивый отказ от finally в пользу using даже в "промышленном" C# - это аргумент в пользу моей позиции.

Насчет учебных проектов - тут вы не правы. Есть учебные проекты. Хорошие. Но делают их - единицы. Реально единицы.
Вот лабы по системному ПО мне реально сделали только 3 человека в срок. А тут как раз хороший учебный проект из 3 программ: интерпретатор виртуальной машины, ассемблер и командный отладчик. Как раз на пару тысяч строк тянет.
Либо не могут, либо просто не хотят, считая это - фигней, которой препод заставляет заниматься.
А у нас даже в соседней конторе для своих разработок создали интегрированную среду с виртуальной машиной. И горя не знают... :)
А единица - это пацан, который и лабает у меня структурный редактор. Вот ему - ИНТЕРЕСНО!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 11 Февраль, 2011 18:12 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3039
Откуда: Астрахань
Сергей Прохоренко писал(а):
Вот еще один аргумент против finally.
Если во время выполнения блока finally возникнет исключение, то что тогда делать? Эта проблема не имеет хорошего решения, то есть сам по себе блок finally небезопасен!

Это - не аргумент. Точно так же небезопасен блок, сформированный компилятором.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 11 Февраль, 2011 18:34 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Валерий Лаптев писал(а):
Сергей Прохоренко писал(а):
Вот еще один аргумент против finally.
Если во время выполнения блока finally возникнет исключение, то что тогда делать? Эта проблема не имеет хорошего решения, то есть сам по себе блок finally небезопасен!

Это - не аргумент. Точно так же небезопасен блок, сформированный компилятором.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 11 Февраль, 2011 19:42 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
Компилятор вообще ничего сформировать не может. Корректная финализация - суть тоже алгоритм, а не банальный вызов мистической безошибочной функции CloseAndFinalizeAllResources.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 12 Февраль, 2011 16:10 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Александр Шостак писал(а):
Компилятор вообще ничего сформировать не может. Корректная финализация - суть тоже алгоритм, а не банальный вызов мистической безошибочной функции CloseAndFinalizeAllResources.


Может. Вот пример: http://www.quizful.net/interview/csharp/using-keyword


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 52 ]  На страницу Пред.  1, 2, 3

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB