while(true)

0

Moim zdaniem while(true) czy inne wariacje nieskończonych pętli są nieczytelne i nie powinno się stosować takich konstrukcji. Przecież prawie zawsze istnieje jakiś warunek wyjścia z pętli, więc należałoby go zastosować.
Przeszukałem parę forów, głosy na nich rozkładają się mniej więcej po połowie. I jakoś nie bardzo mogę znaleźć w necie żadnych artykułów na ten temat.

A Wy co o tym sądzicie?

0

byle z glowa :P

0

Pierwszy raz przyznaję cepie/cepowi/wtf rację - zamiast sztywnych nakazów warto pomyśleć i zrobić to z głową. Są sytuacje kiedy wieczna pętla jest nie do uniknięcia.

0

Dla złożonych warunków wyjścia z pętli taka konstrukcja zwiększa czytelność, więc nie wiedzę problemów.

0

Może projekt w którym pracuje wypaczył mi mózg ale wole właśnie konstrukcje while(true) i break :P .

0

Wydaje mi się ze to kwestia czytelności po prostu.
Jeśli dana pętla faktycznie ma sie wykonywać cały czas, aż do napotkania jakiegoś nietypowego warunku to znacznie czytelniej będzie dać while(true) a w środku sprawdzać owy warunek i przerywać ewentualnie, niż wepchnąć jakiś gigantyczny warunek do while() i potem ktoś będzie siedział pół godziny i się głowił nad tym kiedy ta pętla sie w ogóle wykonuje.

0

przy wielu warunkach wyjścia z pętli taka konstrukcja wydaje mi się czytelniejsza niż jakieś kombinacje. Jestem Za.

0

Na upartego zamiast:

while(true)
{
instrukcje......
if (jakisKosmicznyWarunek & innyWarunek | funkcjaASD(123) ......) break;
}

Moznda dac:

bool warunek=true;
while(warunek)
{
instrukcje.....
warunek = jakisKosmicznyWarunek & innyWarunek | funkcjaASD(123) ......;
}

Chociaz to bardziej rozwiazanie z cyklu "zeby sie nie czepial", bo w sumie na koniec wychodzi na to samo :)

0

@cyriel
No chyba nie robisz tego w jednej linii...
Jak już to takiej konstrukcji wymagają skrypty/programy w których NIE DA się sprawdzić warunków w 1 linii i w dowolnym czasie.

while(true) {
   $cos = funkcja1();
   if (!$cos) break;
   $cos2 = funkcja2();
   if(!$cos2) break;

   if($cos/$cos2 > 10) break;
}

W takiej sytuacji nie sprawdzisz wszystkiego w jednej linii, a przynajmniej w PHP:

if ($cos/$cos2 > 10 || !$cos || !$cos2) //Może wywalić błąd

Jeśli czegoś nie ma - to przyjmuje się że to coś wynosi 0, czyli jeśli funkcja2() zwróci FALSE/0/''/WTF to będzie to równoznaczne z 0 na czas dzielenia i wywali nam ładne division by zero.

0

@up: O tym nie pomyslalem w pierwszej chwili. W przedstawionym przez Ciebie przypadku proba napisanie tego bez break to imho pomylka.

0

Unikam jak ognia. Stosuje raczej konstrukcje cyriela, a w przypadku podanym przez Demonical Monka rownie dobrze mozna zrobic:

   if (!$cos) warunek = false;
   $cos2 = funkcja2();
   if(!$cos2) warunek = false;

Dlaczego? Bo zdarzylo sie pare razy, ze ktos poczatkujacy poprawiajacy kod usuwal breaka duzej petli, robiac z niej nieskonczona. W przypadku while(warunek) jest widoczne od wartosci jakiej zmiennej zalezy koniec tej petli. Of coz nie powinno byc <ort>petel </ort>na 15 ekranow, ale zycie czasem woli inaczej :P W przypadku wiekszej pozostaje szukania break, zamiast poszukac sobie wszystkich zmian wartosci zmiennej warunek. Dla mnie osobiscie jest czytelniej. Jak widze while(true) to od razu zastanawiam sie czy ktos piszacy petle NA PEWNO wzial pod uwage wszystkie warunki zakonczenia petli.

0
while (true) {

    // ...

    try {
        // ...
    } catch (SomeException e) {
        // clean recources
        break;
    } catch (OtherException e) {
        // clean recources
        break;
    }
}
0
Demonical Monk napisał(a)

@cyriel
No chyba nie robisz tego w jednej linii...
Jak już to takiej konstrukcji wymagają skrypty/programy w których NIE DA się sprawdzić warunków w 1 linii i w dowolnym czasie.

while(true) {
   $cos = funkcja1();
   if (!$cos) break;
   $cos2 = funkcja2();
   if(!$cos2) break;

   if($cos/$cos2 > 10) break;
}

W takiej sytuacji nie sprawdzisz wszystkiego w jednej linii, a przynajmniej w PHP:

if ($cos/$cos2 > 10 || !$cos || !$cos2) //Może wywalić błąd

Jeśli czegoś nie ma - to przyjmuje się że to coś wynosi 0, czyli jeśli funkcja2() zwróci FALSE/0/''/WTF to będzie to równoznaczne z 0 na czas dzielenia i wywali nam ładne division by zero.

O enkapsulacji slyszal?

Moim zdaniem while(true) = lame

0

To wyżej Adama według mnie jest znacznie mniej czytelne niż while (true) + breaki.

0

edit.
Chodziło mi oczywiście o johnny_bravo. Sorry za pomyłkę :P

0

Moim zdaniem while(true) = lame

Bo przeczytałeś w książeczce dla h4X0r0w, że to lamerstwo?

0

Wiecie, on używa while(warunek)...

0

A continue jest lamerskie? :-P

0
Demonical Monk napisał(a)

@cyriel
No chyba nie robisz tego w jednej linii...
Jak już to takiej konstrukcji wymagają skrypty/programy w których NIE DA się sprawdzić warunków w 1 linii i w dowolnym czasie.

while(true) {
   $cos = funkcja1();
   if (!$cos) break;
   $cos2 = funkcja2();
   if(!$cos2) break;

   if($cos/$cos2 > 10) break;
}

W takiej sytuacji nie sprawdzisz wszystkiego w jednej linii, a przynajmniej w PHP:

if ($cos/$cos2 > 10 || !$cos || !$cos2) //Może wywalić błąd

Jeśli czegoś nie ma - to przyjmuje się że to coś wynosi 0, czyli jeśli funkcja2() zwróci FALSE/0/''/WTF to będzie to równoznaczne z 0 na czas dzielenia i wywali nam ładne division by zero.

wystarczy zamienić

if ($cos/$cos2 > 10 || !$cos || !$cos2)

na

if (!$cos || !$cos2 || $cos/$cos2 > 10)

Kompilator w przypadku "or" skończy sprawdzanie pętli już po pierwszym prawdziwym warunku, reszty nie sprawdzi. czyli jak cos2==0 to już na tym etapie wyjdzie i nie przejdzie do dzielenia.

Co nie zmienia faktu że też jestem za stosowaniem nieskończonych pętli kiedy to jest naprawdę lepsze(czytleniejsze) rozwiązanie.

0

Podajecie argumenty przeciw, ale nie bierzecie pod uwagę jednego - kontekstu. Oczywiście, że na siłę da się zrobić wiele rzeczy, ale chyba nie chodzi o to, żeby do warunku pętli przynosić jej ciało...
Czasami taki zapis po prostu jest czytelniejszy. A jeżeli nie jest, to oczywiście się tego nie stosuje. No przecież nikt nie mówi, że każdą pętle trzeba tak rozwiązywać :)

Strach przy pracy grupowej? a od czego są komentarze?

0
while (true) {    
    try {
        doSomething();
    } catch (SomeException e) {
        // clean recources
        break;
    }
}

Eee tam, while jest dla dziewczynek, niezależnie od warunku... [diabel]

def repeat = { doSomething; repeat }   

try {
  repeat
} catch {
  e:Exception => cleanResources
}
0
wpisałem nick napisał(a)

A continue jest lamerskie? :-P

Jest. :P Lista lamerskich rzeczy, gwiazdkami oznaczony stopień lamerskości:

  1. goto ****
  2. break ***
  3. continue ****
    4a. return wewnątrz pętli ***
    4b. return w innym miejscu niż na końcu **
  4. while *
  5. static *********!!!!!
  6. null *****

BTW: Lista się wydłuża z biegiem czasu... :D

0

A co szanowni mysla o tym?

delete this;
0

A może taka forma :

for(;;) {

}

W Javascript i C# jak najbardziej poprawna :-)

0
  1. null *****

Eeee czemu null ma więcej gwiazdek niż goto?

0
Deti napisał(a)

A może taka forma :

for(;;) {
}

W Javascript i C# jak najbardziej poprawna :-)

W zasadzie działa tak samo jak while(true), hmmm... dlaczego nie pójść dalej?

int i=0;
for(;;i++)
{
  if(i > a) break;
}
0x200x20 napisał(a)
  1. null *****

Eeee czemu null ma więcej gwiazdek niż goto?

Ponieważ w javie nie używa się delete i nie zeruje wskaźników [rotfl]

0

Ponieważ w javie nie używa się delete i nie zeruje wskaźników

Pewnie że nie używa się delete, od tego jest GC matole.
A wskaźniki od czasu do czasu się zeruje, zależy jaki kontekst. Nie zersując wskaźnika np. w jakiejś hashmapie też można doprowadzić do wycieku pamięci.

0
0x200x20 napisał(a)

Ponieważ w javie nie używa się delete i nie zeruje wskaźników

Pewnie że nie używa się delete, od tego jest GC matole.
A wskaźniki od czasu do czasu się zeruje, zależy jaki kontekst. Nie zersując wskaźnika np. w jakiejś hashmapie też można doprowadzić do wycieku pamięci.

ojej

0

Albo takie coś też fajne:

while(true)
{
  ...
  switch(costam)
  ...
  case(koniec_petli)
  // 1. i teraz jak tu z tymi breakami? :D
  // 2. wprowadzimy dodatkowa "zmienna sterujaca" 
  finish = true;
  break;
  ..

  if(finish) break;
}

[rotfl] [rotfl] [rotfl]

0

Dla mnie while(true) oznacza pomaranczowa lampke i to w zasadzie glowny argument przeciw. Zwykle i tak sie nie rozwijam z warunkami albo je opakowuje w jakies CheckRequirements(), wiec nie zdarza mi sie pakowac breakow ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1