![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
использование оператора goto
Scott Storch © (2012-01-05 15:35:00)в каких случаях оправдано использование оператора GoTo? Например, есть фунция, которая проверяет валидность некоторого параметра, по шагам проверяя некоторые условия. Если условие не выполняется нужно выводить ошибку. Нормально ли использование GoTo в таком случае?
procedure TG_Controller.CF_ValidateName1Parameter(Paramter: TParameter);
const
Chars1 = ['A'..'Z', 'a'..'z'];
Chars2 = ['A'..'Z', 'a'..'z', '0'..'9', '_'];
var
CharSet: TCharSet;
Length_, I: Integer;
label ERROR_LABEL;
begin
Length_ := Length(Paramter.Value);
// Step 1
if Length_ = 0 then
GoTo ERROR_LABEL;
// Step 2
for I := 1 to Length_ do
begin
if I = 1 then
CharSet := Chars1
else
CharSet := Chars2;
if not (Paramter.Value[I] in CharSet) then
GoTo ERROR_LABEL;
end;
// Step N
// ...
GoTo ERROR_LABEL;
// ...
Exit;
ERROR_LABEL:
ShowErrorFmt(@PARAMETER_VALUE_ERROR, [Parameter.Name]);
end;
Sha (2012-01-05 16:47:00) [1]
function TG_Controller.IsParamValid(Param: TParameter): boolean;
const
Chars1 = ['A'..'Z', 'a'..'z'];
Chars2 = ['A'..'Z', 'a'..'z', '0'..'9', '_'];
var
i: Integer;
begin;
i := Length(Param.Value);
while (i > 1) and (Param.Value[i] in CharS2) do dec(i);
Result := (i = 1) and (Param.Value[1] in CharS1);
end;
OW (2012-01-05 16:00:00) [2]Однажды некто проиграл в шахматы по всему выигранную партию. После анализа с известным гроссом, выяснилось, что ошибкой был его ход ладьёй за свою пешку.
- Но как же так! Ведь Вы сами писали в монографии, что при неясности позиции лучше всего ставить ладью именно так!, - воскликнул некто.
- Все правильно, ладью всегда надо ставить за свою пешку, кроме тех случаев, когда это плохо, - пожал плечами гроссмейстер.
DVM (2012-01-05 15:40:00) [3]
procedure TG_Controller.CF_ValidateName1Parameter(Paramter: TParameter);
const
Chars1 = ['A'..'Z', 'a'..'z'];
Chars2 = ['A'..'Z', 'a'..'z', '0'..'9', '_'];
var
CharSet: TCharSet;
Length_, I: Integer;
begin
Length_ := Length(Paramter.Value);
// Step 1
if Length_ = 0 then
raise Exception.CreateFmt(@PARAMETER_VALUE_ERROR, [Parameter.Name]);
// Step 2
for I := 1 to Length_ do
begin
if I = 1 then
CharSet := Chars1
else
CharSet := Chars2;
if not (Paramter.Value[I] in CharSet) then
raise Exception.CreateFmt(@PARAMETER_VALUE_ERROR, [Parameter.Name]);
end;
// Step N
// ...
raise Exception.CreateFmt(@PARAMETER_VALUE_ERROR, [Parameter.Name]);
end;
DVM (2012-01-05 15:37:00) [4]
> Нормально ли использование GoTo в таком случае?
Здесь можно было обойтись.