× Aktuálně z oboru

Vychází Game Ready ovladače pro Far Cry 5 [ clanek/2018040603-vychazi-game-ready-ovladace-pro-far-cry-5/ ]
Celá zprávička [ clanek/2018040603-vychazi-game-ready-ovladace-pro-far-cry-5/ ]

Efektivně v PHP

[ http://programujte.com/profil/2592-jan-skrasek/ ]Google [ ?rel=author ]       [ http://programujte.com/profil/118-zdenek-lehocky/ ]Google [ ?rel=author ]       10. 12. 2007       22 514×

Znalost jazyka neznamená pouze pochopení syntaxe. Znamená to také určitou úroveň kódu, jeho efektivnost, snadnou rozšiřitelnost a lehkou pochopitelnost. Podívejme se na časté začátečnické chyby.

V poslední době se ze mě stal člověk pachtící se po dokonalém kódu. Na svých projektech provádím pořád nějaký ten refactoring a práce jde pomalu. Ale práce je o to zábavnější, když vím, že ten kód je v pořádku a je efektivní. Nic se nesmí přehánět, musí nám vždy zůstat ten „zdravý rozum“. Ukažme si, co by ale opravdu v našem kódu být nemělo.

Podmínky

Velmi častou začátečnickou chybou je špatné napsání podmínek. Přitom podmínka je operace zabírající velmi mnoho operačního výkonu. Pracujme s příkladem. Máme jedenáct (hodnotících) číselných stavů a chceme jim pro efekt přidat barevné vyjádření. Špatný kód by vypadal asi nějak takhle:

if($bod==0): $color = "color:#ab0203"; endif;
if($bod==1): $color = "color:#d52b05"; endif;
if($bod==2): $color = "color:#fa530a"; endif;
if($bod==3): $color = "color:#fa8324"; endif;
if($bod==4): $color = "color:#fa9d24"; endif;
if($bod==5): $color = "color:#fac024"; endif;
if($bod==6): $color = "color:#ecce08"; endif;
if($bod==7): $color = "color:#dbec08"; endif;
if($bod==8): $color = "color:#b7dc04"; endif;
if($bod==9): $color = "color:#94dc04"; endif;
if($bod==10): $color = "color:#15be02"; endif; 

Nahoďme řečnickou otázku: Může proměnná $bod nabývat v jednu chvíli více hodnot? Myslím, že nikoli. Pak by tedy kód měl vypadat asi nějak takhle:

if($bod==0): $color = "color:#ab0203";
elseif($bod==1): $color = "color:#d52b05";
elseif($bod==2): $color = "color:#fa530a"; 
elseif($bod==3): $color = "color:#fa8324"; 
elseif($bod==4): $color = "color:#fa9d24"; 
elseif($bod==5): $color = "color:#fac024"; 
elseif($bod==6): $color = "color:#ecce08"; 
elseif($bod==7): $color = "color:#dbec08";
elseif($bod==8): $color = "color:#b7dc04";
elseif($bod==9): $color = "color:#94dc04";
elseif($bod==10): $color = "color:#15be02"; endif; 

Pomiňme, že kód je velmi těžce rozšiřitelný, a vyhodnoťme výsledek. V ideálním případě jsme nyní ušetřili 10 zpracování podmínek. A to se počítá. Ale upřímně, takový kód se nesluší snad ani pro kompilované jazyky, natož pro ty interpretované, které disponují asociativními poli apod. Zde není ono asociativní pole ani potřeba a dosáhneme opravdu efektivního výsledku:

$colors = array("#ab0203", "#d52b05", "#fa530a",
				"#fa8324", "#fa9d24", "#fac024", "#ecce08",
				"#dbec08", "#b7dc04", "#94dc04", "#15be02");

$color = "color:" . $colors[$bod];

Nakonec, sami vidíte, že tento kód je i kratší.

Funkce, funkce, funkce

Využití dostupných funkcí je základní vlastnost dobrého programátora. Už pouhý výraz v podmínce je přehlednější a jasnější. Osobně proto preferuji tento zápis:

if (empty($foo)) {   //nenechte se zmýlit, dvojité slovo empty zaviňuje js zvýrazňovač :-/
}

Namísto:

if ($foo == "") {
}

Narychlo jsem ve svém archívu vybrousil jednu krásnou, tedy spíše hnusnou, funkci. (Musím doplnit, že svůj krásný archív začátků jsem asi už smazal :(.) Funkce slouží k odstranění lomítek ze začátku a konce řetězce.

function pryc_lomitko($string)
{
	$i = 0;
	if($string{0} == '/') $i = 1;
	$y = strlen($string)-$i;
	if($string{strlen($string)-1} == '/') $y = $y-1;
	
	return substr($string, $i, $y);
}

A to stačí jen:

trim($string, '/');

Štábní kultura

S umem programovat souvisí i jeho „štábní kultura“. Přehledný kód je přímo radost číst a učit se z něj. Ale koho by bavilo louskat něco, co ještě dělá plno oklik a nevyužívá k tomu potřebné funkce. Počínaje správným a výstižným pojmenováním proměnných a konče odsazením, uzávorkováním apod. můžeme dosáhnout krásného výsledku.

 if($data_cla2["hodnoceni"]!=0): $kolikhl="Již ".$data_cla2["hodnoceni"]." hlasovalo."; else: $kolikhl=""; endif;

A lépe:

if ($clanek["hodnoceni"] !== 0) {
	$hlasu = "Již {$clanek["hodnoceni"]} hlasovalo.";
} else {
	$hlasu = null;
}

Dobrý programátor by neměl občas zapomínat i na komentáře. Zde ale střídmost platí 10násob. Dobře upravený kód napoví mnohem více, než dvouvětný komentář.

Pokud narazím na pěkně refactorovatelný kód, určitě se s vámi o něj podělím. Závěrem přeji mnoho úspěchů při vylepšování vašich „zdrojáků“, pevné nervy při učení nových věcí a hodně povedených projektů.


Článek stažen z webu Programujte.com [ http://programujte.com/clanek/2007120900-efektivne-v-php/ ].