Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.19;
Скачать: CL | DM;

Вниз

оператор goto   Найти похожие ветки 

 
DimKa ©   (2004-09-01 10:58) [0]

Тут с коллегой вышел спор однако.
Тема такая - в процедуре использовал оператор goto.
Я ему сказал, что данные структуры не желательны.
В ответ получил - да, работает и ладно, а на код все равно смотреть никто не будет.
Мне это не понравилось, да и непонял я в его коде кое-чего и переписал код. Он обиделся, вроде как писал зря что-ли, мучался.
Может я не прав?
Чем чреваты данные конструкции?


 
passlight ©   (2004-09-01 11:01) [1]

Сложнее будет потом разбираться в коде.


 
Ozone ©   (2004-09-01 11:02) [2]

Ты прав. Гнать надо таких "програмистов"...


 
peypivo ©   (2004-09-01 11:04) [3]

Как такого "коллегу" на работу приняли?


 
Sergey_Masloff   (2004-09-01 11:04) [4]

Если четко понимать для чего нужен goto и чем он лучше других методов именно в этом конкретном месте - его применение ИМХО допустимо. Хотя в 99.99999% случаев использование этого оператора не привносит ничего хорошего.
 С другой стороны любой ассемблерный джамп это и есть goto так что хоронить старичка рано ;-)


 
Плохиш ©   (2004-09-01 11:04) [5]

И будет ветка на 150 постов, и будет длится обсуждение в течении 2 дней, и будут кипеть здесь религиозные страсти.


 
Dok_3D ©   (2004-09-01 11:07) [6]

Гнать, конечно, не нужно, но присмотреться повнимательнее будет не лишним. В конце концов - люди склонны к самообучению. Тем более, если корпоративный стиль обяжет - то никуда ему не деться.


 
КаПиБаРа ©   (2004-09-01 11:09) [7]

Приведи код с оператором Goto. Интересно посмотреть


 
DimKa ©   (2004-09-01 11:11) [8]


> Dok_3D ©   (01.09.04 11:07) [6]

Нет никакого корпоративного стиля, госконтора.

Спасибо всем за моральную поддержку.


 
Jeer ©   (2004-09-01 11:13) [9]

Недавно ушедший из жизни Эдсгер Дейкстра - основатель Algol, ввел термин "структурное" программирование.
Он обосновал, что нужны всего три логические структуры: sequence (следование), selection (ветвление) и iteration (цикл).
И без goto можно вполне обойтись.


 
Knight ©   (2004-09-01 11:14) [10]

У нас за такие goto с лабораторных выгоняли... а вообщее, его использование - дурной тон...


 
DimKa ©   (2004-09-01 11:14) [11]


> КаПиБаРа ©   (01.09.04 11:09) [7]



Compare:  for n := 0 to k - 1 do
      begin
        if OffY[k] = OffY[n] then
          begin
          ////
            OffY[k] := 6144 * Round(Random(ImH {- 1}));
            goto Compare;
          end;
      end;


Ничаго интересного - задача заполнения массива случайными числами без повтора значений.


 
Ega23 ©   (2004-09-01 11:16) [12]

While?


 
Dok_3D ©   (2004-09-01 11:17) [13]

Нет никакого корпоративного стиля ...

Во избежании ситуции с goto, нужно его(стиль) утвердить :))
И не будете время в будущем терять на такие мелочи.


 
Ega23 ©   (2004-09-01 11:17) [14]

А сам я довольно часто goto использую. Правда в T-SQL... :о)


 
DimKa ©   (2004-09-01 11:18) [15]


> Ega23 ©   (01.09.04 11:16) [12]
> While?

repeat
until


 
}|{yk ©   (2004-09-01 11:19) [16]

Когда-то на 3 курсе по защите информации генерил таблицу, где нет повторений ни в строках, ни в столбцах


randomize();
for (int i=0;i<ShifrGrid->ColCount;i++)
{
       for (int j=1;j<ShifrGrid->RowCount;j++)
       {
         bool insert=false;
         while(!insert)
         {
         int rnd=random(3*n);
         bool not=false;
               for (int k=0;k<ShifrGrid->RowCount;k++)
               {
               if(StrToIntDef(ShifrGrid->Cells[i][k],-1)==rnd)
                 not=true;
               }
               for (int l=0;l<ShifrGrid->ColCount;l++)
               {
               if(StrToIntDef(ShifrGrid->Cells[l][j],-1)==rnd)
                 not=true;
               }
         if(!not){
         ShifrGrid->Cells[i][j]=rnd;
         insert=true;}
         }
       }
}


 
Ega23 ©   (2004-09-01 11:21) [17]

DimKa ©   (01.09.04 11:18) [15]

Можно и так.


 
Sergey_Masloff   (2004-09-01 11:21) [18]

Jeer ©   (01.09.04 11:13) [9]
>Недавно ушедший из жизни Эдсгер Дейкстра - основатель Algol, >ввел термин "структурное" программирование.
>Он обосновал, что нужны всего три логические структуры: >sequence (следование), selection (ветвление) и iteration (цикл).
>И без goto можно вполне обойтись.
Да конечно можно. Но иногда с goto - эффективнее (повторю ОЧЕНЬ редко). Противного уважаемый Дейкстра не доказывал насколько я знаю. Кстати для передвижения из точки А в точку Б совершенно не нужен самолет или автомобиль - все прекрасно знают что для этого достаточно двух ног (и даже ползком можно).
 Да, GOTO можно заменить всегда. Но есть 100% уверенность что это НУЖНО делать всегда? У меня нет.


 
Dmitriy O. ©   (2004-09-01 11:24) [19]

Goto Класная вещь. Позволяющая экономить и код и время.
Я сам часто его использую.


 
}|{yk ©   (2004-09-01 11:26) [20]

Оно и видно :). Сколько AV было в автонагревателе?


 
SergP.   (2004-09-01 11:26) [21]

Хм... А я даже себе не могу представить, что можно такого написать на паскале что использование goto сделает прогу проще. Ни разу даже не пробовал его использовать на паскале, хотя когда-то давно начинал со старого бейсика, где без goto не обойтись...


 
Думкин ©   (2004-09-01 11:30) [22]

> SergP.   (01.09.04 11:26)

Сейчас есть Break и Continue. А когда их не было? Конечно и тогда можно было без него, но иногда уж очень лениво.


 
DimKa ©   (2004-09-01 11:32) [23]

Если кому надо - код заполнения массива без повторов:

Randomize;
 SetLength(LostPakets,KolUpak);
 LostPakets[0] := Random(Npackets);

 for i := 1 to KolUpak-1 do
 repeat
   NewZn := Random(Npackets);
   ZnEx := true;
   for j := 0 to i - 1 do
     if LostPakets[j] = NewZn then
       ZnEx := false;
   if ZnEx then
     LostPakets[i] := NewZn;
 until ZnEx;


 
Vovchik_A ©   (2004-09-01 11:32) [24]

2Dmitriy O. ©   (01.09.04 11:24) [19]

Дадад, автосхему видели :)

2DimKa ©

repeat
...
...
...
until

И будет твоему коллеге счастье. А то руки отрубят по самые уши когда-нибудь


 
default ©   (2004-09-01 11:36) [25]

"а на код все равно смотреть никто не будет."
это как-то наплевательски вот если бы он тебе объяснил почему он выбрал именно Goto, а так...


 
NailMan ©   (2004-09-01 11:37) [26]

SergP.

Function TUTGUI.Show_AudioOptionsMenu:Integer;
label _Start,_Exit;

  Procedure UpdateVariablesStates;
  begin
   TMainCheckBox(Menu.GetControlByName("Use3DHardwareSoundCheckBox")).Checked:=Use3DHardwareSound;
   TMainCheckBox(Menu.GetControlByName("UseSpatialSamplesCheckBox")).Checked:=UseSpatialSamples;
   TMainCheckBox(Menu.GetControlByName("ReverbForMusicCheckBox")).Checked:=UseReverbMusic;
    TMainScrollBar(Menu.GetControlByName("MusicVolumeBar")).Position:=Round((MusicVolume*16)/100);
    TMainScrollBar(Menu.GetControlByName("SfxVolumeBar")).Position:=Round((GUISfxVolume*16)/100);
    TMainScrollBar(Menu.GetControlByName("SoundVolumeBar")).Position:=Round((SfxVolume*16)/100);
    TMainScrollBar(Menu.GetControlByName("SpeakVolumeBar")).Position:=Round((SpeechVolume*16)/100);
  end;

begin
Menu:=TMenuForm.Create;
Menu.LoadMenu("AudioOptions_Menu.cfg","[AudioOptions_Menu]");
Menu.Caps.Info:=Menu.Buttons[menu.Items.ButtonIndex].Info;

 TMainScrollBar(Menu.GetControlByName("MusicVolumeBar")).Count:=16;
 TMainScrollBar(Menu.GetControlByName("SfxVolumeBar")).Count:=16;
 TMainScrollBar(Menu.GetControlByName("SoundVolumeBar")).Count:=16;
 TMainScrollBar(Menu.GetControlByName("SpeakVolumeBar")).Count:=16;
 UpdateVariablesStates;

Menu.Fade(FADE_IN);

//Основной цикл меню
_Start:
REPEAT
 if PeekMessage(Msg,Handle,0,0,PM_REMOVE) then begin TranslateMessage(Msg);DispatchMessage(Msg);end;
 Menu.Update; //Рендерим меню
if DeveloperModeEnable and DevelopEnableConsole and UTConsole.Enabled then
 Result:=UTConsole.execute
else
 result:=Menu.ReadInput;
UNTIL Result in[MENU_EXITTING,EC_RETURN,EC_ESCAPE,EC_TOGGLECONSOLE,EC_CHECKBOXCHECKED,EC_SCROLLBARCHANGED];

//Выбор пост-действий на событие
Case Result of
   MENU_EXITTING     : Goto _Exit;
   EC_ESCAPE         : Begin Result:=MENU_OPTIONSMENU; Goto _exit; End;
   EC_TOGGLECONSOLE  : UpdateVariablesStates;
   EC_RETURN         : begin
                        if Menu.GetNameActivatedControl(GUIID_BUTTON)="CloseButton" then
                         Begin Result:=MENU_OPTIONSMENU; Goto _exit; End;
                       end;
   EC_CHECKBOXCHECKED: begin
                        If Menu.GetNameActivatedControl(GUIID_CHECKBOX)="Use3DHardwareSoundCheckBox" then
                         begin Use3DHardwareSound:=Menu.CheckBoxs[Menu.Items.CheckBoxIndex].Checked; end;
                        If Menu.GetNameActivatedControl(GUIID_CHECKBOX)="UseSpatialSamplesCheckBox" then
                         begin UseSpatialSamples:=Menu.CheckBoxs[Menu.Items.CheckBoxIndex].Checked; end;
                        If Menu.GetNameActivatedControl(GUIID_CHECKBOX)="ReverbForMusicCheckBox" then
                         begin UseReverbMusic:=Menu.CheckBoxs[Menu.Items.CheckBoxIndex].Checked; end;
                       end;
                       
End;
Goto _Start;
_Exit:
Menu.Fade(FADE_OUT);
Menu.Free;
Menu:=nil;
end;


Этот пойдет?

Это "TForm" моего игрового GUI. С Goto было сделать проще.

---
WBR, NailMan aka 2:5020/3337.13


 
Игорь Шевченко ©   (2004-09-01 11:38) [27]


> Этот пойдет?


В recycle bin


 
NailMan ©   (2004-09-01 11:40) [28]

Игорь Шевченко ©
Чем же?

---
WBR, NailMan aka 2:5020/3337.13


 
Ega23 ©   (2004-09-01 11:42) [29]

While true do begin
REPEAT
if PeekMessage(Msg,Handle,0,0,PM_REMOVE) then begin TranslateMessage(Msg);DispatchMessage(Msg);end;
Menu.Update; //Рендерим меню
if DeveloperModeEnable and DevelopEnableConsole and UTConsole.Enabled then
Result:=UTConsole.execute
else
result:=Menu.ReadInput;
UNTIL Result in[MENU_EXITTING,EC_RETURN,EC_ESCAPE,EC_TOGGLECONSOLE,EC_CHECKBOXCHECKED,EC_SCROLLBARCHANGED];

//Выбор пост-действий на событие
Case Result of
  MENU_EXITTING     : Break;//Goto _Exit;
  EC_ESCAPE         : Begin Result:=MENU_OPTIONSMENU; Break;End;
  EC_TOGGLECONSOLE  : UpdateVariablesStates;
  EC_RETURN         : begin
                       if Menu.GetNameActivatedControl(GUIID_BUTTON)="CloseButton" then
                        Begin Result:=MENU_OPTIONSMENU; Break;End;
                      end;
  EC_CHECKBOXCHECKED: begin
                       If Menu.GetNameActivatedControl(GUIID_CHECKBOX)="Use3DHardwareSoundCheckBox" then
                        begin Use3DHardwareSound:=Menu.CheckBoxs[Menu.Items.CheckBoxIndex].Checked; end;
                       If Menu.GetNameActivatedControl(GUIID_CHECKBOX)="UseSpatialSamplesCheckBox" then
                        begin UseSpatialSamples:=Menu.CheckBoxs[Menu.Items.CheckBoxIndex].Checked; end;
                       If Menu.GetNameActivatedControl(GUIID_CHECKBOX)="ReverbForMusicCheckBox" then
                        begin UseReverbMusic:=Menu.CheckBoxs[Menu.Items.CheckBoxIndex].Checked; end;
                      end;
                     
End;
end;

?


 
VID ©   (2004-09-01 11:43) [30]

DimKa ©   (01.09.04 11:14) [11]
Ихмо, простая рекурсия с условным вызоым.

Тут меня заинтересовало, если не секрет конечно, какую зарплату получает автор приведённого тобою кода ?


 
DimKa ©   (2004-09-01 11:46) [31]


> VID ©   (01.09.04 11:43) [30]

Согласно должности инженера 2-ой категории.


 
NailMan ©   (2004-09-01 11:50) [32]

Ega23 ©
Вобщем-то правильно, но с GoTo по смыслу было проще понять куда же я попаду после goto чем в вышеприведенном коде.

---
WBR, NailMan aka 2:5020/3337.13


 
VID ©   (2004-09-01 11:50) [33]

DimKa ©   (01.09.04 11:46) [31]
А это сколько ?


 
Ega23 ©   (2004-09-01 11:56) [34]

NailMan ©   (01.09.04 11:50) [32]

Не уверен, как раз мне проще так, как я написал. ИМХО, дело вкуса.

Могу привести пример:
Делаем разбор строки. Case применить нельзя. Возможных значений, например, около 100. Чаще всего встречаются первые 2.

if UpperCase(Str)="AAA" then begin DoSmthng1; Goto Fin; end;
if UpperCase(Str)="BBB" then begin DoSmthng2; Goto Fin; end;
if UpperCase(Str)="CCC" then begin DoSmthng3; Goto Fin; end;
  ...................................
if UpperCase(Str)="N" then DoSmthngN;
Fin:


 
КаПиБаРа ©   (2004-09-01 11:59) [35]

DimKa ©   (01.09.04 11:32) [23]

У твоего товарища код был интереснее, оригинальнее, быстрее. Зря ты его переписал.


 
Плохиш ©   (2004-09-01 12:06) [36]


> Ega23 ©   (01.09.04 11:56) [34]


> if UpperCase(Str)="AAA" then DoSmthng1
> else if UpperCase(Str)="BBB" then DoSmthng2
> else if UpperCase(Str)="CCC" then DoSmthng3
> else
>   ...................................
> if UpperCase(Str)="N" then DoSmthngN;

Следуюший вопрос ;-)


 
Ega23 ©   (2004-09-01 12:08) [37]

Плохиш ©   (01.09.04 12:06) [36]

Логично!  :о)


 
Jeer ©   (2004-09-01 12:14) [38]

Как вариант:

 x := round(1000*Random);

 for j:=0 to High(Y) do begin
   for i:=0 to High(Y) do
     if Y[i] = x then
        while Y[i] = x do
          x := round(1000*Random);
   Y[j] := x;
 end;

А в коде DimKa ©   (01.09.04 11:14) [11]
ошибка или он неполный.


 
Думкин ©   (2004-09-01 12:18) [39]

А не проще заполонить массив с возрастанием, а потом перемешать?


 
Jeer ©   (2004-09-01 12:20) [40]

Ega23 ©   (01.09.04 11:56) [34]

Case со строками можно делать, но с умом:)
хеш или так:

function StrCase(Selector: string; StrList: array of string): integer;
var
i: Integer;
begin
 Result := -1;
 for i := 0 to High(StrList) do begin
   if Selector = StrList[i] then begin
     Result := i;
     Break;
   end;
 end;
end;

case StrCase(StringToTest, ["First", "Second", "Third"]) of
 0: ShowMessage("1: " + s);
 1: ShowMessage("2: " + s);
 2: ShowMessage("3: " + s);
else
 ShowMessage("else: " + s);
end;


 
Jeer ©   (2004-09-01 12:21) [41]

Думкин ©   (01.09.04 12:18) [39]
Перемешивать долго придется:)


 
DimKa ©   (2004-09-01 12:21) [42]


> Jeer ©   (01.09.04 12:14) [38]

ПравДа? не вижу ошибки (


 
Jeer ©   (2004-09-01 12:23) [43]

где заполнение массива ?


 
DimKa ©   (2004-09-01 12:29) [44]


> Jeer ©   (01.09.04 12:23) [43]

if ZnEx then
     LostPakets[i] := NewZn;


 
}|{yk ©   (2004-09-01 12:30) [45]

2Думкин ©   (01.09.04 12:18) [39]
Да нет, а если в нужно чтобы в любом "кресте" должны быть только уникальные числа


 
KilkennyCat ©   (2004-09-01 12:34) [46]

begin
 label1: goto label4;
 label2: goto label3;
 label3: goto label1;
 label4: goto label2;
end;

это просто так. крик души. достало все...


 
Jeer ©   (2004-09-01 12:35) [47]

DimKa ©   (01.09.04 12:29) [44]

я о DimKa ©   (01.09.04 11:14) [11]


 
DimKa ©   (2004-09-01 12:35) [48]


> KilkennyCat ©   (01.09.04 12:34) [46]
> это просто так. крик души. достало все...

Тогда так:

toall : goto ...


 
DimKa ©   (2004-09-01 12:37) [49]


> Jeer ©   (01.09.04 12:35) [47]

Там, да не полный, просто пример goto


 
КаПиБаРа ©   (2004-09-01 12:48) [50]

Jeer ©   (01.09.04 12:21) [41]

> Перемешивать долго придется:)

Randomize;
SetLength(LostPakets,KolUpak);
Offset := 0;
for i := 0 to KolUpak-1 do
begin
 Inc(Offset, Random((Npackets - Offset) div (KolUpak-i))+1);
 LostPakets[i] := Offset;
end;
for i := 0 to KolUpak-1 do
begin
 j := Random(KolUpak);
 n := LostPakets[j];
 LostPakets[j] := LostPakets[i];
 LostPakets[i] := n;
end;


 
VMcL ©   (2004-09-01 13:09) [51]

>>Ega23 ©  (01.09.04 11:56) [34]

Массив-константа из правых частей ("AAA", "BBB", ...) спасет отца русской демократии.

P.S. UpperCase(Str) в каждом из if"ов - это, по моему совершенно нескромному мнению, гнусное ламерство. Почему не сделать один раз StrUp := UpperCase(Str); и сравнивать далее StrUp (что кстати в общем случае увеличит скорость и улучшит читабельность)?


 
YurikGL ©   (2004-09-01 14:59) [52]

Редко, но использую goto т.к. не считаю это чем-то страшным. ИМХО просто не надо ими злоупотреблять а читабельность кода он иногда повышает, если название метки оражает название блока к которому осуществляется переход.


 
Igorek ©   (2004-09-01 18:22) [53]

goto лучше при выходе из вложенного цикла чем флажки бо нету break 2 (3...)


 
Fay ©   (2004-09-01 18:45) [54]

Чей-то сознательный отказ от goto у меня вызывает только жалость.
Те, кто по религиозным соображениям не ест свинину мне более понятны.


 
nikkie ©   (2004-09-01 18:53) [55]

>Ничаго интересного - задача заполнения массива случайными числами без повтора значений.
вариант без goto
 i := 0;
 while (i < n) do begin
   Arr[i] := Random(Max);
   j := 0;
   while j < i do begin
     if Arr[i] = Arr[j] then break;
     Inc(j);
   end;
   if j = i then Inc(i);
 end;


тот же алгоритм с goto:

 for i := 0 to n - 1 do begin
get_random:
   Arr[i] := Random(Max);
   for j := 0 to i - 1 do
     if Arr[i] = Arr[j] then goto get_random;
 end;


даже чуть короче. честно говоря, в коде [11] меня больше напрягает использование n в качестве переменной цикла. такое ощущение, что этот код вложен в еще 3 цикла - и переменные i,j,k уже использованы. если так, то вынести заполнение цикла в отдельную процедуру и жить станет легче, жить станет веселее.


 
nikkie ©   (2004-09-01 18:59) [56]

еще вариант без goto.
 for i := 0 to n - 1 do begin
   repeat
     ok := True;
     Arr[i] := Random(Max);
     for j := 0 to i - 1 do
       if Arr[i] = Arr[j] then begin
         ok := False;
         break;
       end;
   until ok;
 end;

я бы написал без goto, наверное. в основном из-за того, что ломало бы label объявлять..

ЗЫ. о, фей неуловимый появился...


 
Fay ©   (2004-09-01 19:12) [57]

2 nikkie ©   (01.09.04 18:59) [56]
Инет починили.


 
clickmaker ©   (2004-09-01 19:15) [58]


> [54] Fay ©   (01.09.04 18:45)
> Чей-то сознательный отказ от goto у меня вызывает только
> жалость.

А бессознательный? :)


 
Fay ©   (2004-09-01 19:21) [59]

2 clickmaker ©   (01.09.04 19:15) [58]
Порой мне кажется, что этот путь пошире МКАД-а 8)


 
nikkie ©   (2004-09-01 19:44) [60]

>Инет починили.
мои поздравления.

цитирую из ветки
http://delphimaster.net/view/14-1091091921/
последняя моя попытка. устал уже за тобой по разным веткам бегать...

****

[139] nikkie ©   (19.08.04 15:26)
>Требуется уточнение - какой именно код
хороша перцовочка... :)
http://delphimaster.net/view/14-1091091921/

>Я спросил, не будешь ли ты против письма. Ответ не видел. М.б. плохо смотрел.
http://delphimaster.net/view/14-1091091921/
[105],[107]

>Сам то будешь?
в этой ветке [99],[127]

ЗЫ нет, ты просто не понимаешь, сколько ты теряешь без клиента... :)


 
Fay ©   (2004-09-01 19:59) [61]

>> ЗЫ нет, ты просто не понимаешь, сколько ты теряешь без клиента... :)

Очень вероятно.


 
Alex Konshin ©   (2004-09-01 20:01) [62]

Goto использую по делу и совесть меня не мучает.
Иногда это намного понятнее чем структурные извраты.
При обучении языку его использование вредно, т.к. может войти в привычку. Но не будьте догматиками.
Придумываете себе трудности, а потом героически их преодолеваете.


 
Fay ©   (2004-09-01 20:02) [63]

2 Alex Konshin ©   (01.09.04 20:01) [62]
Такое ощущение, что 3-е предложение написано под диктовку. Плохо вяжется с остальными.


 
KilkennyCat ©   (2004-09-01 21:01) [64]


> nikkie ©   (01.09.04 18:59) [56]

еще вариант без goto.

 i := low(arr);
 repeat
   arr[i] := random(max);
   for j := low(arr) to i - 1 do if arr[j] = arr[i] then dec(i);
   inc(i);
 until i > high(arr);


 
nikkie ©   (2004-09-01 21:19) [65]

>KilkennyCat
только break надо добавить. чего в холостую цикл крутить.


 
KilkennyCat ©   (2004-09-01 21:20) [66]


> nikkie ©   (01.09.04 21:19) [65]

согласен. Хотел просто короче код :)
но на оду переменную все-таки меньше.


 
Сергей Суровцев ©   (2004-09-01 23:23) [67]

Дался вам этот goto...
Если он есть - значит им можно и нужно пользоваться. Злоупотреблять действительно не стоит, но априори зарекаться тоже глупо. Иногда именно его использование дает солидный прирост в скорости, тогда использую без зазрения совести. :))


 
Soft ©   (2004-09-02 03:25) [68]

Второй пример касается чистоты стиля -- вообще нет необходимости применять язык ассемблера. Помните, что когда Дейкстра посчитал goto вредным, он имел в виду привычку использовать goto для организации управления в неструктурированном коде 60-х годов. Идея заключалась в том, что меньше используя goto мы могли бы улучшить ясность. Идея не состояла в жертвовании ясностью избегая goto любой ценой. Представьте программу, которой нужно открыть порт, инициализировать его, инициализировать модем, установить соединение, зарегистрироваться (logon) и загрузить файл (download). Если что-то не так, в любом месте, нам нужно вернуться обратно в самое начало. Доморощенный структуралист мог бы написать нечто вроде:

 BOOL Done = FALSE;

 while(!Done)
  {
   if(OpenPort())
    {
     if(InitPort())
      {
       if(InitModem())
        {
         if(SetupConnection())
          {
           if(Logon())
            {
             if(Fetch())
              {
               Done = TRUE; // Ouch! Hit the right hand side!
              }
            }
          }
        }
      }
    }
  }


Что нам кажется просто глупым. Есть более понятная альтернатива, использующая то, что оператор && прекращается сразу, как только встречается выражение, принимающее значение FALSE -- "неправильное использование" языка, обычно запрещаемое в большинстве стандартов кодирования:

while(!(OpenPort()&&
       InitPort()&&
       InitModem()&&
       SetupConnection()&&
       Logon()&&
       Fetch()));


Здесь все ясно и удобно, поскольку мы можем инкапсулировать каждый шаг в функцию. Проблема в коде такого рода заключается в том, что требуется правильно сделать целый ряд ужасных вещей, например инициализацию строк и т.п., и чтобы работать с таким кодом, нужно выполнить его в очень похожем на скрипт виде. Например, так:

Start:  if(!OpenPort())goto Start;
        if(!InitPort())goto Start;
        if(!InitModem())goto Start;
        if(!SetupConnection())goto Start;
        if(!Logon())goto Start;
        if(!Fetch())goto Start;


Это в точности то, что позволяют нам делать специализированные скриптовые языки, разработанные для такого вида работ!

Не забывайте, если вы хотите, чтобы предмет вашего обожания понял ваше любовное письмо, вы не позволите педантизму правописания и грамматики исказить письмо, а если вы хотите, чтобы ваши коллеги поняли вашу программу, не перекручивайте ее структуру во имя "чистоты".

http://www.progstone.narod.ru/reciprocality/r0/Day4.html



Страницы: 1 2 вся ветка

Текущий архив: 2004.09.19;
Скачать: CL | DM;

Наверх




Память: 0.68 MB
Время: 0.035 c
1-1094146266
UserUserov
2004-09-02 21:31
2004.09.19
Функции


4-1091705285
анонимный
2004-08-05 15:28
2004.09.19
панель задач


3-1092320934
buka
2004-08-12 18:28
2004.09.19
Принцип срзданиия текстовой базы


3-1092907138
Loaderz
2004-08-19 13:18
2004.09.19
Где здесь Ошибка???


6-1085769659
oleg_SYS
2004-05-28 22:40
2004.09.19
Как определить, существует ли почтовый адрес?