Blog webdeveloperski Patryk yarpo Jar

Skrócony zapis if

Autor wiadomości Styczeń 20, 2011

Z pewnością nie raz używałeś instrukcji warunkowej if. Niekoniecznie musiałeś programować w JS, aby się z warunkami spotkać. Często warunki w programie stanowią największą część kodu (choć czasem może to oznaczać, że kod jest źle napisany). Czy muszą zajmować aż tyle miejsca? Nie...

Normalny if wygląda tak:

if (warunek) {
    // wykonaj
} else {
    // wykonaj co innego
}

Jeśli to, co ma zostać wykonane ma jedynie jedną linię kodu, np:

if (i < 0) {
    i--;
} else {
    i++;
}

Można to zapisać krócej:

if (i < 0) i--;
else i++;

Jeśli opuścimy klamry, to zostanie wykonany kod do pierwszego średnika, jako kod warunkowy. Reszta zostanie wykonana liniowo.

Czyli jeśli masz:

if (i < 0) {
    i--;
} else {
    i++;
    inna_zmienna = 7;
}

I opuściłbyś klamry:

if (i < 0)
    i--;
else
    i++;
    inna_zmienna = 7;

to gdy i > 0 jest spełniony, zostanie wykonany taki kod

  1. i--
  2. inna_zmienna = 7

A to przecież nie jest to, czego chcieliśmy. Powyższy zawiera wcięcia, a wcięcia w JS nie tworzą bloku kodu. Gdy usuniemy wcięci łatwiej zauważyć, co się wykona:

if (i < 0)
    i--;
else
    i++;

inna_zmienna = 7;

Warto pamiętać:

  • zawsze używaj klamer
  • jeśli zdecydujesz się z powodów "oszczędności czasu" z nich zrezygnować, zawsze bardzo uważnie stawiaj wcięcia
  • pamiętaj, że wcięcia mogą mylić. Ale UŻYWAJ ich. Tyle, że starannie

Skrócony zapis instrukcji warunkowej

Jednak nie o tym miała być ta porada 🙂 Miałem zamiar pokazać, rzeczywistą możliwość skrócenia kodu, oto i ona:

(i < 0) ? i-- : i++;

Jest równoznaczne pierwszemu listingowi. W takim zapisie nie można używać więcej niż jednej instrukcji. Czyli nie można napisać

(i < 0) ? i--;  inna_zmienna=4; : i++;

Więc po co to?

Bardzo ułatwia to życie, i kod, kiedy masz krótką funkcję, np. min:

function min(a, b) {
     if (a >= b) {
         return b;
     } else {
         return a;
     }
}

Jaka ta funkcja dluuuuga! Fuj! A można ładnie i szybko:

function min(a, b) {
    return (a&gt;=b) ? b : a;
}

Przekonałem, czy jeszcze nie?

To może coś takiego:

var a = ('Kluska' === user) ? "Witaj Klusko" : "Nie znam Cię!";
alert(a);

lub nawet krótsze:

alert(('Kluska' === user) ? "Witaj Klusko" : "Nie znam Cię!");

Jest wiele możliwości wykorzystania tego skrótu. Polecam po eksperymentować 🙂

Bądź jednak czujny. Zbyt uproszczony kod czasem staje się mniej czytelny - lepiej jest napisać dłuższy kod, ale łatwiejszy do  zrozumienia niż krótki i nieczytelny meisterstück kompresji.

Warto przeczytać:

Komentarze (5) Trackbacks (0)
  1. Ja jednak bym pozostał przy normalnym zapisie, ponieważ skrócony jest mało czytelny i co jest zaskoczeniem jest wolniejszy http://jsperf.com/if-then-else2.

    • No nie wiem, a Linux’ie x64 krótsza opcja działa lepiej

    • Na Windows 7 x64 skrócony zapis działa szybciej o całe 3,4 % co jest w miarę dobrym wynikiem jeśli zauważymy, że warunki stawiamy w kodzie dosyć często 😉

      Nie zapominajmy również o oszczędności w wielkości pliku, co o ile w przypadku komputerów już za bardzo nam nie pomaga, to przy ściąganiu na telefon może mieć spore znaczenie.

      • Poprawka.

        Po wykonaniu większej ilości testów stwierdzam, że oba zapisy instrukcji warunkowej działają podobnie szybko. Raz wygrywa zapis pełny, a innym razem zapis skrócony ale raczej widać tendencję do równania wyników.

  2. Racja, poprawione 🙂

    Dzięki 🙂


Leave a comment

 

Brak trackbacków.