2009-05-19, 02:29
  #13
Medlem
Banshee19s avatar
Citat:
Ursprungligen postat av Katalysator
Rimligare i goto-land kan vara att ha något i den här stilen:
Kod:
int SomeFunction()
{
    int retVal = FALSE;

    if (!func_A())
        goto A;

    if (!func_B())
        goto B;

    if (!func_C())
        goto C;

    retVal = TRUE;

C:
             undo_C();
B:
             undo_B();
A:
             undo_A();

    return retVal;
    
}

Varför då inte lika gärna

Kod:
int SomeFunction()
{
    int retVal = FALSE;

    if (!func_A())
        undo_A();

    if (!func_B())
       undo_B();

    retVal = TRUE;

    return retVal;
    
}

?
Citera
2009-05-19, 02:50
  #14
Medlem
Citat:
Ursprungligen postat av Banshee19
Varför då inte lika gärna

Kod:
int SomeFunction()
{
    int retVal = FALSE;

    if (!func_A())
        undo_A();

    if (!func_B())
       undo_B();

    retVal = TRUE;

    return retVal;
    
}

?
För att det där gör något helt annat. Idén är att ha en stack av funktioner och rulla tillbaka från rätt nivå, beroende på var det tar stopp. Notera ordningen på etiketterna: C, B, A -- omvänt gentemot anropen. Om allt går bra och vi kommer till raden retVal=TRUE, så kommer alla tre undo-funktioner anropas. Blir det fel på vägen hoppas retVal=TRUE över, retVal är fortfarande FALSE, och de funktioner som hunnit anropas kommer "ogöras".
Citera
2009-05-19, 03:37
  #15
Medlem
Banshee19s avatar
Citat:
Ursprungligen postat av Katalysator
För att det där gör något helt annat. Idén är att ha en stack av funktioner och rulla tillbaka från rätt nivå, beroende på var det tar stopp. Notera ordningen på etiketterna: C, B, A -- omvänt gentemot anropen. Om allt går bra och vi kommer till raden retVal=TRUE, så kommer alla tre undo-funktioner anropas. Blir det fel på vägen hoppas retVal=TRUE över, retVal är fortfarande FALSE, och de funktioner som hunnit anropas kommer "ogöras".

Ah, nu förstår jag. Tack så mycket!
Citera
2009-05-19, 09:05
  #16
Medlem
PerFnurts avatar
Det finns säkert tillfällen då goto är motiverat, åtminstone i teorin.

Jag har dock dagligen jobbat med C++ utveckling i ca 12 år utan att ha känt något större praktiskt behov av att skriva goto i koden.
Citera
2009-05-20, 22:04
  #17
Medlem
Citat:
Ursprungligen postat av Katalysator
Rimligare i goto-land kan vara att ha något i den här stilen:
Kod:
int SomeFunction()
{
	int retVal = FALSE;

	if (!func_A())
		goto A;

	if (!func_B())
		goto B;

	if (!func_C())
		goto C;

	retVal = TRUE;

C:
             undo_C();
B:
             undo_B();
A:
             undo_A();

	return retVal;
	
}

Nytt försökt att attackera goto:

Kod:
int SomeFunction()
{
	int retVal = FALSE;

	if (func_A()) {
		if (func_B()) {
			if (func_C()) {
				retVal = TRUE;
			}
             		undo_C();
		}
		undo_B();
	}
        undo_A();

	return retVal;	
}
Citera
2009-05-21, 01:19
  #18
Medlem
Citat:
Ursprungligen postat av Svavelblomma
Nytt försökt att attackera goto:

Kod:
int SomeFunction()
{
	int retVal = FALSE;

	if (func_A()) {
		if (func_B()) {
			if (func_C()) {
				retVal = TRUE;
			}
             		undo_C();
		}
		undo_B();
	}
        undo_A();

	return retVal;	
}

det är just för att slippa nästla för mycket som goto kan vara bra i det här fallet...
Citera
2009-05-21, 11:00
  #19
Medlem
slacker666s avatar
Citat:
Ursprungligen postat av Ergodyne
En lite fråga vad ni tycker om att använda goto när man skriver c++

Jag fick alltid lära mig att man aldrig aldrig aldrig ska använda goto när man skriver c eller framförallt c++. Men på senare tid har jag stött på kod som använder det ganska flitigt.

Förutom möjligtvis i något extremt udda specialfall så behöver man inte goto i C++. Felhantering och uppstädning av resurser sköter man medelst exceptions och dylikt. C, däremot, saknar ju exceptions och där finns det en del olika paradigmer man kan använda för uppstädning, varav att använda goto som en slags pseudo-exceptions är ganska vanlig (även om jag personligen inte är så förtjust i det.)
Citera
2009-05-23, 17:14
  #20
Medlem
GOTO är en dödssynd. Varenda vettig programmeringsbok avråder för att använda goto just pga av typen av buggar som kan uppstå.

Jag vågar säga att det inte finns något fall då man behöver använda goto.
Citera
2009-05-23, 18:29
  #21
Medlem
Weeblies avatar
Citat:
Ursprungligen postat av EvulTomteFar
GOTO är en dödssynd. Varenda vettig programmeringsbok avråder för att använda goto just pga av typen av buggar som kan uppstå.

Jag vågar säga att det inte finns något fall då man behöver använda goto.

De flesta erkänt bra programmeringsböckerna (som bland annat Code Complete) bannlyser inte användningen av goto utan endast föreslår att man söker en icke-goto lösning först. Huvudpoängen med dem flesta programmeringsstilarna är att göra det enklare för en att förstå sig på koden. Om det råkar vara goto som sköter det bäst för en viss situation... tja... då är det väl rimligt att man använder goto också?

Ta Katalysator's exempel och lägg på kraven att undo_X() är kodsnuttar som läser/skriver från lokala variablar och inte funktionsanrop, så att man inte enkelt kan fixa runt det hela med hjälp av funktionspekare och object som anropar funktionspekarna vid destruktion.

Försök att skriva om det utan gotos. Nestlade if-satser? Jag tror nog att dem flesta skulle klassa det som mycket svårläsligare. State variabel? Möjligt, men känns som svårt att ändra i koden (när man vill lägga till en func_D/undo_D mitt i).

Eller, exempel där man ska bryta sig ut ur nestlade loopar?

[php]
while(test_A())
{
while(test_B())
{
while(test_C())
{
if(test_D())
goto EXIT_LOOP;
}
}
}
EXIT_LOOP:

[/php]

Det går alltid att skriva goto-fri kod. Men det går inte alltid att skriva goto-fri kod som är lika enkel att förstå och/eller är lika effektiv (det senare är i 99,9999% av fallen helt irrelevant då denna lilla skillnad i prestanda inte eftersökes). Anti-goto fanatiker skulle jag nog vilja placera ungefär i samma grupp som allt-måste-skriva-i-OO-stil fanatiker.

Ibland är den enklaste lösningen helt enkelt bäst.
Citera
2009-05-26, 22:23
  #22
Medlem
Curiks avatar
Smaksak. Det mest kända argumentet är ju att koden är svårare att följa än loopar och rekursiva funktioner. I det senare exemplet slipper du funktionsanropet (om inte funktionen är inlinad) om du istället använder GOTO, vilket kan spela roll om du anropar funktionen ofta.

Personligen använder jag det sparsamt.
Citera
2009-05-29, 02:02
  #23
Medlem
Men om man har extremt nästlad kod, typ 4 for-lopar eller så. Kan det inte var smidigt med goto då, om man vill bryta mitt i koden.
Citera
2009-05-29, 08:59
  #24
Medlem
micaeles avatar
Citat:
Ursprungligen postat av 51mon
Men om man har extremt nästlad kod, typ 4 for-lopar eller så. Kan det inte var smidigt med goto då, om man vill bryta mitt i koden.
Jo, självfallet. Undantag som bekräftar regeln.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in