Nevěřím .... – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Nevěřím .... – Java – Fórum – Programujte.comNevěřím .... – Java – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
13. 4. 2010   #1
-
0
-

Vážení,

rád bych se Vás zeptal, na jednu teoretickou maličkost. Představte si, že v jisté části aplikace voláte metodu, která přebírá několik parametrů, např. void zobrazNeco(int mesic). Tato metoda uvnitř prochází seznam objektů a hledá nějaký, která se s daným parametrem shoduje, přičemž se počítá se situací, kdy žádná taková položka neexistuje (tento stav je ošetřen podmínkou a následně je vyhozena výjimka). Řešení vypadalo zhruba následovně.

try {

int mesic = ...; // získání hodnoty
zobrazNeco(mesic);
}
catch (Exception ex) {
... // vypsání informace, že byl zadán chybný měsíc, apod.
}


Mě je takové řešení (s pomocí výjimek) dost proti srsti, ale údajně je to doporučený postup. Že prý je to lepší, než např. v dané metodě vrátit bool a podle toho se zachovat (příp. jiné řešení). Jaký na to máte názor?

Nahlásit jako SPAM
IP: 88.146.16.–
Dušan Janošík | web: djanosik.cz, @djanosik
Reklama
Reklama
Baseilos0
Duch
14. 4. 2010   #2
-
0
-

To djanosik : Ja som rozhodne za vynimky. Riadim sa heslom, pokial funkcia nedokaze vratit zmysluplnu hodnotu potom zlyhala, teda radsej vyhodit vynimku. Navratove hodnoty a ich spracovanie povazujem v jazykoch podporujuce vynimky za bad practice.

Nahlásit jako SPAM
IP: 147.175.182.–
liborb
~ Redaktor
+18
Guru
14. 4. 2010   #3
-
0
-

Co se týká teorie, tak vyjímka má svoje opodstatnění. Stejně jako návratová hodnota. Každá z nich se hodí na něco jiného. Použití vyjímek dokáže třeba zpřehlednit/zjednodušit kód:



if (create()) {
if (connect()) {
if (write()) {
if (read()) {
}
else {
// chybove hlasenni a reakce na chybu
}
}
else {
// chybove hlasenni a reakce na chybu
}
}
else {
// chybove hlasenni a reakce na chybu
}
}
else {
// chybove hlasenni a reakce na chybu
}

// - - - -

try {
create();
connect();
write();
read();
}
catch(Exception e) {
}
finally {
close();
}



Další věcí je, že pokud máš nějakou svojí funkci a odmítáš :smile1: používat vyjímky, tak knihovní funkce je nejspíš používat budou, takže nakonec si nucen se jimi stejně zabývat. A samozřejmě není od věci připopemnout, že Java nutí do ošetřování vyjímek, u návratových hodnot by asi nic takového nešlo. Je to jako vždy, při rozumném používání je to báječná věc.

No a co se týká praxe, tak jsem zastydnul na podobném bodě jako ty - je mi pořád bližší ta stará dobrá návratová hodnota. Jednak je to tím, že jsem se "formoval" v době, kdy vyjímka nebyla taková modla a za druhé v C++ po nich není takový hlad. Nehledě na to, že ani nevím, jestli by se případně daly využít v COM/DCOM :smile11:

Nahlásit jako SPAM
IP: 85.207.166.–
14. 4. 2010   #4
-
0
-

Díky všem za reakce.

To liborb : Jistě, vím, ale v této konkrétní situaci mě to prostě nesedí a nevěřím, že v případě Javy existuje jakési obecné doporučení, které výjimky upřednostňuje. Totéž mi tvrdil o .NETu, ale o tom bych určitě něco věděl. Osobně jsem se setkal spíše s opačným doporučením, které říká, že je lepší řešit situace jinak než s pomocí výjimek, protože mají zbytečně velkou režiji. Ale samozřejmě to nelze uplatňovat všude, v mnoha situacích je výjimka jediná rozumná možnost.

Zrovna řešení s návratovou hodnotou je staré (pochází snad z dob C/C++) a často nešťastné, ale někdy mi prostě připadá elegantnější / efektivnější nebo já nevím co. Samozřejmě to není jediné možné alternativní řešení.

BTW: Tady jde o to, že ta chyba už je ošetřená podmínkou uvnitř té metody, ale navrch se ještě vyhazuje výjimka. Tedy dvakrát dělá totéž, jednou s pomocí podmínek, podruhé s pomocí výjimek. Jsou situace, kde je to vhodné (při vývoji knihoven, apod), ale tady podle mě ne.

Nahlásit jako SPAM
IP: 88.146.16.–
Dušan Janošík | web: djanosik.cz, @djanosik
liborb
~ Redaktor
+18
Guru
14. 4. 2010   #5
-
0
-

Bral jsem tu tvojí otázku spíše v obecné rovině, ale pokud chceš vyjádření ke konkrétní situaci (jeden parametr) ... tak se přikláním na stranu bez vyjímky. Pokud je funkce koncipována tak, že počítá s každou možností, nebo-li žádný vstup není chybový, tak v tom případě vyjímka není i dle mého názoru potřeba.

Nahlásit jako SPAM
IP: 85.207.166.–
Quiark0
Věrný člen
14. 4. 2010   #6
-
0
-

Tohle téma je podobné jako jestli je lepší Windows nebo Linux.. na obou stranách krvelační zastánci a pravdu přitom nemá ani jeden. Pravda je ta, že výjimky mají určitou režii, platí to minimálně pro C++ a .NET. A co jsem já slyšel, tak pokud se počítá s tím, že to občas nenajde, má se používat ta návratová hodnota.

Nahlásit jako SPAM
IP: 147.251.55.–
14. 4. 2010   #7
-
0
-

To Quiark : Možná ano, ale já se spíše snažím najít nějaké objektivní východisko (v konkrétní situaci), ne obhájit nějakou svou pravdu, proto jsem se zeptal :) Každopádně díky za názor.

Nahlásit jako SPAM
IP: 88.146.16.–
Dušan Janošík | web: djanosik.cz, @djanosik
ahl
~ Anonymní uživatel
8 příspěvků
26. 4. 2010   #8
-
0
-

Obecně bych řekl, že v případě kdy nejde vrátit smysluplná hodnota je lepší použít výjimku. Ten tvůj příklad je hodně zjednodušený. Představ si, že funkci pro získání měsíce voláš někde v logice aplikace. Když ti vrátí nesmyslnou hodnotu, tak v podstatě nemáš jinou možnost než vyhodit výjimku(s chybnými daty nemá cenu pracovat) a odchytit ji v prezentační vrstvě, kde se zobrazí informace o chybě. Často ve větších aplikacích, prostě nemáš dost informací na to, abys mohl chybu vyřešit rovnou v místě, kde vznikne. V jednodušších programech výjimky často vypadají jako zbytečná komplikace. Výjimky mají tu výhodu, že když neumím nebo nechci řešit chybový stav, tak jí prostě nechám propadnout dál.

Nahlásit jako SPAM
IP: 86.61.140.–
26. 4. 2010   #9
-
0
-

To ahl : Ano, ale to už je jiná situace.

Nahlásit jako SPAM
IP: 89.203.157.–
Dušan Janošík | web: djanosik.cz, @djanosik
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 45 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý