Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> goto - opinie i przeżycia
adminik
post 5.01.2010, 21:39:24
Post #1





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 22.01.2008
Skąd: Tarnobrzeg

Ostrzeżenie: (0%)
-----


Co sądzicie o goto np. jako zamiennikowi dla niektórych pętli?
Co sądzicie o elastyczności tego rozwiązania?

Chciałbym poznać kilka opinii na ten temat.

Mi osobiście przypadło goto do gustu.


--------------------
 
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 19)
darko
post 5.01.2010, 21:44:35
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Unikaj jak ognia, tylko w ostateczności, jeśli wszystkie inne rozwiązania zawiodą (w php jeszcze mi się nie zdarzyło, żebym musiał skorzystać z goto). Etykiety i goto to raczej domena takich dinozaurów jak basic i pascal.


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
marcio
post 5.01.2010, 21:46:24
Post #3





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


No co ty w ogole mowisz etykiety i skoki to mozna w asm'ie uzywac albo w epoce pascal'a.

Po to masz petle itp zeby je uzywac przy skokach pogubic sie mozna.



--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
l0ud
post 5.01.2010, 21:47:24
Post #4





Grupa: Zarejestrowani
Postów: 1 387
Pomógł: 273
Dołączył: 18.02.2008

Ostrzeżenie: (0%)
-----


W językach programowania wyższego poziomu takiej instrukcji nie powinno się stosować. Nie chciałbym być na miejscu osoby, która później taki kod ma przeanalizować, debugować (masa skoków nie wiadomo gdzie i nie wiadomo z czym). Zwłaszcza, że nie wnosi niczego, czego nie dałoby się zrobić za pomocą innych instrukcji...


--------------------
XMPP: l0ud@chrome.pl
Go to the top of the page
+Quote Post
Pilsener
post 5.01.2010, 23:26:40
Post #5





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


A czy to nie działa przypadkiem tylko do przodu? Czy w obie strony? Znam to z podstaw VB, moim zdaniem może być niekiedy przydatne, a kiedy to już możemy sobie bajdurzyć. Zgodzę się w 100%, że nie należy w ten sposób budować pętli czy instrukcji warunkowych, ale np. rekurencja dla laików? Z goto czy bez każdy kod można totalnie spitolić.
Go to the top of the page
+Quote Post
darko
post 5.01.2010, 23:28:56
Post #6





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


goto skacze do danej etykiety, a gdzie ją umieścisz, to już zależy od Ciebie. Rekurencja dla laików powiadasz. Hmm...


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
marcio
post 5.01.2010, 23:59:15
Post #7





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Cytat(Pilsener @ 5.01.2010, 23:26:40 ) *
A czy to nie działa przypadkiem tylko do przodu? Czy w obie strony? Znam to z podstaw VB, moim zdaniem może być niekiedy przydatne, a kiedy to już możemy sobie bajdurzyć. Zgodzę się w 100%, że nie należy w ten sposób budować pętli czy instrukcji warunkowych, ale np. rekurencja dla laików? Z goto czy bez każdy kod można totalnie spitolić.



Cytat(darko @ 5.01.2010, 23:28:56 ) *
goto skacze do danej etykiety, a gdzie ją umieścisz, to już zależy od Ciebie. Rekurencja dla laików powiadasz. Hmm...


Nie zrozumialem ironi uzytkownika @Pilsener.Jaka to roznica z goto czy petle/warunki rekurencja to rekurencja, to tak jakbym powiedzial ze latwiej jest napisac system news'ow strukturalnie niz obiektowo to jest jeden kit.


No chyba ze sie myle to zwracam honor.



--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
XianN
post 6.01.2010, 06:21:42
Post #8





Grupa: Zarejestrowani
Postów: 57
Pomógł: 9
Dołączył: 12.11.2005
Skąd: ze wnowu?!

Ostrzeżenie: (0%)
-----


Zostaw goto w spokoju. W manualu PHP dosc obrazowo jest pokazane dlaczego. Jesli jednak nie przekonuje Cie to zbytnio daj jakis przyklad dla ktorego jest to najlepsze wyjscie, a przymkne na moment oko dla zasady 'goto jest zawsze zle' ;-)
Cytat
This is not a full unrestricted goto. The target label must be within the same file and context, meaning that you cannot jump out of a function or method, nor can you jump into one. You also cannot jump into any sort of loop or switch structure. You may jump out of these, and a common use is to use a goto in place of a multi-level break.

  1. for($i=0,$j=50; $i<100; $i++) {
  2. while($j--) {
  3. if($j==17) goto end;
  4. }
  5. }
  6. echo "i = $i";
  7. echo 'j hit 17';


I wszystko spoko, ale jeszcze na dlugo przed PHP 5.3 (od ktorego goto jest dostepne, nie wiem w ogole po co...) mozna to zapisac 'poprawniej' uzywajac opcjonalnego argumentu dla konstrukcji break, ktory mowi z ilu petli chcemy wyskoczyc.
Cytat
break accepts an optional numeric argument which tells it how many nested enclosing structures are to be broken out of.

  1. for($i=0,$j=50; $i<100; $i++) {
  2. while($j--) {
  3. if($j==17) {
  4. echo 'j hit 17';
  5. break 2;
  6. }
  7. }
  8. }


--------------------
Yes, sex is always the answer, it's never a question
Cos' the answers yes, oh the answers yes.
Not just a suggestion, if you ask the question
Then its always yes, yeah!
Go to the top of the page
+Quote Post
Zyx
post 6.01.2010, 08:20:11
Post #9





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


Jawna rekurencja to nienajciekawszy pomysł, ponieważ stos ma ograniczoną głębokość. Boli to zwłaszcza w PHP, gdzie możliwe jest zaledwie maksymalnie 100 zagnieżdżonych wywołań funkcji/metod. Istnieją sytuacje, w których goto jest jedynym w miarę sensownym sposobem pozbycia się rekurencji, np. gdy wywołanie znajduje się w pętli.

Kod
start_funkcji:
instrukcje
pętla()
{
   instrukcje

   // wywołanie rekurencyjne
   odloz_kontekst_na_wlasny_stos(kontekst);
   goto start_funkcji;
   powrot_z_funkcji:

   dalsze instrukcje
}

końcówka funkcji

// jeśli mamy nadrzędne wywołanie, wracamy do niego
kontekst = pobierz_kontekst_ze_stosu();
if(kontekst != null)
{
   rozpakuj_kontekst(kontekst);
   goto powrot_z_funkcji;
}


Niestety w PHP takie coś nie zadziała, ponieważ nie można wskakiwać do wnętrza pętli. Jednak jest to przykład kodu, kiedy z dwojga złego goto jest lepsze, bo alternatywna to stworzenie kilku wersji tej funkcji z powieloną większością kodu i na dokładkę napisanie algorytmu sterującego.


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
Cysiaczek
post 6.01.2010, 09:09:38
Post #10





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




@Zyx - czy w php.ini nie da się zwiększyć limit dla wywołań? Nie pamiętam teraz dobrze, ale chyba coś takiego widziałem. Było to bodajże podyktowane koniecznością ochrony systemu (pamięć, czas wykonania).

Pozdrawiam


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
thek
post 6.01.2010, 10:09:48
Post #11





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Instrukcja GOTO miała jedyny sens w przypadku zagnieżdżenia wielopoziomowego. I to naprawdę jedyna jego obecnie forma używania. Ewentualnie stare języki skryptowe.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
TheArt
post 6.01.2010, 11:37:20
Post #12





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 20.09.2007

Ostrzeżenie: (0%)
-----


Umiejętne stosowanie 'goto' jest bardzo przydatne.
Go to the top of the page
+Quote Post
Zyx
post 6.01.2010, 11:41:55
Post #13





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


Cysiaczek -> w czystym PHP nie ma. XDebug dodaje odpowiednią opcję (xdebug.max_nesting_level), ale tego się raczej na serwerach produkcyjnych nie instaluje.


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
phpion
post 6.01.2010, 12:15:55
Post #14





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(TheArt @ 6.01.2010, 11:37:20 ) *
Umiejętne stosowanie 'goto' jest bardzo przydatne.

Bez urazy, ale tak mocno uzasadnioną wypowiedź autora tych tematów:
- http://forum.php.pl/index.php?showtopic=139112
- http://forum.php.pl/index.php?showtopic=139058
raczej nie można traktować poważnie.

PS: goto jest zupełnie zbędne - jedynym jego plusem jest to, że wprowadzi jeszcze więcej bałaganu w kodach początkujących programistów (w końcu to nowość języka! trzeba być trendy!), a co za tym idzie "starzy wyjadacze" będą rozpoznawani po braku goto winksmiley.jpg
Go to the top of the page
+Quote Post
ucho
post 6.01.2010, 12:27:05
Post #15





Grupa: Zarejestrowani
Postów: 300
Pomógł: 32
Dołączył: 31.07.2006

Ostrzeżenie: (0%)
-----


Goto jest powszechnie stosowane w kernelu linuksowym. Z prostego powodu - nie ma żadnego RAII jak w c++ i konwencją jest skakanie do końca funkcji, gdzie znajduje się kod odpowiedzialny za zwalnianie zaalokowanej pamięci lub locków - nie da się po prostu użyć return. Ale po co to do PHP dodali nie mam pojęcia.

Edit:
Jeszcze przykład jak to mniej więcej tam wygląda (pseudokod)
  1. do A
  2. if (error)
  3. goto out_a;
  4. do B
  5. if (error)
  6. goto out_b;
  7. do C
  8. if (error)
  9. goto out_c;
  10. goto out;
  11. out_c:
  12. undo C
  13. out_b:
  14. undo B:
  15. out_a:
  16. undo A
  17. out:
  18. return ret;

Ktoś zaproponował żeby robić to tak :
  1. do A
  2. if (error) {
  3. cancel_a();
  4. return ret;
  5. }
  6. do B
  7. if (error) {
  8. cancel_b();
  9. cancel_a();
  10. return ret;
  11. }
  12. do C
  13. if (error) {
  14. cancel_c();
  15. cancel_b();
  16. cancel_a();
  17. return ret;
  18. }
  19. return ret;

To został prawie zlinczowany. Zresztą przy takiej wielkości projektu i braku namespace, już po kilka funkcji pomocniczych dla każdego kawałka kodu skończyło by się powstaniem nazw funkcji dłuższych niż te potworki z GTK smile.gif

Ten post edytował ucho 6.01.2010, 12:58:00
Go to the top of the page
+Quote Post
deirathe
post 6.01.2010, 12:37:59
Post #16





Grupa: Zarejestrowani
Postów: 426
Pomógł: 32
Dołączył: 24.05.2007

Ostrzeżenie: (0%)
-----


No tak, ale w phpie to raczej kernela pisac nie bedziesz...
Tak poza tym, poprawianie pozniej po kims kodu z intrukcjami goto to bedzie tragedia- juz lepiej odrazu z okna sobie skoczyc i zycie uproscic.
Goto w php jest totalnie zbedne, wprowadzi tylko wiecej zamieszania i pozwoli "programista" na tworzenie jescze wiekszego syfu z kodzie. Osobiscie jestem przeciwny

Ten post edytował deirathe 6.01.2010, 12:38:18


--------------------
Kawałek mojego blogu
Everything should be as simple as possible but not simpler.
A Einstein
Go to the top of the page
+Quote Post
Pilsener
post 6.01.2010, 13:18:20
Post #17





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


Obawiam się, że biorąc pod uwagę typowy sposób tworzenia stron przez ciała akademickie:
  1. echo $naglowek;
  2. echo $tresc;
  3. if($blad){die($blad);}
  4. echo $stopka;
- mogą łatwo zauważyć, że zastępując die goto da się wyświetlić błąd razem ze stopką biggrin.gif

Gdy akademicy dorwą się do goto i zaczną tego masowo używać do swoich machinacji możemy mieć trochę przegwizdane.

Na upartego można by tego użyć, gdy np. zachodzi konieczność zabicia kontrolera (krytyczny wyjątek) i przejścia do widoku, by pomijać określone fragmenty kodu ale tak naprawdę po co? Co zyskamy w zamian? Nawet stosując tradycyjną metodę obsługi błędów czy realizacji algorytmu zbudowanego na zasadzie drzewa:
  1. if(!$blad){$wykonaj = 'etap 1';}
  2. if(!$blad){$wykonaj = 'etap 1.1';}
  3. if(!$blad){$wykonaj = 'etap 1.2.';}
- uzyskujemy zapis wydajny a przede wszystkim czytelny, mamy też switch. By użyć goto trzeba by dodać do każdego warunku goto blad no i pojawia się kolejny problem, bo dochodzi rozmieszczanie etykiet, że już nie wspominając o czytelności czy kontroli nad kodem.

Jedyne sensowne zastosowanie tego potwora to cofanie się do jakiegoś kodu by go wykonać jeszcze raz, ale trudno mi wyobrazić sobie taką sytuację w praktyce, trzeba by projektować aplikację w zupełnie nowy sposób (pod goto), co pewnie mocno zirytowałoby całe środowisko programistów gdyby takie rozwiązania stały się popularne smile.gif Już widzę te publikacje typu nowoczesna obsługa sesji z wykorzystaniem goto biggrin.gif

Kedyś używałem goto w skryptach VB i z racji niskiego poziomu umiejętności przydawało się, gdy zaczynałem przygodę z PHP wydawało mi się, że będzie tego brakować smile.gif Kiedyś był tu taki temat "czego Wam brakuje w PHP" i napisałem tam, ze goto - doigrałem się, bo dodali, przepraszam Was za to blinksmiley.gif
Go to the top of the page
+Quote Post
erix
post 6.01.2010, 16:20:53
Post #18





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
- mogą łatwo zauważyć, że zastępując die goto da się wyświetlić błąd razem ze stopką

Hej, a nie po to wprowadzono wyjątki?

Cytat
Kiedyś był tu taki temat "czego Wam brakuje w PHP" i napisałem tam, ze goto - doigrałem się, bo dodali, przepraszam Was za to

Kto ma pasa? biggrin.gif

A teraz na serio - do tej pory nie mogę się nadziwić, po co wprowadzili goto. Naprawdę nie mogę tego pojąć - jakby nie było innych, WAŻNIEJSZYCH rzeczy do zaimplementowania...


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
l0ud
post 6.01.2010, 17:24:01
Post #19





Grupa: Zarejestrowani
Postów: 1 387
Pomógł: 273
Dołączył: 18.02.2008

Ostrzeżenie: (0%)
-----


Zdaje się, że chcieli po prostu uczynić kodowanie w PHP jeszcze prostszym dla bardzo początkujących programistów, którzy budują stronę tak jak to napisał Pilsener tongue.gif Ew. ktoś uznał, że łatwo to zaimplementować a może się przydać w jakichś skrajnych sytuacjach, gdzie trzeba coś zmienić w skrypcie na 5 minut...


--------------------
XMPP: l0ud@chrome.pl
Go to the top of the page
+Quote Post
Crozin
post 6.01.2010, 17:31:50
Post #20





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


@l0ud: IMO goto wcale nie jest dobre dla początkujących bo nagle program zaczyna skakać tam i z powrotem burząc prosty, liniowy przepływ kodu.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 14:38