niedziela, 20 lipca 2008

troszkę inny 'switch'

Całkiem niedawno odkryłem ciekawe, inne użycie switcha (pewnie wszyscy je znali a ja ciągle siedziałem w średniowieczu ale co tam). W każdym skrypcie zawsze znajdą się linie kodu podobne do tego:
$i = 1;

if ( $i == 0 ) {
echo 'Goodnight, world!!';
} elseif ( $i == 1 ) {
echo 'Hello, world!';
} elseif ( $i > 4 ) {
echo 'Dont cry for me.... ARGENTINA !!';
} else {
echo 'die die die!';
}
(warunek prosty dla przykładu)
Mnie osobiście takie tasiemce elseif elseif elseif troszkę brzydzą i dla mnie taki kod jest nieczytelny (zwłaszcza gdy warunki robią się duże). Taki kod można prosto przerobić w konstrukcję switch, która będzie "ładniejsza" w taki sposób:

$i = 1;

switch ( true ) {
case ( $i == 0 ):
echo 'Goodnight, world!!';
break;

case ( $i == 1 ):
echo 'Hello, world!';
break;

case ( $i > 4 ) :
echo 'Dont cry for me.... ARGENTINA !!';
break;

default:
echo 'die die die!';
break;
}
Od razu ładniej:) Zachowanie mamy praktycznie takie same. Kodu może troszkę więcej powstaje ale co tam! Ważne, że ładnie :)
Co do szybkości wykonywanie to nie sprawdzałem, mam to gdzieś :)
Dodam jeszcze, że należy pamiętać, że zawsze zostanie wykonany tylko pierwszy 'case' który ma spełniony warunek a następne nie będą już sprawdzane (nawet gdy ich warunek spełniony). Oczywiście pomijam tutaj możliwość opuszczenia 'break'.

Wiem, że nic genialnego nie odkryłem ale może komuś się przyda/spodoba ^^

5 komentarzy:

  1. Owszem, genialne w swojej prostocie (znalem :P). Niestety działa tylko w językach interpretowanych, a nie w kompilowanych.

    OdpowiedzUsuń
  2. no nie całkiem. Np java, c# są językami interpretowanymi i takie coś nie przejdzie...
    to zależy od języka :)

    OdpowiedzUsuń
  3. Nieprawda! :P
    Java i C# są kompilowane do (odpowiednio) bajtkodu i MSIL, a dopiero tamte są interpretowane. Które to z racji swojej niskopoziomowości nie posiadają w ogóle takich struktur ;) [chyba - bezpośrednio ich nie znam, patrze na nie jako na analogię do asemblera w środowisku zarządzanym]

    OdpowiedzUsuń
  4. Zarówno Java i C# kompilują kod na abstrakcyjną maszynę stosową a tam faktycznie chyba switcha nie ma;] W każdym bądź razie nie o to mi chodziło.

    Więc inaczej - typowy intepretowany język - Python, tam takie coś nie przejdzie:D Co prawda dlatego, że tam wcale nie ma switcha ale co tam ^^

    a MSIL teraz nazywa się CLI.

    OdpowiedzUsuń
  5. Nice ;).
    Osobiście lubię tasiemce else-if'ów (zwłaszcza, że w C++ switch-case jest jako tako mało użyteczny) i jeśli chcesz je polubić to spróbuj innego sposobu wcięć i enter'ów. Na przykład:
    if (warunek)
    {
    [tab] kod
    }
    else if(warunek)
    {
    [tab] kod
    }
    Dla mnie wygląda estetycznie :).
    Pozdrawiam!

    OdpowiedzUsuń