Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

использование оператора 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 в таком случае?  

Здесь можно было обойтись.


Наверх

Титульная страница Поиск, карта сайта Написать письмо