14
May
if, else, return
Občas vidím ve zdrojácích funkce s konstrukcí:
if (<condition>)
{
x = DoSomething(y);
return x;
}
return z;
Což je víceméně to samé jako:
if (<condition>)
{
x = DoSomething(y);
return x;
}
else
{
return z;
}
Osobně používám druhý zápis. Přijde mi o něco přehlednější a explicitnější. Pravděpodobně vliv Delphi/ObjectPascalu.
Je však v těchto zápisech nějaký rozdíl? Nějaký praktický aspekt, který mi uniká?



There's 13 Comments So Far
May 15th, 2009 at 00:58
Myslím, že záleží na tom, jaký kód obsahuje blok if. V uvedeném případě v tom žádný rozdíl není. Ale třeba mi taky něco uniká.
May 15th, 2009 at 06:06
První varianta: pokud platí podmínka, pak vrátí ‘x’ a v následujícím kroku vrátí ‘z’, ať už podmínka dopadla jakkoli.Druhá varianta: pokud platí podmínka, pak vrátí ‘x’, v opačném případě vrátí ‘z’.
May 15th, 2009 at 07:45
myslim ze slusny kod funkce by mel mit jen jeden return,takze ja to pisu takhle:retval = z;if (){ x = DoSomething(y); retval = x;}return retval;nebo druhy pripad:retval = x;if ( ){ x = DoSomething(y); retval = x;}else{ retval = z;}return retval;
May 15th, 2009 at 08:40
Čím více zanořených bloků, tím je správa a čitelnost kódu složitější. Ve druhém příkladu nám vzrostla Maintenance Complexity, proto ho považuji za horší. Příklad obera brát vážně jen v případě, že jste placeni od naspaných řádků a nikdo už ten kód nikdy nebude upravovat.
May 15th, 2009 at 08:50
Dufam, ze sa to nezvrhne na staru a uz obohratu temu – jeden return z funkcie vs. okamzity return.(osobne preferujem 2, kriterium je citatelnost kodu)a v zaujem citatelnosti v tomto pripade :if () z = DoSomething(y);return z;aleternativne(nepreferujem v tomto pripade)return ? DoSomething(y) : z;+ kriteriom citatelnosti je u mna – aj ked to netreba brat ako dogmu – eliminovanie zbytocnych riadkov, zatvoriek, elsov.
May 18th, 2009 at 09:42
Tuhle odpověď nechápu První varianta: pokud platí podmínka, pak vrátí ‘x’ a v následujícím kroku vrátí ‘z’, ať už podmínka dopadla jakkoli. Druhá varianta: pokud platí podmínka, pak vrátí ‘x’, v opačném případě vrátí ‘z’.” , buď jsem špatně pochopil odpověď nebo mi něco uniká, ale kromě čitelnosti není žádný rozdíl.
May 18th, 2009 at 09:56
Ja taky ne, ale ucim se s tim zit.
May 18th, 2009 at 16:25
@Patrik:Co je na tom nepochopitelne, obe varianty su alternativnym zapisom kodu, co je hore v blog poste.(zafunguje to samozrejme len za podmienky, ze funkcia, z ktorej returnujeme nevracia reference type, ktory je rodicom tried premennych ‘x’ a ‘z’ a zaroven ‘z’ bude deklarovana ako iny potomok ako ‘x’ navratoveho reference typu)a ta poznamka sa tykala toho, ze z tych mojich dvoch alternativnych zapisov by som vybral ten prvy.
May 18th, 2009 at 22:33
Myslím, že je v tom jistý sémantický rozdíl. První if bych četl jako:”chci udělat nějakou věc, ale předem zkontroluju jestli náhodou neplatí toto, a když jo, tak to skrečuju hned na začátku s nějakou úklidově záchrannou varinatou”to druhé bych četl spíš jako”pokud platí tohle, uděl tohle, jinak udělej tamto”projeví se to spíš v přístupu:if( !cond1) { return…;}if( !cond2 ) { return…;}… atd.místo:if( cond1 ) { if( cond2 ) { if…. }}
May 19th, 2009 at 15:59
Ja to resim takhleback = z;if () { x = DoSomething(y); back= x;}return back;Podle mě by mel byt return az na konci metody nebo rutiny, a to pro prehlednost.
May 20th, 2009 at 18:18
Po diskuzi v postu if, else, return jsem si uvědomil, že mám v kapse ještě jeden případ, který je podobně
June 8th, 2009 at 14:28
To Patrik: chybička se vloudila. Nevím na co jsem myslel, ale bral jsem to tak, že ‘return’ odpovídá ‘retval = x’. Neuvědomil jsem si, že ‘return’ je návrat z podmínky s hodnotou a ne jen přiřazení hodnoty a jede se dál.
July 3rd, 2009 at 14:35
Ahoj,
podle mne je to téměř stejné a záleží na tom jak se to komu lépe čte.
Ale v případě, že tento if-else bude umístěno na konci funkce, pak případ č. 2 pravděpodobně nepřeložíš a nebo musíš mít ještě jeden return na konci funkce.
Share your thoughts, leave a comment!