![]() |
![]() |
![]()
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. -------------------- |
|
|
![]() |
![]()
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.
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
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 |
|
|
![]()
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
|
|
|
![]()
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ć.
|
|
|
![]()
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.
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
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ć. 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 |
|
|
![]()
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.
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.
-------------------- 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! |
|
|
![]()
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 |
|
|
![]()
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. |
|
|
![]()
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
|
|
|
![]()
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.
|
|
|
![]()
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 |
|
|
![]()
Post
#14
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
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 ![]() |
|
|
![]()
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)
Ktoś zaproponował żeby robić to tak :
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 ![]() Ten post edytował ucho 6.01.2010, 12:58:00 |
|
|
![]()
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 -------------------- |
|
|
![]()
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:
- mogą łatwo zauważyć, że zastępując die goto da się wyświetlić błąd razem ze stopką ![]() 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: - 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 ![]() ![]() 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ć ![]() ![]() |
|
|
![]()
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? ![]() 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! |
|
|
![]()
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
![]() -------------------- XMPP: l0ud@chrome.pl
|
|
|
![]()
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.
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 14:38 |