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

  • DeaLer
    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á.

  • Milan Horák
    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’.

  • ober
    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;

  • Aleš Roubíček
    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. :)

  • T
    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.

  • Patrik
    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.

  • cincura.net
    May 18th, 2009 at 09:56

    Ja taky ne, ale ucim se s tim zit. :)

  • T
    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.

  • pazu
    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…. }}

  • basta74
    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.

  • cincura.net
    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ě

  • Milan Horak
    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.

  • Martin Starzyk
    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!