Do While False [DWF]

Przemierzałem sobie bezkresne obszary www.gamedev.net i natrafiłem tam na fajny mechanizm o nazwie DWF. Wygląda to tak:

do {
	if( !doSth() ) break;
	if( !doSthElse() ) break;
	if( !doAnotherThing() ) break;
	doLastThing();
} while( false );

Na pierwszy rzut oka mechanizm bez sensu. Po co pętla skoro i tak wiadomo, że wykona się tylko raz?!

Po spojrzeniu drugi raz zaczyna to mieć sens. Dzięki takiemu mechanizmowi można uzależnić wykonywanie kolejnych operacji od wyniku poprzednich w prosty sposób. W innym wypadku trzeba by było pisać masę zagnieżdżonych if‘ów. Ten poprzedni przykład zadziała tak samo jak to:

if( doSth() )
{
   if( doSthElse() )
   {
      if( doAnotherThing() )
      {
         doLastThing();
      }
   }
}

Chyba nikogo nie muszę przekonywać, że poprzednie rozwiązanie było lepsze. To jest oczywiście najprostszy przykład, w którym różnica nie jest aż tak straszna, ale dla większej ilości instrukcji może to być problem.

Zwłaszcza jeżeli nie mamy funkcji takich jak doSth(), doSthElse() i wszystko wklepujemy do programu, wtedy takie zagnieżdżone if’y nie wyglądają zbyt ładnie :)

  1. #1 by Xion on Grudzień 14, 2007 - 10:07 am

    Przekonaj mnie. Dla mnie taka pętla, która nie jest pętlą, od razu wzmaga czujność wobec piszącego kod; spodziewam się po prostu, że będzie używał większej liczby dziwnych sztuczek.

    A że zagnieżdżone ify są brzydkie? Usuń nadmiarowe nawiasy klamrowe i już jest znacznie lepiej. Przynajmniej dokładnie widać przebieg sterowania, bo takie nagłe i nadużywane breaki działają niemal jak goto Koniec.

  2. #2 by moriturius on Grudzień 14, 2007 - 1:58 pm

    @Xion: a gdyby tych ifow mialo byc 15? taka sztuczka wyglada lepiej nawet jesli pozbede sie tych nawiasow. Zreszta pisalem tez w poscie o tym, ze to doSth() to wcale nie musza byc konkretne funkcje tylko cale bloki instrukcji zapisujace wynik do jakiej zmiennej i potem dopiero jest sprawdzanie czy ten kawalek dal zamierzony efekt ( if(!status) break; ).

    Jesli chodzi o goto, to uzywanie tej sztuczki jest wlasnie takim zamiennikiem zeby nikt sie nie czepial ;) A przynajmniej na pierwszy rzut oka ^^’

  3. #3 by Reg on Grudzień 16, 2007 - 8:54 am

    Genialne! Dawno nie widziałem tak ciekawej notki na żadnym blogu. Wprawdzie aż się prosi żeby ten kod zamknąć w osobnej funkcji i zamiast break stosować return, ale sztuczka tak czy owak jest fajna.

  4. #4 by moriturius on Grudzień 16, 2007 - 8:58 am

    @Reg: ale zauwaz, ze nie zawsze chce sie konczyc funkcje :)
    Czasem mozna chciec po tym wszystkim zrobic jeszcze cos innego co jest niezalezne od tego czy wszystkie operacje w DWF zostaly wykonane czy nie

  5. #5 by Maikeru on Grudzień 19, 2007 - 8:28 pm

    Witam, zauważyłem małą pomyłkę, w przykładzie z zagnieżdżonymi instrukcjami warunkowymi, nie powinno być negacji wyników zwracanych przez funkcje. Oczywiście zakłądając, że funkcje w obu przykładach robią to samo.

    Pozdrawiam

  6. #6 by moriturius on Grudzień 19, 2007 - 10:12 pm

    @Maikeru: masz rację, dzięki :) już poprawiam

  7. #7 by Firkraag on Grudzień 20, 2007 - 10:53 pm

    Mam dokładnie takie samo zdanie na temat tego typu sztuczek jak Xion. Ale w sumie całkiem “cute” ;P

Dodaj komentarz

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Zmień )

Twitter picture

You are commenting using your Twitter account. Log Out / Zmień )

Facebook photo

You are commenting using your Facebook account. Log Out / Zmień )

Connecting to %s

Follow

Otrzymuj każdy nowy wpis na swoją skrzynkę e-mail.