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á?




#1 by DeaLer on 15.5.2009 - 00:58
Quote
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á.
#2 by Milan Horák on 15.5.2009 - 06:06
Quote
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’.
#3 by ober on 15.5.2009 - 07:45
Quote
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;
#4 by Aleš Roubíček on 15.5.2009 - 08:40
Quote
Čí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.
#5 by T on 15.5.2009 - 08:50
Quote
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.
#6 by Patrik on 18.5.2009 - 09:42
Quote
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.
#7 by cincura.net on 18.5.2009 - 09:56
Quote
Ja taky ne, ale ucim se s tim zit.
#8 by T on 18.5.2009 - 16:25
Quote
@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.
#9 by pazu on 18.5.2009 - 22:33
Quote
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…. }}
#10 by basta74 on 19.5.2009 - 15:59
Quote
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.
#11 by cincura.net on 20.5.2009 - 18:18
Quote
Po diskuzi v postu if, else, return jsem si uvědomil, že mám v kapse ještě jeden případ, který je podobně
#12 by Milan Horak on 8.6.2009 - 14:28
Quote
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.
#13 by Martin Starzyk on 3.7.2009 - 14:35
Quote
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.