no goto?

42 отговора 1621 прегледа
#1

no goto?

Taka...
Imame slednia code:

for ( int i = 0; i < 10; i++ )
{
TryAgain:
// malko code
while ( condition )
{
if ( f(i,l) == true )
{
l++;
goto TryAgain;
}
else
{
// edna kamara code
}
// oste edna kamara code
}
}

Kak da se izbegne goto v tozi sluchai?

Отговор
в отговор на Гypy #3

с continue няма да стане

по принцип може да се избегне, но ще стане още по-нечетливо. аз в такива случаи пиша гото и не ми мигва окото.

Отговор
в отговор на zaphod #4

Re: с continue няма да стане

i koe mu e nechetlivoto na continue?
e ako iskash da izlezesh niakolko niwa na wlojenost, mai
samo s goto stawa chetliwo... za men.
Guru sigurno bi izpolzwal exception ako e na C++, no se
symniawam dali ima namerenie poweche da polzwa
takiwa inferior sredstwa kato ima VB.NET...

drugia wariant e da si uprostish algorityma,
tam mai winagi ima kakwo da se naprawi :)

Отговор
в отговор на dummy #5

Re: no goto?

слагаш вътрешния цикъл във функция.

без майтап в една фирма големи глави са писали кодинг станадарт да не се ползва нито break, нито continue, a return osven v края на функция не се препоръчва.

Отговор
в отговор на expert #6

Re: с continue няма да стане

>> e ako iskash da izlezesh niakolko niwa na wlojenost, mai

Е за какво ги влагаш едно в друго тия няколко нива на "вложеност", след като можеш да скачаш наляво надясно през нивата ? Нали затова кода трябва да е структуриран, от едно място да се стига до друго ясно и четливо.

Ако в един цикъл вложиш друг, трябва ЗАДЪЛЖИТЕЛНО от вложения цикъл да може да се излиза само в неговия parent цикъл, иначе за какво ги nest-ваш един в друг ? Ако може да се скача наляво надясно във nested цикли, то тогава по дефиниция проблема не трябва да се решава с nested цикли а със
отделяне на кода във методи и викане на съответните методи.

Именно и затова 99% от употребата на "гото" се abuse-ва и учи на лошо кодиране, щото така е по-лесно да се пишат спагети, а после който оправя бъговете той да му мисли.

Отговор
в отговор на dummy #7

Re: no goto?


bool gotoSux;

for ( int i = 0; i < 10; i++ )
{
do
{
gotoSux = false;
// malko code
while ( condition )
{
if ( f(i,l) == true )
{
l++;
gotoSux = true;
break;
}
else
{
// edna kamara code
}
// oste edna kamara code
}
}
while (gotoSux);
}


Отговор
в отговор на Questor #8

Re: no goto?

съгласен съм с изваждането на функцията.

аз виждам грозно написана огромна процедура, която прави 50 неща ( ако броим коментарите за камарите код ). разделянето на малки процедури е най-малкото, което може да се направи.

гото-то само по себе си не е лошо. то е СИМПТОМ на лошите неща, които ни дебнат :->

ако гледаме само циклите --> виждам нещо ( вътрешния ), което се опитваме да направим 10 пъти. ами защо нещото не се издърпа навън и не му се сложи четливо име. ExtractMethod рефакторинга визирам.

--
"Agile is a mindset, not a set of practices, rules, or tools."
Tom Poppendieck
Отговор
в отговор на dummy #9

Re: no goto?

Ми не избягвай "goto"! :)
Мисли, както казват, позитивно:)
Повечето програмисти си сменят работата през година, две.....
От това следва, че няма да си ти човека, който ще го оправя след време.
От това следва - създай малко работа и за бъдещите програмисти:)
Всичко на готово ли ша да получават, я!:)

Отговор
в отговор на Zelen #10

Re: no goto?

>От това следва, че няма да си ти човека, който ще го оправя след време.

но и следва, че ще оправяш чужди "шедьоври" на друго място нали?

--
"Agile is a mindset, not a set of practices, rules, or tools."
Tom Poppendieck
Отговор
в отговор на dummy #11

Re: no goto?

Nai-ochevidnoto za men e, vmesto da izpolzvash for, da izpolzvash while i da manipulirash yavno indexite. Tui kato, kakto gledam, v tozi sluchai izpolzvaneto na goto celi da se izbegne avtomatichnoto uvelichavane na i.
A shto se otnasya do tova dali izpolzvaneto na goto tryabva da se izbyagva i dali vodi do nechetliv kod: az ryadko go polzvam, no kato mi se naloji, ne me plashi. Spored men ima sluchai, kogato tova prosto e nai-efektivno. A chetliv kod moje da se pishe i na assembler, kudeto izpolzvaneto na podobna komanda e estestveno. Taka che dobrata struktura ne opira do tova dali da se polzva goto ili ne.

Отговор
в отговор на Zelen #12

Re: no goto?

> Всичко на готово ли ша да получават, я!:)
Mi da, po-dobre na goto-vo :-)

Отговор
в отговор на Mycлoн #13

Re: no goto?

Да, следва:)
Чук, goto и мноого вълшебни думи оправят работата:)

Отговор
в отговор на Гypy #14

Re: no goto?

mi s continue sha dignesh i s edno
a ne I :-)
taka kato gledam primera ...
i posle sha si tyyyrsish greshkata ....

доказано дебелоглав
Отговор
в отговор на MishoM #15

Re: no goto?

Истинският програмист не се притеснява да използва goto. Това, че водело до нечетлив код, и други подобни твърдения са чиста проба глупости, породени от нечие сляпо вманиачаване в идеите на структурното програмиране, и от нечий друг мързел при проследяването на логиката на алгоритъма. goto си е напълно естествена операция и премерената му употреба често води до по-ефективен и дори по-четлив код (примерно изнасянето на пет реда код в отделна функция само и само за да се избегне goto е тъпо - добавят се излишни извиквания на функцията, а също така става трудно четенето на кода без специален редактор с възможности за крос-функционална навигация). Но щом някой има непреодолимото желание да си губи времето в мислене на изключително хитър (и същевременно неефективен) алгоритъм, с цел избягане на употребата на goto, то никой не може да го спре.

Така че съм напълно съгласен с теб.

"Смърт за goto. Да живее goto."

П.П. Като стана дума за спагети в по-горните постове... Аз много обичам спагети, но понеже съм доста сакат в готвенето (все пак съм теоретичен физик, а не (био-)химик или нещо подобно) си купувам готови сосове от Фантастико. Обаче нещо съм зациклил върху крайно множество типове сосове. Идеи как да изляза от цикъла без goto?

"Всички науки са или физика, или колекциониране на пощенски марки." (Е. Ръдърфорд)
Отговор
в отговор на xp #16

Re: no goto?

> примерно изнасянето на пет реда код в отделна функция само и само за
>да се избегне goto

pri men 5 reda otivat kym gornata granica za metod. ot tam veche mirishe, che metoda pravi poveche ot edno neshto!

az sym myrzeliv i glupav i iskam da si cheta koda lesno! zabelqzvam, che defektite, koito imam nakraq sa znachitelno po-malko.

--
"Agile is a mindset, not a set of practices, rules, or tools."
Tom Poppendieck
Отговор
в отговор на Guru #17

при нормална работа - да!

мисля че случаито когато съм използвал гото, всички без един два са били за обработка на грешки. тогава се прекратяват тотално цикли микли и всякаква работа и се завръща до някаква по-предна точка където да речем се изискват нови данни или нещо такова.

Отговор
в отговор на Questor #18

тия са откачени

айде няма да питам дали на case слагат break, щото ще е заяждане. обаче като се замисля колко много неща правя с break, просто си мисля че много са утежнили живота на програмистите си. сигурен съм че всичко може да се напише и без тия оператори, ама за какъв чеп? това не само няма да намали бъговете, ами напротив - ще ги увеличи поради усложняване на алгоритмите с цел натъпкването им в светите канони.

Отговор
в отговор на Guru #19

да бе

ето ти елементарен пример:
N мерен масив (N > 1), искаш да го обходиш за да намериш елемент с определена стойност.

ако ми покажеш алгоритъм, който да е по-четлив от такъв с директно излизане от най-вътрешния цикъл, шапка ти свалям.

Отговор
в отговор на Плaмeн #20

Re: да бе

да не говорим за ония смахнатите, дето освен гото са забранили break и continue! разбира се може просто да се извърти пълния масив и номерата на индексите да се запишат. обаче е грозно и средно 2 пъти по-бавно.

Отговор