Warsztat - Programowanie gier

Wrzesień 03, 2010, 03:19:58 *
Witamy, Gość. Zaloguj się, lub zarejestruj proszę.

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Aktualności: Warsztat, Regulamin forum, #warsztat, Wiki, FAQ, NoPaste, Mapa
 
   Strona główna   Pomoc Szukaj Zaloguj się Rejestracja  
Strony: [1] 2 3
  Drukuj  
Autor Wątek: Co tam panie z tym break'iem?  (Przeczytany 4429 razy)
Korialtrash
Sr. Member
****

wiadomości: 437


Tribe Warlord


Zobacz profil WWW
« : Czerwiec 23, 2008, 15:19:13 »

W ostatniej klasie liceum zmienił się nauczyciel informatyki. Odetchnąłem z ulgą, bo zamiast robić formatowanie w Wordzie, od pierwszej lekcji zaczęła się ostra jazda (topologie sieci, itp.), zahaczając nawet o takie rzeczy jak implementacja algorytmów genetycznych (!)
No, ale do rzeczy:
siedzę przed komputerem i klepię w Dev-CPP (bo VisualExpressa nie pozwalają nam zainstalować). Pani profesor zagląda mi przez ramię.
 - Piotrek, dlaczego używasz break'ów w pętli?
Popatrzyłem się zaskoczony. Prof. słynie z tego, że podpuszcza uczniów więc ostrożnie zapytałem:
 - Co innego mógłbym zrobić?
 - Inaczej skonstruować warunek w while'u.
To mnie zastanowiło, ale postanowiłem zabrnąć dalej:
 - Dlaczego miałbym tego nie używać?
 - A dlaczego nie używasz etykiet?
 - Bo to nieprofesjonalne.
 - Tak jak i break'i.
Tutaj pani profesor odeszła, zostawiając mnie osłupiałego. W chwilę później zadzwonił dzwonek i nie wróciłem już do tego tematu, ale ostatnio zaczęło mnie to prześladować:

czy break w pętli jest równie niewskazany jak etykieta?

Zastanowiła mnie jeszcze jedna rzecz:
dlaczego niektórzy piszą for( ; ; ) zamiast while(true)?
Zapisane

Jak to ktoś mądry inaczej kiedyś w imieniu MS powiedział z absolutną powagą, ".NET jest środowiskiem wieloplatformowym - działa przecież na wszystkich sześciu odmianach Visty".
Gravell
Full Member
***

wiadomości: 194



Zobacz profil WWW
« Odpowiedz #1 : Czerwiec 23, 2008, 15:23:21 »

Zastanowiła mnie jeszcze jedna rzecz:
dlaczego niektórzy piszą for( ; ; ) zamiast while(true)?

Bo gdy się chce zrobić coś określona ilość razy pisze się pętlę for,a gdy nie wie się ile razy ma się ona wykonać to jakoś tak odruchowo zmienia się na for( ; ; ). Przynajmniej ja tak mam Cheesy.

A co do breaków - wg mnie są one na pewno dużo bardziej wskazane niż etykiety. W ogóle pierwszy raz spotykam się z pojęciem "niewskazanego break'a".

Pozdro Wink.
« Ostatnia zmiana: Czerwiec 23, 2008, 15:25:08 wysłane przez Gravell » Zapisane

Shakes&Fidget
Toouudi! Gdzie są moje ogry?!?
Teyan
teyan.co.cc
counterClockWise
Hero Member
*****

wiadomości: 804



Zobacz profil
« Odpowiedz #2 : Czerwiec 23, 2008, 15:28:06 »

Cytuj
- A dlaczego nie używasz etykiet?
 - Bo to nieprofesjonalne.
 - Tak jak i break'i.
Tutaj pani profesor odeszła, zostawiając mnie osłupiałego. W chwilę później zadzwonił dzwonek i nie wróciłem już do tego tematu, ale ostatnio zaczęło mnie to prześladować:

czy break w pętli jest równie niewskazany jak etykieta?

Moim zdaniem to nauczycielka się czepia, bo taką ma pracę albo jest zła, że nie klepię komercyjnych programów tylko uczy w szkolę (chociaż wątpię w to, że poświęca się tylko nauczaniu).

Ja tam używam breaków w pętli, (może jestem nieprofesjonalny Cheesy) i nie widzę w tym nic złego.
W ogóle to niech ktoś poda właściwsze miejsce dla break'a od pętli Smiley Przecież został wymyślony, aby wychodzić z bloków switch lub pętli.
Zapisane
therealremi
Gość
« Odpowiedz #3 : Czerwiec 23, 2008, 15:30:19 »

Podejrzewam ze post Gravella jest jednoczesnie odpowiedzia na to pytanie: prawdopodobnie break nie byl potrzebny w tym przypadku - bardziej czytelne byloby inne skonstruowanie warunku while. Czytelniejsze jest miec wszystkie warunki wyjscia w jednym miejscu niz stado if-ow i break-ow w roznych miejscach.
Zapisane
Anton Chigurh
Full Member
***

wiadomości: 151



Zobacz profil
« Odpowiedz #4 : Czerwiec 23, 2008, 15:35:15 »

Breaków należy unikać jeśli tylko się da, a w wielu przypadkach tak właśnie jest. Jednak chyba jedyną przemawiającą za tym przesłanką jest czytelność kodu. Warto się 3 razy zastanowić przed wstawieniem break'a, ale ja bym nie przesadzał. Jeśli chodzi o etykiety, to one robią bigos we flow-ie programu i są do szpiku kości ZŁE, chyba, że konstruuje się asm-o / BASIC-o podobny kod i w ogóle nie używa zwykłych konstrukcji, ale wtedy użycie c++/javy/c# podchodzi pod pomyłkę.

co do pętli while(true) imo też są dość nieeleganckie i też rczej bym ich unikał. Znów - w bardzo wielu przypadkach da się tego uniknąć no i patrząc na kod - od razu wiesz, kiedy wyskakujesz z pętli, zamiast szukać nie wiadomo gdzie i nie wiadomo ilu breaków. Ale też i tutaj nie należy przesadzać i kierować isę zdrowym rozsądkiem.

Innymi słowy jeśli używasz pętli to powinieneś robić t zgodnie z jej zastosowaniem. W innym przypadku możesz skończyć w sytuacji analogicznej do mieszania kleju do glazury przy pomocy śrubokrętu.

Są też kontrowersyjne zastosowania pętli, nieistniejące bez break'ów, takie jak np. "do-while-false", ale ich "czystość" czy "słuszność" uważam za bardzo dyskusyjną.

PS. mnie kiedyś w liceum pani skrzyczała za "repeat (...) until (3 = 1)". Ale przy ograniczeniu do 45 lub 90 minut oczekiwanie od kogoś czystego kodu jest nonsensem również sprzecznym z niejedną regułą programowania.
Zapisane

postęp niniejszgo paska postępu : [|||||--------------]
counterClockWise
Hero Member
*****

wiadomości: 804



Zobacz profil
« Odpowiedz #5 : Czerwiec 23, 2008, 15:41:12 »

Breaków należy unikać jeśli tylko się da, a w wielu przypadkach tak właśnie jest. Jednak chyba jedyną przemawiającą za tym przesłanką jest czytelność kodu. Warto się 3 razy zastanowić przed wstawieniem break'a, ale ja bym nie przesadzał. Jeśli chodzi o etykiety, to one robią bigos we flow-ie programu i są do szpiku kości ZŁE, chyba, że konstruuje się asm-o / BASIC-o podobny kod i w ogóle nie używa zwykłych konstrukcji, ale wtedy użycie c++/javy/c# podchodzi pod pomyłkę.

co do pętli while(true) imo też są dość nieeleganckie i też rczej bym ich unikał. Znów - w bardzo wielu przypadkach da się tego uniknąć no i patrząc na kod - od razu wiesz, kiedy wyskakujesz z pętli, zamiast szukać nie wiadomo gdzie i nie wiadomo ilu breaków. Ale też i tutaj nie należy przesadzać i kierować isę zdrowym rozsądkiem.

Innymi słowy jeśli używasz pętli to powinieneś robić t zgodnie z jej zastosowaniem. W innym przypadku możesz skończyć w sytuacji analogicznej do mieszania kleju do glazury przy pomocy śrubokrętu.

Są też kontrowersyjne zastosowania pętli, nieistniejące bez break'ów, takie jak np. "do-while-false", ale ich "czystość" czy "słuszność" uważam za bardzo dyskusyjną.

PS. mnie kiedyś w liceum pani skrzyczała za "repeat (...) until (3 = 1)". Ale przy ograniczeniu do 45 lub 90 minut oczekiwanie od kogoś czystego kodu jest nonsensem również sprzecznym z niejedną regułą programowania.

Dlaczego uważasz, że breaków należy unikać kiedy tylko się da?
Nie zapędzajmy się daleko - bo zawsze da się uniknać - zawsze można obudować funkcjonalność pętli w funkcję i zwracać cały interesujący nas stan zamiast przerywać break'iem.

A moim zdaniem breaków się powinno unikać tylko jeśli jesteśmy w stanie wyznaczyć ile razy ma się wykonać pętla - wtedy break to bład, owszem.
No i w przypadku nieskończonych pętli też jest brzydki (bo nieskończone pętle same w sobie ładne nie są - są trochę błędogenne nienaturalne, nie wynikają z żadnego problemu z natury), ale gdy przeszukujemy liniowo jakąś tablicę po pierwszy element spełniający zadane kryterium, a następnie chcemy coś dalej z tym elementem robić to czemu nie?
« Ostatnia zmiana: Czerwiec 23, 2008, 15:43:21 wysłane przez counterClockWise » Zapisane
Elwis
Jr. Member
**

wiadomości: 90


Zobacz profil
« Odpowiedz #6 : Czerwiec 23, 2008, 15:42:44 »

Coś słyszałem o krytyce pod adresem instrukcji break, ale myślę, że o ile goto rzeczywiście psuje czytelność, to break w niczym nie przeszkadza. Tak trudno znaleźć koniec pętli?
Zapisane

kontakt : elwis[at]jabber[dot]gda[dot]pl / elwispl[at]gmail[dot]com
counterClockWise
Hero Member
*****

wiadomości: 804



Zobacz profil
« Odpowiedz #7 : Czerwiec 23, 2008, 15:46:07 »

Coś słyszałem o krytyce pod adresem instrukcji break, ale myślę, że o ile goto rzeczywiście psuje czytelność, to break w niczym nie przeszkadza. Tak trudno znaleźć koniec pętli?

Masz dynamiczną liniową strukturę danych bez żadnego posortowania i szukasz jakiegoś elementu. Następnie chcesz coś z tym elementem dalej robić w tej samej funkcji - bez 'break' masz zawsze złożoność pesymistyczną, a tak sobie przerwiesz szukanie.
Zapisane
infernus
Full Member
***

wiadomości: 103


Ave Satan


Zobacz profil
« Odpowiedz #8 : Czerwiec 23, 2008, 15:46:42 »

Mnie NIGDY nie zadarzylo sie uzyc break. Wcale jednak nie uwazam ze sa one zle i ze nalezy sie ich wystrzegac czasem ich uzycie moze okazac sie koniecznoscia (jak i czasem konieczne moze byc wykorzystanie goto). W konstrukcji switch na przyklad sa one jedynym sensownym sposobem sterowanie jej przebiegiem.
Zapisane

 
Cytuj
<+TBH> perl to jedyny jezyk programowania w ktorym kod źródłowy jest tak samo czytelny przed i po szyfrowaniu AESem.
Kos
Member2000
*******

wiadomości: 3487



Zobacz profil
« Odpowiedz #9 : Czerwiec 23, 2008, 15:47:49 »

Kod imo jest dobry tak długo jak jest (a) w miarę optymalny (na tyle, na ile potrzeba) i (b) czytelny (j.w.). Break lub continue w pętli często pozwala zachować 'logiczniejszą' strukturę. I o ile prawdą jest, że każde użycie breaka można zastąpić odpowiednią "ifologią", to nasuwa się pytanie - po co sobie komplikować kod i marnować pamięć na zmienne pomocnicze? To samo tyczy się goto - są nieliczne sytuacje, gdy tego używam, np. dla "podwójnego" breaka z zagnieżdżonej pętli. Kod jest przez to prostszy i - co ważne - przejrzysty i sensowny. O to chyba chodzi, prawda?

A jeśli taki nauczyciel usłyszał że "goto, jak również breaki, mogą sprawić że kod będzie przypominał spaghetti", to bardzo dobrze usłyszał, bo jak najbardziej mogą. Smiley Ale:
* Po pierwsze, odpowiednie i stosowne użycie tychże konstrukcji z kodu nam labiryryntu nie zrobi,
* Po drugie, dorabianie skomplikowanych warunków, zmiennych pomocniczych, może kod zaplątać (i spowolnić) równie łatwo co wspomniane wyżej instrukcje,
* Po trzecie, wyklinanie goto i breaków wszędzie, gdzie tylko się je zobaczy, bo "mądra wieść ludowa mówi że są złe" to w moim mniemaniu zwyczajny fanatyzm. Smiley
Zapisane

Eclipse!
counterClockWise
Hero Member
*****

wiadomości: 804



Zobacz profil
« Odpowiedz #10 : Czerwiec 23, 2008, 15:56:25 »

Nie porównujmy 'goto' do 'break' Smiley

Ta pierwsza instrukcja zmienia sterowanie w sposób dosyć drastyczny i często niemożliwym jest domyślić się idei użycia osobie czytającej program (np. innemu programiście w tym samym projekcie). Takie dowolne skoki są bardzo błędogenne i zostawiłbym je tylko do niskopoziomowych zadań - tam 'goto' jak najbardziej.

Natomiast break zmienia sterowanie w sposób całkiem 'gładki' i przewidywalny. Dla mnie ciężko to porównywać.
Zapisane
Gravell
Full Member
***

wiadomości: 194



Zobacz profil WWW
« Odpowiedz #11 : Czerwiec 23, 2008, 15:58:02 »

Mnie NIGDY nie zadarzylo sie uzyc break.

Hehe, nie wiesz co tracisz Tongue.

Co do porównywania break'a do etykiety to wg mnie jak porównywanie samochodu do telewizora. Etykiety to wynalazek z czasów gdy nie stosowano jeszcze OOP i był to świetny sposób na przeniesienie się z jednego miejsca kodu w inne*. Break to zwyczajna instrukcja do wyjścia z pętli. Dla przykładu przytoczę Symfonię C++: o ile o etykietach nie mówiło się tam w ogóle, lub wspomniało tylko na tyle bo powiedzieć "co to", ale nie zachęcać do używania, o tyle break został tam normalnie opisany i używany praktycznie "wszędzie gdzie się da". To chyba o czymś świadczy Wink.

* Nie bijcie jeśli się mylę Tongue.

Pozdro
Zapisane

Shakes&Fidget
Toouudi! Gdzie są moje ogry?!?
Teyan
teyan.co.cc
yarpen
SuperHero Member
******

wiadomości: 1445


Zobacz profil WWW
« Odpowiedz #12 : Czerwiec 23, 2008, 16:02:06 »

Jak na liceum to bardzo ciekawe, bo to zalecenie rodem ze standardow programowania dla duzych firm Smiley. Pani profesor wie, co mowi. Niepotrzebny break w petli zwieksza zlozonosc cyklomatyczna f-kcji. Zobacz tez na przyklad "A Critical View of C++ Practices" Henneya - http://www.accu-usa.org/Slides/ACriticalViewOfCppPractices.pdf (Jumpy Code, strona 42 i dalsze)
Zapisane
Krzysiek K.
Member2000
*******

wiadomości: 9879



Zobacz profil
« Odpowiedz #13 : Czerwiec 23, 2008, 16:02:52 »

Cała sprawa z breakami wyszła z ideologii kodowania strukturalnego (każdy blok kodu ma jedno wejście i jedno wyjście), a breaki sa takim wyjściem "w bok". O ile z wadami goto się zgodze, to z breakami sprawa ma się tak, jak Kos napisał. Jednak cała walka narodów z niestrukturalnością spaliła na panewce po tym, jak ktoś wymyślił wyjątki, które są ekstremalnie niestrukturalne i po cichu mogą z controll flow'a zrobić jeszcze większe spaghetti niz nawet najbardziej perfidnie umieszczony break. Smiley
Zapisane

Aktualne zajęcie: Szkoła DJKurs DJ
Kos
Member2000
*******

wiadomości: 3487



Zobacz profil
« Odpowiedz #14 : Czerwiec 23, 2008, 16:03:56 »

Nie porównujmy 'goto' do 'break' Smiley

Ta pierwsza instrukcja zmienia sterowanie w sposób dosyć drastyczny i często niemożliwym jest domyślić się idei użycia osobie czytającej program (np. innemu programiście w tym samym projekcie). Takie dowolne skoki są bardzo błędogenne i zostawiłbym je tylko do niskopoziomowych zadań - tam 'goto' jak najbardziej.

Natomiast break zmienia sterowanie w sposób całkiem 'gładki' i przewidywalny. Dla mnie ciężko to porównywać.

Break to przecież szczególny przypadek goto, tylko ciut bardziej sprecyzowany. Smiley

Kod:
while(warunek)
{
    jakas_funcja();
    while(inny_warunek)
    {
        inna_funkcja();
        if (warunek_wyjscia)
            goto koniecPetli;
    }
}
koniecPetli: /* ... */

Widzisz tu coś nieczytelnego lub nielogicznego? Niektóre języki (Visual Basic PHP) obsługują coś takiego bez labeli, na podobnej zasadzie jak "zwykły" break w C, lecz jedną instrukcją pozwalają na wyjście z dowolnej ilości zagnieżdżonych pętli. W C jest jedynie pojedynczy break, dlatego takie użycie goto czasami bywa wygodne.
« Ostatnia zmiana: Czerwiec 23, 2008, 16:11:25 wysłane przez Kos » Zapisane

Eclipse!
Strony: [1] 2 3
  Drukuj  
 
Skocz do:  

Hosting: Polska Strefa - Ogłoszenia
Powered by SMF 1.1.7 | SMF © 2006, Simple Machines LLC