czwartek, 31 lipca 2014

Quick: #CodeCleanup: alternatywa dla if_else, czyli ?:

Zapewne często zdarza Wam się tworzyć zmienne i przypisywać im pewne, uwarunkowane "od czegoś" wartości. Czasami są to skomplikowane uwarunkowania, jednak bardzo często warunkowanie jest proste: "jeśli coś, to X, w przeciwnym wypadku Y". Ale do rzeczy:

Jak to działa?

Znając warunkowanie if...else wiemy, że pojawia się warunek sprawdzający. Jeśli warunek zostanie spełniony, wykonywana jest część zaraz pod warunkiem.
Opcjonalnie możemy skorzystać z:
  • else if (jeśli pierwszy warunek nie został spełniony, sprawdzamy inny warunek)
  • else ("w przeciwnym wypadku, jeśli pozostałe warunki nie zostały spełnione").
C# umożliwia zapisanie naszego warunku w prostrzej formie, z wykorzystaniem ? i :

[warunek] ? [jeśli prawda] : [jeśli fałsz]

Kto używa funkcji w popularnym arkuszu kalkulacyjnym, od razu dopatrzy się podobieństwa funkcji "Jeżeli" (If) w tymże programie :)

Oczywiście możemy stworzyć bardziej złożone warunkowanie,np

[warunek] && [warunek2] || [warunek3] ? [jeśli prawda] : [jeśli fałsz]

Możemy też zagnieździć warunki:

[warunek1] ? [warunek2] ? [jeśli spełniony warunek1 i warunek2] : [jeśli spełniony pierwszy warunek] : [jeśli fałsz]

Przykład


Załóżmy, że chcemy sprawdzić, czy jakaś liczba jest podzielna przez 2, a jeśli tak, to zapiszemy sobie do naszej zmiennej odpowiednią wartość:

              int liczba = 23;


1:          bool czyPodzielnaPrzezZero;
2:            if (liczba % 2 == 0)
3:            {
4:                czyPodzielnaPrzezZero = true;
5:            }
6:            else
7:            {
8:                czyPodzielnaPrzezZero = false;
9:            }


Ilość linii do weryfikacji: 9 (lub 7, zależnie od przyjętego standardu). sporo.

oszczędzania czas rozpocząć:

            int liczba = 23;
1:            bool czyPodzielnaPrzezZero = true;
2:            if (liczba % 2 == 0)
3:            {
4:                czyPodzielnaPrzezZero = true;
5:            }


Wynik: 5(4) linii. Nieźle. Ale co jeśli podobnych prostych warunków byłoby więcej? Spoko :) Oszczędzimy jeszcze trochę...  wykorzystamy cudowny ? oraz :


      int liczba = 23;
1:      bool czyPodzielnaPrzezZero = liczba%2==0 ? true : false;


W rezultacie, naszą prostą weryfikację wykonaliśmy w jednej linii, a w dodatku od razu przypisaliśmy do naszej zmiennej wartość (o korzyściach płynących z przypisania od razu wartości do zmiennej napiszę w jednym z kolejnych postów).


Kiedy stosować, kiedy unikać?

Wspomniany "skrót" możemy śmiało wykorzystać przy prostych warunkach, zdecydowanie wpłynie na poprawę czytelności kodu. Przy odrobinie wprawy możliwe będzie znaczne skrócenie tworzonego kodu.

Nie polecam natomiast stosowania bardziej zagnieżdżonego warunkowania. 
Co prawda nic nie stoi na przeszkodzie, abyśmy sprawdzali kilka warunków w jednej linijce, np w Norwegii mocne trunki (wódka, wino) można nabyć dopiero po ukończeniu 21 lat:

            int wiek = 21;
            string alkohol = wiek<18? "Nie sprzedajemy" : wiek<21? "Co najwyżej piwo" : "A pij Pan co chcesz, starość nie radość";



...tylko pytanie, czy taki kod będzie czytelny. Osobiście - odradzam.

Ponadto, jeśli zastosowaliśmy już switch...case, to raczej dobrze zrobiliśmy i nie warto przesiadać się na ? : .

Brak komentarzy:

Prześlij komentarz