Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Exit в Delphi

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

KDPoid



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Смотрю в код. В большой процедуре вижу несколько кусков вида:
Код:
 
if <разные условия> then
begin
  ...
    <повторяющаяся часть>
    exit;
end;

Переделать на:
Код:
 
if <разные условия> then
begin
  ...
    doBeforeExit;
    exit;
end;
- не совсем удовлетворяет моё эстетическое чувство
 
Если бы exit позволял вывалиться наверх не на один уровень, а на несколько, то я бы убрал exit внутрь и получил бы более изящное:
:
Код:
 
if <разные условия> then
begin
  ...
    doAndExit;
end;

Вряд ли я первый, кто задумался о создании процедуры
Exit(aLevel: integer);
Адреса возврата, они же вот, в стеке...
Если кто-то уже сделал себе что-то подобное, прошу поделиться конструкцией велосипеда

Всего записей: 404 | Зарегистр. 08-08-2006 | Отправлено: 09:37 19-05-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KDPoid
ну, как часто бывает, - два варианта
1) возвращать exit code, анализировать на пред шаге и действовать соответственно
2) кидать и ловить где нужно Exception
 
и ... 3) Вопросы по Delphi (до версии 2009) - часть 6 (и ссылки внутри)

Всего записей: 15111 | Зарегистр. 20-09-2014 | Отправлено: 09:48 19-05-2016 | Исправлено: Mavrikii, 09:50 19-05-2016
KDPoid



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Про первое не понял.
Вот абстрактный пример:
Подробнее...
Как это более элегантно переписать с возвращаемыми значениями?
 
Второе тоже не нравится.
В коде очень вероятно использование
JclAddExceptNotifier(..., npFirstChain); // для внутреннего протоколирования ошибок
 
Так что писать  
raise Exception.Create('Расслабьтесь, это не ошибка, просто мне был нужен двойной Exit');
это как-то "не оч"...
 
В местных статьях про усиленный exit ничего не нашёл, так что пока да, "степенное гугленье, в свободное от основной работы время".

Всего записей: 404 | Зарегистр. 08-08-2006 | Отправлено: 10:57 19-05-2016
NeoAnomaly

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KDPoid, try-finally + exit + <necessary operations mask>!?
 
Возможно не правильно понял суть вопроса, но что-то на подобии:
 

Код:
 
try
   if InitSubsys1() then
      subsys := subsys or 1
   else
      Exit;
 
   if InitSubsys2() then
      subsys := subsys or 2
   else
      Exit;
finally
   if subsys > 0 then
   begin
      <Common operations>
   end;
 
   if subsys and 2 then
      ReleaseSubsys2();
 
   if subsys and 1 then
      ReleaseSubsys1();
end;
 

Всего записей: 418 | Зарегистр. 23-03-2010 | Отправлено: 14:24 19-05-2016 | Исправлено: NeoAnomaly, 14:38 19-05-2016
KDPoid



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Возможно не правильно понял суть вопроса

Похоже, что правильно
 
Но в вашем варианте мы разносим проверку и действия по разным частям большой процедуры.
Не очень красиво.  
В этом месте эстеты должны порываться задать мнемонические имена флагам 1,2,4...  
 

Всего записей: 404 | Зарегистр. 08-08-2006 | Отправлено: 14:38 19-05-2016 | Исправлено: KDPoid, 14:52 19-05-2016
NeoAnomaly

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ручками раскручивать стек для таких целей я бы не рискнул, пусть лучше seh это делает, а для JclException добавить фильтр на своё исключение.

Всего записей: 418 | Зарегистр. 23-03-2010 | Отправлено: 14:45 19-05-2016 | Исправлено: NeoAnomaly, 14:48 19-05-2016
NeoAnomaly

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Но в вашем варианте мы разносим проверку и действия по разным частям большой процедуры.  

KDPoid, если вынести всё не относящееся к проверке логики в собственные функции, то выйдет не очень большая процедура(я надеюсь) А флаги - конечно константы.
 
Но я бы остановился на варианте с исключениями, а если юзать abort или унаследовать своё исключение от eabort, то даже отладке не будет мешать
 
Added:
EAbort и все наследуемые игнорируются JclException по умолчанию.

Всего записей: 418 | Зарегистр. 23-03-2010 | Отправлено: 21:22 19-05-2016
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Exit в Delphi


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru