Trädvy Permalänk
Medlem
Plats
Lund
Registrerad
Mar 2002

Tankar om "goto" i PHP?

PHP 5.3.0 är nu släppt och introducerar nu goto.
Själv har jag inte programmerat något som använder sig av goto sen Qbasic för många herrans år sen så det vore lite intressant vad ni har för åsikter om goto?

Tycker ni det är användbart och ett bra tillägg till PHP / annat språk eller ska det undvikas helt och hållet?

http://php.net/releases/5_3_0.php
http://se.php.net/goto

"Knowledge amplification. What he learns, we all learn. What he knows, we all benefit from."

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Maj 2007

Jag tycker det ska undvikas helt och hållet.

Låt vara att PHP anpassar sig väldigt bra för små projekt, med ett procedurellt utvecklat system - men om man sysslar med PHP "på riktigt" ska man inte ens komma i närheten av att använda 'goto'. Objektorientering är motsatsen till 'goto'-programmering.

Enda användningsområdet jag faktiskt kan se att 'goto' används är med CLI-program i PHP, men frågan är om det ens då är berättigat...

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Citat:

Ursprungligen inskrivet av bjornie
Objektorientering är motsatsen till 'goto'-programmering.

Mycket kan sägas om goto-bruk, men motsatsen till objektorientering är det väl ändå inte? Så länge det finns algoritmer finns det utrymme för goto. Oavsett hur programmet i övrigt är strukturerat.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Maj 2007

Ja, motsats var kanske fel ord. Snarare att 'goto' blir överflödigt vid objektorienterad programmering. Jag kan faktiskt inte komma på ett enda tillfälle i OOP där 'goto' skulle kunna tänkas användas (framför någon annan lösning) - har du något exempel?

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jan 2004

De flesta är väl överens om att GOTO bör undvikas. Men att möjligheten *finns* tycker jag är bra.

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Citat:

Ursprungligen inskrivet av bjornie
Jag kan faktiskt inte komma på ett enda tillfälle i OOP där 'goto' skulle kunna tänkas användas (framför någon annan lösning) - har du något exempel?

Inte direkt, men serien fångade det väl ganska bra; om man har en sund design från början kommer man förmodligen aldrig på tanken att använda goto, men om man måste införa nya, oförutsedda, beteenden kan det stå mellan att strukturera om stora mängder kod eller att använda "goto". Vidare tycker jag fortfarande att just objektorientering spelar rätt liten roll i frågan; visst finns det språk där goto-liknande konstruktioner är betydligt vanligare (assembler till exempel) och visst kan det tänkas att dessa sällan används för objekorienterad programmering, men jag vet inte om man kan dra några slutsatser av detta.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Maj 2007

Visst har objektorientering en roll i frågan, då 'goto' bryter OOP-konceptet i sig. Jag talar inte från alla OOP-språks design, men Java - som jag håller ganska nära hjärtat - har till och med reserverat nyckelordet 'goto' - men valt att inte införa funktionalitet till nyckelordet. I objektorienterade och funktionella språk använder man metoder eller funktioner för att uppnå vad 'goto' gör i procedurella språk (och resulterar ofta i spaghettikod). Så visst tycker jag att typen av språk spelar roll. Nu är ju PHP ett procedurellt språk, men att fr.o.m version 5.3 "uppmuntra" till användning av 'goto' tycker jag är märkligt - hade det varit en del av språket från början hade jag inte stört mig lika mycket på att det finns tillgängligt i språket.

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Citat:

Ursprungligen inskrivet av bjornie
Visst har objektorientering en roll i frågan, då 'goto' bryter OOP-konceptet i sig. Jag talar inte från alla OOP-språks design, men Java - som jag håller ganska nära hjärtat - har till och med reserverat nyckelordet 'goto' - men valt att inte införa funktionalitet till nyckelordet.

Men att de har valt att göra så är beror väl mest på att goto har fått så dåligt rykte, inte att det skulle fungera dåligt.

Citat:

Ursprungligen inskrivet av bjornie
I objektorienterade och funktionella språk använder man metoder eller funktioner för att uppnå vad 'goto' gör i procedurella språk (och resulterar ofta i spaghettikod). Så visst tycker jag att typen av språk spelar roll.

Det är sant att de flesta moderna (och objektorienterade) språk tillhandahåller konstruktioner (funktioner, for, while och liknande) som med fördel kan användas istället för goto, men dessa fungerar lika bra i språk som ej är objektorienterade (tänk på c till exempel).

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Maj 2007
Citat:

Ursprungligen inskrivet av Elgot
Men att de har valt att göra så är beror väl mest på att goto har fått så dåligt rykte, inte att det skulle fungera dåligt.

Jag skulle gissa på att de från början hade intentioner på att faktiskt implementera goto, men strax därefter inse att goto är av ondo och därför låsa nyckelordet. Förhoppningsvis hade dom inte ens intentioner på att implementera det.

Citat:

Ursprungligen inskrivet av Elgot
Det är sant att de flesta moderna (och objektorienterade) språk tillhandahåller konstruktioner (funktioner, for, while och liknande) som med fördel kan användas istället för goto, men dessa fungerar lika bra i språk som ej är objektorienterade (tänk på c till exempel).

Ja, jag har funderat på om jag ska ta upp C eller inte, som exempel. För mig känns det som att de införde goto enbart av traditionella skäl, då det användes i många andra språk, men nu för tiden försöker man få bort programmerare från att använda det. F.ö. är det ett mysterium för mig att man valde att implementera det i VB.NET?! Men det var en annan fråga.

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Citat:

Ursprungligen inskrivet av bjornie
Ja, jag har funderat på om jag ska ta upp C eller inte, som exempel.

Om du kan använda c som ett exempel på att man måste programmera objektorienterat för att undvika goto eller att objektorientering förhindrar goto så är jag intresserad. Sätt igång.

Citat:

Ursprungligen inskrivet av bjornie
För mig känns det som att de införde goto enbart av traditionella skäl, då det användes i många andra språk, men nu för tiden försöker man få bort programmerare från att använda det. F.ö. är det ett mysterium för mig att man valde att implementera det i VB.NET?! Men det var en annan fråga.

Frågan är då om det verkligen är bra att försöka påverka folk att programmera på ett visst sätt genom att medvetet begränsa språken. Visst anses goto fult numera, men det behöver inte innebära att det inte finns situationer då det kan vara försvarbart att använda det.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jan 2007
Citat:

Ursprungligen inskrivet av Elgot
Visst anses goto fult numera, men det behöver inte innebära att det inte finns situationer då det kan vara försvarbart att använda det.

Precis. I just PHP skulle det ju kanske vara någorlunda vettigt att ha nån sån här konstruktion:

<!doctype html> <?php /* En massa saker */ if($felkod) goto a; /* Fler saker */ if($mysqlfel) goto b; /* Mer */ goto success; a: ?> <!-- Informera användaren om fel A --> <?php goto end; b: ?> <!-- Informera användaren om fel B --> <?php goto end; success: ?> <!-- Informera användaren om att operationen lyckades --> <?php end: ?> <!-- Skriv ut sidfot eller liknande -->

Jag skulle troligtvis gjort på ett annat sätt, men detta kan som sagt vara vettigt.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Maj 2007
Citat:

Ursprungligen inskrivet av Elgot
Om du kan använda c som ett exempel på att man måste programmera objektorienterat för att undvika goto eller att objektorientering förhindrar goto så är jag intresserad. Sätt igång.

Eh, det var absolut inte vad jag menade när jag skulle ta det som exempel, utan det jag skrev - att dom från början designade språket med goto, men frågan är om dom skulle gjort det idag? Därför tycker jag att det är märkligt att gänget bakom PHP väljer att införa det i en sån sen version.

Citat:

Ursprungligen inskrivet av Elgot
Frågan är då om det verkligen är bra att försöka påverka folk att programmera på ett visst sätt genom att medvetet begränsa språken. Visst anses goto fult numera, men det behöver inte innebära att det inte finns situationer då det kan vara försvarbart att använda det.

Begränsningar finns i alla språk, och kommer alltid att finnas. Men jag håller med dig såklart, det är är svårt att veta var man ska dra linjen i vissa avseenden. Som i det här fallet. Min personliga åsikt är att dom inte skulle ha implementerat det. Hade det kommit i en tidig version av PHP så skulle det ha varit mer försvarbart.

Citat:

Ursprungligen inskrivet av You
Precis. I just PHP skulle det ju kanske vara någorlunda vettigt att ha nån sån här konstruktion:

Visst finns det utrymme för att använda goto på ett vettigt sätt, det säger jag inte. Däremot finns det, som du själv säger, sätt att lösa det på ett snyggare sätt. Därför är ju frågan om det är försvarbart att införa goto i PHP 5.3? Enligt mig är det inte det, eftersom att språket redan har kontrollstrukturer som kan sköta samma situation på ett minst lika bra sätt.

Måste jag verkligen försvara mig när det gäller goto? Tycker ni (Elgot/You) att PHP-crew gjorde rätt val att ha en implementation av goto?

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jan 2007
Citat:

Ursprungligen inskrivet av bjornie
Tycker ni (Elgot/You) att PHP-crew gjorde rätt val att ha en implementation av goto?

Bryr mig ärligt talat inte alls, tycker PHP är ett rörigt, smått otrevligt språk och använder hellre annat, men när jag använder PHP kommer jag ändå fortsätta med den stil jag redan har (dvs inte använda goto). Reagerade mer på att folk är så starkt emot goto på grund av dess historia, utan att egentligen gå in på vad som är objektivt bra och dåligt med det.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Maj 2007
Citat:

Ursprungligen inskrivet av You
Bryr mig ärligt talat inte alls, tycker PHP är ett rörigt, smått otrevligt språk och använder hellre annat, men när jag använder PHP kommer jag ändå fortsätta med den stil jag redan har (dvs inte använda goto).

Jag använder hellre också annat, men man måste även anpassa sig efter vad man får betalt för att utveckla i. Jag motsätter mig att man inför goto i en så sen version, då det redan finns kontrollstrukturer som man får bättre överblick och lättare kan manipulera...

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jan 2004
Citat:

Ursprungligen inskrivet av bjornie
Visst har objektorientering en roll i frågan, då 'goto' bryter OOP-konceptet i sig. Jag talar inte från alla OOP-språks design, men Java - som jag håller ganska nära hjärtat - har till och med reserverat nyckelordet 'goto' - men valt att inte införa funktionalitet till nyckelordet.

I Java bytecode finns dock goto så om man skulle implementera ett annat språk som kompilerar till JVM-bytecode eller JVM-ASM så skulle man kunna stoppa in goto.

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Citat:

Ursprungligen inskrivet av iXam
I Java bytecode finns dock goto så om man skulle implementera ett annat språk som kompilerar till JVM-bytecode eller JVM-ASM så skulle man kunna stoppa in goto.

Möjligheten att hoppa dit man vill i koden är väl egentligen både intuitiv och effektiv, och även andra typer av mera maskinnära kod består till stora delar av hopp. Dessa är dock sällan avsedda att läsas av annat än just maskiner.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Nov 2003

Jag tycker det är bra. Jag har saknat Goto. Nu behövs bara REM så är jag helt nöjd med PHP!

Mvh Stefan -
Hamburgare är kärlek!
Receptologi är livet!

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007

.. och LOAD-kommandot från Commodore-eran. Sen behöver de bara implementera inline assembler så är PHP helt komplett!

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Registrerad
Dec 2004
Citat:

Ursprungligen inskrivet av bjornie
Visst har objektorientering en roll i frågan, då 'goto' bryter OOP-konceptet i sig. Jag talar inte från alla OOP-språks design, men Java - som jag håller ganska nära hjärtat - har till och med reserverat nyckelordet 'goto' - men valt att inte införa funktionalitet till nyckelordet. I objektorienterade och funktionella språk använder man metoder eller funktioner för att uppnå vad 'goto' gör i procedurella språk (och resulterar ofta i spaghettikod). Så visst tycker jag att typen av språk spelar roll. Nu är ju PHP ett procedurellt språk, men att fr.o.m version 5.3 "uppmuntra" till användning av 'goto' tycker jag är märkligt - hade det varit en del av språket från början hade jag inte stört mig lika mycket på att det finns tillgängligt i språket.

Goto idag används (professionellt) till den största delen för väldigt specifika syften som att simulera multi-djup breaks (i.e. ungefär som named breaks) och try-catch-finally block. Dock så är det inte fullt så vanligt att sådant dyker upp i just PHP.

OOP är en bra paradigm men i grund och botten skriver man (oftast) kod för att det ska vara lättläst och lätthanterligt. Överdriven användning av OOP, för att i princip förvandla ett proceduellt språk till ett funktionellt, har oftast motsatt effekt.

Kod av kraftigt algoritmisk natur, t.e.x. KMP för strängmatchning, är mer eller mindre idiotiskt att implementera OOP-mässigt. Men å andra sidan så behövs goto väldigt sällan i sådan kod också...

"Nothing is impossible because impossible itself says I M Possible..."

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2004

Jag har alltid sett PHP som ett så pass "lortigt" scriptspråk att goto bara fortsätter att fullända den bilden. Det är ett nyckelord som är väldigt användbart för hobbyisterna men som förstör för struktur och öpnnar upp för oinformerade missbruk av ytterligare en av PHPs alla features. Tänk er en stor PHP-applikation av ett stort antal medelmåttiga PHP-utvecklare som inte innan bestämt sig för en struktur... det är ingen inbjudande tanke! Blanda sedan in goto och du har något som aldrig går att refaktorisera

Trädvy Permalänk
Hedersmedlem
Plats
Stockholm
Registrerad
Dec 2002

Jag ser en viss användning av goto i C (exempelvis som här: http://www.netbsd.org/docs/guide/en/chap-pam.html#pam-sample-...), men inte i PHP då det sköter minneshantering automatiskt, inte speciellt ofta man måste rensa upp saker innan man avslutar en funktion.

Så njae, ser inget direkt behov av det i PHP.

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.