Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Exit в Delphi

Автор: KDPoid
Дата сообщения: 19.05.2016 09:37
Смотрю в код. В большой процедуре вижу несколько кусков вида:
Код:
if <разные условия> then
begin
...
<повторяющаяся часть>
exit;
end;
Автор: Mavrikii
Дата сообщения: 19.05.2016 09:48
KDPoid
ну, как часто бывает, - два варианта
1) возвращать exit code, анализировать на пред шаге и действовать соответственно
2) кидать и ловить где нужно Exception

и ... 3) Вопросы по Delphi (до версии 2009) - часть 6 (и ссылки внутри)
Автор: KDPoid
Дата сообщения: 19.05.2016 10:57
Про первое не понял.
Вот абстрактный пример:
[more]
procedure Khm;
var
i : integer;
begin
for i := 0 to 10 do
begin
if cond1(i) then
begin
do1(i);
doBeforeExit;
exit;
end;
if cond2(i) then
begin
do2(i);
doBeforeExit;
exit;
end;
end;
DoIfNothing;
end;
[/more]
Как это более элегантно переписать с возвращаемыми значениями?

Второе тоже не нравится.
В коде очень вероятно использование
JclAddExceptNotifier(..., npFirstChain); // для внутреннего протоколирования ошибок

Так что писать
raise Exception.Create('Расслабьтесь, это не ошибка, просто мне был нужен двойной Exit');
это как-то "не оч"...

В местных статьях про усиленный exit ничего не нашёл, так что пока да, "степенное гугленье, в свободное от основной работы время".
Автор: NeoAnomaly
Дата сообщения: 19.05.2016 14:24
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;
Автор: KDPoid
Дата сообщения: 19.05.2016 14:38

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

Похоже, что правильно

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

Автор: NeoAnomaly
Дата сообщения: 19.05.2016 14:45
Ручками раскручивать стек для таких целей я бы не рискнул, пусть лучше seh это делает, а для JclException добавить фильтр на своё исключение.
Автор: NeoAnomaly
Дата сообщения: 19.05.2016 21:22

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

KDPoid, если вынести всё не относящееся к проверке логики в собственные функции, то выйдет не очень большая процедура(я надеюсь) А флаги - конечно константы.

Но я бы остановился на варианте с исключениями, а если юзать abort или унаследовать своё исключение от eabort, то даже отладке не будет мешать

Added:
EAbort и все наследуемые игнорируются JclException по умолчанию.

Страницы: 1

Предыдущая тема: Autohotkey


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.