Mala škola programiranja

Pročitao sam do sada jako puno tuđeg koda, i moram priznati da stalno nailazim na iste greške. Problem je još veći zato što iste greške ponavljaju i iskusni programeri, zato što od početka nisu naučili kako treba. Doduše, kod nekih je to iz neznanja (ne znaju drugačije), kod nekih jer su lenji, a sve može da bude daleko bolje da bude samo je potrebno malo dobre volje da se promene navike.

Zašto je to bitno?

Zamislite da čitate neki članak u novinama ili na nekom blogu, i tema vam je vrlo interesantna. Ako je članak koji čitate gramatički neispravan, ima slovnih grešaka, pogrešan red reči u rečenici, loš stil pisanja - koliko god da je interesantna tema, to se pretvara u mučenje. Čitanje koda se tehnički ni malo ne razlikuje od čitanje članka. Ako je kod stilski loše napisan, ne čita vam se dalje. Postoje tu i drugi razlozi, koliko god dobro da radi neka funkcika, odnosno radi ono šta treba da uradi, ako je loše napisana to takođe utiče na performanse. Pored toga, loše napisan kod obično dodaje nepotrebne linije u kodu pa i to loše utiče na čitljivost koda.

Elem, odlučio sam da napišem nešto o najčešćim greškama. Stvarno ne bih da se ovo shvati kao neki tutorial, kada ih nisam pisao do sada ne pada mi na pamet da počinjem, ali mrzi me više da objašnjavam neke stvari, sad ću lepo da napišem pa ću da ih teram da čitaju dok ne nauče (pa odgovaraju da poprave ocenu )

Deo 1: Stil

1.1. IF ELSE RETURN

Najčešća stilska greška je nepotreban else:


if ($a == 1)
{
    return true;
}
else
{
    return false;
}

Čemu taj else tu? Ako je uslov ispunjen “$a == 1″ onda se vraća true, za sve ostale slučajeve je false, else je nepotreban. Dakle ovako:


if ($a == 1)
{
    return true;
}
return false;

Ako je već jedna linija koda, odnosno od vrednosti $a zavisi return iz funkcije, onda je daleko bolje ovako:


return $a == 1;

1.2. IF ELSE

Skoro 99% programera pišu ovako:


function foo ()
{
    $a = DB::fetch ('Neki query');
	
    if ( !empty($a) )
    {
        foreach ($a as $key => $row)
        {
            // uradi nesto ovde
        }
        return true;
    }
    return false;
}

Ovde nema nekih tehničkih problema, ovde je u pitanju samo stil pisanja. Uvek je lakše ispratiti blokove linijski nego ovako preko if uslova. Šta bi bilo da je posle prvog IF joše nekoliko IF-ova, kod bi se granao i došli bi do 5-6 nivoa indentacije. Daleko je čitljivije ovako:


function foo()
{
    $a = DB::fetch ('Neki query');
	
    if ( empty($a) )
    {
        return false;
    }
	
    foreach ($a as $key => $row)
    {
        // uradi nesto ovde
    }
}

Znači, samo se okrene uslov i čim je prazan niz sa kojim treba da radimo - izađe se iz funkcije. Dalje se nastavlja kod koji se izvršava kada je sve u redu.

1.3. Kriptična imena varijabli

Pogledajte razliku između ova 2 primera i procenite sami šta je čitljivije:


function x1 ($a, $b, $c)
{
    // neki kod
}

ili


function sendEmail ($to, $subject, $message)
{
    // neki kod
}

Svaki dalji komentar je nepotreban. Razumem da je frka i nema se vremena, ali za ovo uvek treba imati vremena.

1.4. Provera da li je varijabla prazna


if ($string == '')
{
    // neki kod
}
	
if ($int == 0)
{
    // neki kod
}

A šta ćemo ako string nije ‘’ ali je zato NULL ? Ili ovaj integer? Šta ako je on recimo FALSE (boolean). Nećemo valjda da pišemo ovako:


if ($string == '' || $string == NULL || $string  == false)
{
    // neki kod
}

Zato PHP ima funkciju empty() koja vraća true ako vrednost varijable nije:

- “”(prazan string)
- “0″ (string “nula”)
- 0 (int nula)
- NULL
- false
- pa čak i da li je prazan niz ( count ($array) = 0 )


if (empty($string))
{
    // neki kod
}

Ovde jedino treba voditi računa o tome da vam je u nekim situacija i 0 (integer nula) validan rezultat, pa u tim slučajevima morate da radite i drugačiju proveru.

1.5. Funkcija u uslovu petlje

Ako imamo ovakav kod:


while ($i < strlen ($string))
{
    // neki kod
    $i++;
}

funkcija strlen će se izvršiti onoliko puta koliko je veliki taj string. Zašto bi za string od 50 karaktera računali 50 puta koliko je dugačak, kad već iz prvog puta znamo. Dakle, uvodimo još jednu varijablu, i to će ubrzati kod onoliko puta koliko je dugačak string.


$len = strlen ($string);
while ($i < $len)
{
    // neki kod
    $i++;
}

Ili još bolje, ako nam nije bitan redosled, možemo da brojim od nazad ka 0:


$len = strlen ($string);
while ($len--)
{
    // neki kod
}

1.6. Nepotrebne varijable


$len = strlen ($string);
return $len;

Ta varijabla se nigde ne koristi osim što se vrati njena vrednost, čemu onda deklarisanje te varijable? Dovoljno je samo:


return strlen ($string);

1.7. Skraćeno pisanje uslova


if ($a == 1)
{
    $b = 100;
}
else
{
    $b = 200;
}

Svakome ko zaslužuje da čita vaš kod bi bilo savršeno jasno da napišete ovako:


$b = ($a == 1) ? 100 : 200;

I to staje sve u jedan red, skraćuje pisanje (i čitanje) koda, a kome ovo nije jasno - ne treba ni da čita kod, neka čita Politikin Zabavnik ili Gloriju

1.A. Dodatak:

Ovo su sve “sitnice”, ali umeju jako da smetaju, i nema razloga da se i dalje piše pogrešno. Na kraju, po tim sitnicama se razlikuju školovani programeri od priučenih.

Ostali delovi kada i ako budem imao vremena.

Napišite komentar

Molba i napomena: Ako imate želju da komentarišete molim vas da se predstavite. Anonimne komentar brišem ili u najboljem slučaju totalno ignorišem. Uvrede na bilo čiji račun ne tolerišem, ako se ne slažete sa tekstom ili nekim komentarom slobodno i iskreno to napišite ali se suzdržite od uvreda bilo koje vrste.

XHTML: Možete koristiti HTML tagove: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

Ako želite samo da SPAM-ujete, komentar će biti obrisan automatski, a ako vam je iz nekog razloga baš stalo da imate link ovde poslaću vam cenovnik za oglašavanje.