IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Ako sa vyhnúť break-u

Aktivity
Avatar
Benjibs
Člen
Avatar
Benjibs:23.6.2013 9:18

Mám tento kód:

http://www.itnetwork.cz/dev-lighter/124

Všeobecne na fórach som natrafil na názory, že break-u a continue je lepšie sa vyhýbat (kedže sú to vlastne GOTO). Ako upraviť cyklus for tak, aby v ňom break nebol potrebný?

Odpovědět
23.6.2013 9:18
1 + 1 = 2
Avatar
Neaktivní uživatel:23.6.2013 9:24

Konkrétně v tomto případě by se dala proměnná "is_prime" přesunout do podmínky ve for cyklu.

boolean is_prime = true;
for (int i = 2; i < (number / 2 + 1) && is_prime; i++ )
{
    if (number % i == 0)
    {
        is_prime = false;
    }
}

Nicméně obecně bych se vůbec breaku a continue nebál.

Nahoru Odpovědět
23.6.2013 9:24
Neaktivní uživatelský účet
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Benjibs
Kit:23.6.2013 9:49

Pokus se to udělat bez proměnných is_prime a is_valid. Obvykle stačí trochu přeházet řádky a nebudeš potřebovat ani break. Testování prvočísla můžeš přesunout do try-catch včetně výstupu výsledku. Hlavní cyklus se pak nebude ptát na is_valid, ale zda chceš testovat další prvočíslo.

break a continue použít můžeš, ale je dobré jimi šetřit.

Nahoru Odpovědět
23.6.2013 9:49
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Benjibs
David Hartinger:23.6.2013 10:16

Break se často nahrazuje returnem, když je kód v metodě.

Nahoru Odpovědět
23.6.2013 10:16
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Benjibs
Kit:23.6.2013 10:33

Tady to přímo vybízí k vytvoření metody

boolean is_prime(int number)

Výstup se pak krásně zjednoduší:

System.out.printf("Zadané číslo %d %s prvočíslem.",
    number, is_prime(number)?"je":"není");
Nahoru Odpovědět
23.6.2013 10:33
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Benjibs
Člen
Avatar
Benjibs:23.6.2013 10:39

Neexistuje tu nejaká klauzula, ktorej blok kódu sa vykoná, keď cyklus vykoná všetky predom avizované iterácie? (bez breaku alebo vyvolania výnimky)

Pri písaní 'prvočíselných úloh' v iných jazykoch som sa vždy spoliehal na ňu.

Editováno 23.6.2013 10:40
Nahoru Odpovědět
23.6.2013 10:39
1 + 1 = 2
Avatar
Benjibs
Člen
Avatar
Benjibs:23.6.2013 10:43

Už ju nepotebujem, metóda to krásne vyriešila :)

Nahoru Odpovědět
23.6.2013 10:43
1 + 1 = 2
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Benjibs
Kit:23.6.2013 10:55

Existuje hodně elegantních řešení. Ty nejlepší jsou známy pod pojmem "design patterns" neboli "návrhové vzory". Není však vhodné se je učit nazpaměť, je potřeba se k nim postupně propracovat.

Nahoru Odpovědět
23.6.2013 10:55
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Benjibs
Člen
Avatar
Benjibs:23.6.2013 11:07

Len ešte vyvstal z toho taký malý problémik :D
Vždy, keď dávam z definovanej metódy 'is_prime'

return nejaka_hodnota;

tak niečo zaprotestuje a označí mi to slovo void v metóde main, uprostred ktorej je tá moja metóda definovaná.
Alebo ju mám dať mimo main?

Nahoru Odpovědět
23.6.2013 11:07
1 + 1 = 2
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Benjibs
Kit:23.6.2013 11:18

Dej ji mimo main, ale uvnitř class.

Nahoru Odpovědět
23.6.2013 11:18
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.