2012-10-28, 09:24
  #37
Medlem
MeanMEs avatar
En av de största orsakerna är nog också att på den tiden man höll på och dokumenterade all kod i flödes-scheman så totalhavererade goto statements dessa scheman. Därför tror jag det till en viss del var en administrativ och akademisk reform att porta goto förutom att försöka förhindra spagettikod.

Jag började som så många andra med assembler, basic och BLS-Pascal och då användes goto flitigt pga att alternativ saknades, koden var iofs inte så svår att följa mycket pga att den datorn vi hade var en Nascom 1:a och med maxgräns på 64k kod så klarar man inte av att fubar'a koden i tillräckligt hög grad på de språken om programmet skulle göra ngt vettigt.

Största problemet då vill jag minnas var lagringen av koden, då kassetbanden var så kassa lol. Stora strider om hurvida BASF eller TDK skulle användas och testresultaten i olika tidningar studerades flitigt.

Fy fasiken...
Citera
2012-10-28, 12:23
  #38
Medlem
I C++ borde du för det mesta kunna slippa använda goto, på grund av RAII. Du slipper till och med avallokera minne (med std::unique_ptr).

Ett fall där man har ett funktionsflöde där varje operation kräver en egen clean-up funktion kan ju ganska enkelt lösas genom RAII

[PHP]
class op
{
public:
op(std::function<bool()> operation, std::function<void()> clean_up) : operation(operation), clean_up(clean_up), successful(false)
{ }

~op()
{
if(!successful)
{
clean_up();
throw std::runtime_error("shit_happened");
}
}

void run()
{
if(operation())
successful = true;
}

private:
std::function<bool()> operation;
std::function<void()> clean_up;
bool successful;
};
[/PHP]

Har du tre sådana operationer kan du pusha dem i en std::vector och ha en try-catch run omkring. Alternativt kan du skriva en generisk funktion som även berättar vilken av operationerna som failade osv. Med templates kan du nog få den att godta godtyckliga funktioner också.

[PHP]
std::vector<op> operations;
operations.push_back(&AllocMemory, &CleanupMemory);
operations.push_back(&Transmogrify, &Unmogrify);
operations.push_back(&Waah, &Wuuuh);

try
{
for(auto o in operations)
o.run();
}
catch(const std::runtime_exception &e)
{

}
[/PHP]

alternativt:

[PHP]
auto failed_id = run_all(op(&AllocMemory, &CleanupMemory),
op(&Transmogrify, &Unmogrify),
op(&Waah, &Wuuh));
[/PHP]
Citera
2012-10-28, 13:22
  #39
Medlem
cyberrascal
Det är "strikt förbjudet" att kasta ett undantag i en destruktor. Du ska inte under några omständigheter göra det även om kompilatorn kanske godkänner det :-)
__________________
Senast redigerad av trellen 2012-10-28 kl. 13:24.
Citera
2012-10-28, 14:36
  #40
Medlem
Ouch trellen, tankevurpa skyller på att jag skrev koden direkt på flashback..

Men inget stort problem.. blir lite mer infrastruktur i run_all men går åtminstone att lösa generiskt..
Citera
2012-10-28, 17:43
  #41
Medlem
Citat:
Ursprungligen postat av 770310
Att börja med att fundera på om det skulle passa bättre i en funktion, kan väl inte vara fel. Ett annat sätt, om hejhopp är enkelt (och kan faila fler gånger än en):
Jag kan väl dock inte vara ensam om att tycka att de där lösningarna är mer svårlästa än goto?

Dessutom bör det väl resultera i fler jämförelser även efter att kompilatorn har gjort sitt? Har man fyra nästlade loopar så finns det väl viss risk att det drar ganska mycket prestanda.
Citera
2012-10-28, 17:46
  #42
Medlem
Citat:
Ursprungligen postat av Obeskrivlig
Jag kan väl dock inte vara ensam om att tycka att de där lösningarna är mer svårlästa än goto?

Nej.

Citat:
Ursprungligen postat av Obeskrivlig
Dessutom bör det väl resultera i fler jämförelser även efter att kompilatorn har gjort sitt? Har man fyra nästlade loopar så finns det väl viss risk att det drar ganska mycket prestanda.

Ja.
Citera
2012-10-31, 18:39
  #43
Medlem
Citat:
Ursprungligen postat av Obeskrivlig
Java, som saknar goto, har break med label så att man kan bryta sig ur flera loopar. I praktiken inte bättre än en goto använd på samma sätt. Ser då ut på det här viset:
Kod:
label: while(tjosan)
          while(hejsan)
            while(nejdu)
              if(hejhopp)
                break label;

Jag undrar dock vad alternativet är. Att sätta de inre looparna i en funktion och använda return?

Om vi skulle komma på någon som använder labels på företaget, så skulle vi stena honom till döds och slänga liket på tunnelbanan

Jag använde GOTO rätt flitigt när jag för länge sedan lekte med C++, men jag har aldrig känt ett behov av det i Java.

Klart att man kan komma in i legacy-kod där man inte har annat alternativ än att försöka forma bajskorven, men utifrån ett "optimalt" perspektiv så borde all ny kod kunna klara sig utan GOTO?
Citera
2012-11-01, 09:34
  #44
Medlem
klurigklurings avatar
Lättgjord men inte ovanlig dödsbugg med GOTO

Så gott som alla programmeringsspråk är någorlunda strukturerade och man kan dela upp i koden i sektioner, paragrafer, funktioner och liknande. Kompilatorn skapar alltid en start och slutadress för dessa programinterna enheter.

Petar man in en GOTO från en avgränsad kodsnutt och hoppar till en annan får runtime programmet fnatt då programmet tappar sina egna interna adresser och resten av exekveringen genomförs på ett helt oförutsägbart sätt.

Jag har jobbat en hel del med metodutveckling, och har alltid förespråkat TS linje. Kan man skriva snyggare (läs mera underhållsvänlig) kod med hjälp av GOTO ska man inte tvingas avstå. Nästlade IF ELSE spetsat med AND, OR och NOT som täcker en 1/2 A 4 (som inte ens kodförfattaren klarar ut efter ett halvår), dåligt strukturerade nästlade loopar eller program vars flöde styrs med hjälp av programmerarens egendefinierade switchar är en långt värre mardröm att underhålla än att hitta en och annan felanvänd GOTO.

Det finns många fördelar med GOTO fri programmering men ska inte göras till religion.
__________________
Senast redigerad av klurigkluring 2012-11-01 kl. 09:37.
Citera
2012-11-01, 23:09
  #45
Medlem
MeanMEs avatar
@klurigkluring

Jag fullkomligt avskyr det, får nog ompröva min ateistiska hållning då lol.
På samma sätt som blodpudding och rullströmming endast kommer över mina läppar i händelse av att de förhindrar svältdöd kommer goto (nästan) aldrig över mitt tangentbord.
Citera
2012-11-02, 08:45
  #46
Medlem
klurigklurings avatar
Citat:
Ursprungligen postat av MeanME
@klurigkluring

Jag fullkomligt avskyr det, får nog ompröva min ateistiska hållning då lol.
På samma sätt som blodpudding och rullströmming endast kommer över mina läppar i händelse av att de förhindrar svältdöd kommer goto (nästan) aldrig över mitt tangentbord.
Instämmer om blodpudding och fiskbullar, rullströming går an. Att GOTO eller inte GOTO, det är frågan. Det går i regel att klara sig bra utan i alla moderna språk och i senare dialekter av gamla språk. Man behöver inte skriva äckligt nästlade IF och annan ful kod för det.
Citat:
Ursprungligen postat av MeanME
En av de största orsakerna är nog också att på den tiden man höll på och dokumenterade all kod i flödes-scheman så totalhavererade goto statements dessa scheman.
Översiktliga flödesscheman är bra dokumentation. På statement nivå är det förkastligt. Värsta exemplaret som jag har sett har man kristrat ihop ett antal A 3 ark. Sen gick det varken att följa schemat eller koden som producerats efter den.
Citera
2012-11-02, 10:23
  #47
Medlem
Läste en kurs i c++ en gång och i kurskompendiet och på provet stod : OBS GOTO-satsen får INTE användas!!
Citera
2012-11-03, 01:42
  #48
Medlem
Citat:
Ursprungligen postat av klurigkluring
Petar man in en GOTO från en avgränsad kodsnutt och hoppar till en annan får runtime programmet fnatt då programmet tappar sina egna interna adresser och resten av exekveringen genomförs på ett helt oförutsägbart sätt.
Jag förstår inte riktigt hur du menar här. Om du skulle kunna ge ett exempel på kod som ballar ur skulle jag vara tacksam.
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