DELPHI: как пользоваться & # 8220; break & # 8221; вне цикла или дела?
Вопрос
рассмотрим следующий код на языке Delphi:
var
tc: TComponent
begin
{ do something to get tc }
repeat
if(tc is TDBEdit)then begin
if(check_something_about_edit(tc))then break;
do_something_else_edit(tc);
break;
end else if(tc is TBMemo) then begin
if(check_something_about_memo(tc))then break;
do_something_else_memo(tc);
break;
end;
raise exception.create('invalid component type');
until(true); {single iteration look required to use break }
Я знаю, что, возможно, есть некоторые полиморфные вещи, которые я мог бы сделать с TComponent, но это не мой вопрос. Мне интересно, есть ли способ избавиться от единственной итерации, повторяющей оператор до. Без него я не могу использовать оператор break где-либо в блоке обработки, и мне нужно, чтобы он прекратил обработку в любое время.
Решение
Упакуйте его в функцию и используйте выход для возврата назад. если есть код, следующий за оператором повторения, используйте локальную функцию / процедуру, что-то вроде:
procedure ...
procedure testsomething(tc: TComponent);
begin
if(tc is TDBEdit)then begin
if(check_something_about_edit(tc))then exit;
do_something_else_edit(tc);
exit;
end else if(tc is TBMemo) then begin
if(check_something_about_memo(tc))then exit;
do_something_else_memo(tc);
exit;
end;
raise exception.create('invalid component type');
end;
var
tc: TComponent;
begin
{ do something to get tc }
try
TestSomething(tc);
{ do something more }
except
...
end;
end;
Другие советы
Есть еще один простой способ:
if(tc is TDBEdit)then begin
if not (check_something_about_edit(tc)) then
do_something_else_edit(tc);
end else if(tc is TBMemo) then begin
if not (check_something_about_memo(tc)) then
do_something_else_memo(tc);
end else
raise exception.create('invalid component type');
end;
Что вы на самом деле делаете, так это используете break как goto. Предложение Ральфа использовать функцию в качестве области является хорошим. Но в противном случае вы можете быть честными и использовать «готово». Потеря повтора сделает его более читабельным.
Почему вы хотите использовать разрыв, а не выход? Break в Delphi - это не то же самое, что «break» на языках фигурных скобок.
var
tc: TComponent
begin
{ do something to get tc }
if (tc is TDBEdit) then
begin
if not (check_something_about_edit(tc)) then
do_something_else_edit(tc);
Exit;
end;
if (tc is TBMemo) then
begin
if not (check_something_about_memo(tc)) then
do_something_else_memo(tc);
Exit;
end;
raise exception.create('invalid component type');
end;
О макете. Если бы вы не пытались уменьшить количество пустых мест, это не Потратьте «еще один час, чтобы убедиться, что все мои if-else правильно выстроены» как вы сказали в предыдущем комментарии.
Если у вас есть код, который вы хотите выполнить после этого, либо воспользуйтесь предложением Ральфа о локальной процедуре, либо перенесите попытку try..finally - код в finally все равно будет выполнен.