Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)
Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:30.11.2013 13:26

Zdravím, občas přemýšlím co je z hlediska implementace lepší použít. Někdy mám například metodu která má něco provést, někdy metoda úlohu neprovede (například nejsou splněny všechny požadavky).
Je jasné, že pokud i uvnitř metody může dojít k výjimce, je lepší zachytit výjimku v té metodě a zpropagovat dál. Ale, občas jsme si 99% jistí, že v dané metodě k výjimce nedojde, pouze se úkon provede nebo provede. Není po tom jednodušší aby metoda vracela BOOL, tedy TRUE = vše proběhlo v pořádku, FALSE = neproběhlo v pořádku, ale mě je jasné proč (v metodě se dělá například jenom jeden úkon).

Zpravidla používám vždy výjimky, ale chci se takhle zeptat, vždy výjimky nebo někdy "jednodušší" způsob pouhým vrácením BOOL ?

Odpovědět 30.11.2013 13:26
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Petr Nymsa
Zdeněk Pavlátka:30.11.2013 13:33

bool se vracelo v jazyce C. :D Ale u spousty metod se vyplatí bool více(rychlost, přehlednost) - např tryParse...

Nahoru Odpovědět 30.11.2013 13:33
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Petr Nymsa
Kit:30.11.2013 13:40

Výjimky se v zásadě používají vždy, pokud je něco špatně, i kdyby to mělo být v polovině případů. Pokud selže připojení k databázi, je to výjimka. Pokud je chyba v SQL dotazu, je to výjimka. Pokud někdo ve formuláři místo čísla domu napíše ulici, je to také výjimka.

Naopak se výjimky nemají používat k řízení toku programu. Ukončovat cyklus nebo metodu výjimkou, když vše proběhlo OK, se prostě nemá. Pokud proces proběhne přesně tak jak má, nikdy by k vyhození výjimky nemělo dojít.

Nahoru Odpovědět 30.11.2013 13:40
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
Petr Nymsa:30.11.2013 13:40

Mě je jasný že Výjimky je lepší způsob, ale občas mě přijde že pouhé vracení bool je přehlednější, sám jak říkáš, třeba tryParse

Nahoru Odpovědět 30.11.2013 13:40
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Petr Nymsa
Jan Vargovský:30.11.2013 13:42

Používám oboje :)

 
Nahoru Odpovědět 30.11.2013 13:42
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Kit
Petr Nymsa:30.11.2013 13:49

Jasný :) A co například použití v této situaci.
metoda načítá data (metoda jménem NactiData) například ze souboru. Uvnitř NactiData mám Try/Catch blok ale zvenku, tedy kde metodu volám, chci vědět pouze jestli se načetlo či ne (true / false). Je lepší výjimku z metody NactiData zpropagovat dál, nebo aby vracela bool ?

Nahoru Odpovědět 30.11.2013 13:49
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na Petr Nymsa
Drahomír Hanák:30.11.2013 13:54

Obvykle když načítám data, chci ta data. Pokud se nenačtou, tak je to prostě chyba. Nenapadá mě teď situace, kdy bych potřeboval načítat něco, co vlastně nechci. Jinak by se tedy vracel boolean, ale rozhodně bych metodu v tomhle případě nepojmenoval NactiData.

 
Nahoru Odpovědět  +2 30.11.2013 13:54
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Petr Nymsa
Zdeněk Pavlátka:30.11.2013 13:54

Já mám radši bool - takže bych ho určitě použil.

Nahoru Odpovědět 30.11.2013 13:54
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Petr Nymsa
Kit:30.11.2013 13:58

V tomto případě je zpravidla lepší tu výjimku v metodě vůbec nezachytávat a vypropagovat ji ven. Získáš tím i důvod, proč se data nenačetla a můžeš ho ze všech možných výjimek zachytit jedním catch a zalogovat nebo vypsat v dialogovém okně.

Výhodou je, že po návratu z metody, která může selhat, nemusíš vůbec nic testovat. Ani ten bool, ani výjimku. Tu si můžeš ošetřit klidně o pár úrovní výš. Aplikace se tím hodně zjednoduší.

Nahoru Odpovědět  +1 30.11.2013 13:58
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Drahomír Hanák
Petr Nymsa:30.11.2013 13:59

Mám to ve Wrapperu, tedy takový Manager, který data drží a já pouze chci pouze říct, ať teď ty data načte. Manager mi ty data drží, umí je načíst i uložit. Takže ta metoda mi data nevrací, pouze říká a teď ty data načti. Tím pádem mě spíše zajímá akorát jestli se mu data podařila načíst.

Nahoru Odpovědět 30.11.2013 13:59
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Petr Nymsa
Jakub Lásko[Saarix]:30.11.2013 14:02

Toť otázka :-) asi bych tady neviděl problém v použití bool, pokud prakticky řešíš jen zda se data načetla či ne. Možná ale pokud budeš zohledňovat nějaký jiný postup u toho, když by ti NactiData třeba vyhodilo chybu soubor neexistuje (zdroj), tak pak je asi na zvážení, zda u této chyby nějak jinak zakročíš.
Pokud ne, tak je asi určitě lepší použít bool.

Editováno 30.11.2013 14:03
Nahoru Odpovědět 30.11.2013 14:02
Časem je vše možné.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Petr Nymsa
Kit:30.11.2013 14:02

Jenže tebe nezajímá, jestli se data podařilo načíst. Dal jsi metodě rozkaz a ten musí splnit. Pokud ho nesplní, je to výjimka.

Nahoru Odpovědět 30.11.2013 14:02
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Kit
Petr Nymsa:30.11.2013 14:04

Hmm, to je právě co občas řeším :). Ale z 90% výjimky používám. Takže asi i zde bude lepší výjimku zpracovat.

Nahoru Odpovědět 30.11.2013 14:04
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jakub Lásko[Saarix]
Kit:30.11.2013 14:05

Jenže výsledek toho bool musí zbytečně testovat a musí na výsledek nějak reagovat. To jen znepřehlední aplikaci.

Nahoru Odpovědět 30.11.2013 14:05
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Theodor Johnson
Redaktor
Avatar
Odpovídá na Petr Nymsa
Theodor Johnson:30.11.2013 14:15

Nemusíš nutně vracet bool, můžeš přeci rovnou vrátit zprávu s chybou a testovat ji na hodnotu null

Nahoru Odpovědět  -2 30.11.2013 14:15
Přecházím na "Cross-Platform Development"
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Petr Nymsa
David Čápka:30.11.2013 14:17

Všechny chyby bys měl řešit přes výjimky, protože od toho v jazyce jsou. Koukni se na PHP, je tam vidět, co se stane, když se míchá výstup s chybovou hodnotou.

Nahoru Odpovědět  -1 30.11.2013 14:17
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na David Čápka
Petr Nymsa:30.11.2013 14:18

Dobrá, přesvědčili jste mě úplně :)

Nahoru Odpovědět 30.11.2013 14:18
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Kit
Redaktor
Avatar
Odpovídá na Theodor Johnson
Kit:30.11.2013 14:23

Pokud metoda vrátí null, proběhla OK? To bych ještě překousl, ale nepřekousnu, když dostanu hlášení o chybě datovým informačním kanálem místo chybového. Víš, jak blbě se to pak dál zpracovává?

Nahoru Odpovědět 30.11.2013 14:23
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Theodor Johnson
Redaktor
Avatar
Odpovídá na Kit
Theodor Johnson:30.11.2013 14:38

Nevím jak těžký je pro tebe zpracovat instanci Systém.Exception

Nahoru Odpovědět 30.11.2013 14:38
Přecházím na "Cross-Platform Development"
Avatar
Kit
Redaktor
Avatar
Odpovídá na Theodor Johnson
Kit:30.11.2013 14:45

Když už mám výjimku, tak nemusím zpracovávat žádný boolean či null.

Nahoru Odpovědět 30.11.2013 14:45
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Theodor Johnson
Redaktor
Avatar
Odpovídá na Kit
Theodor Johnson:30.11.2013 14:51

V tom s tebou souhlasím, já jsem měl na mysli spíš návratovou hodnotu metody

Nahoru Odpovědět 30.11.2013 14:51
Přecházím na "Cross-Platform Development"
Avatar
Kit
Redaktor
Avatar
Odpovídá na Theodor Johnson
Kit:30.11.2013 15:34

Může být klidně void.

Nahoru Odpovědět 30.11.2013 15:34
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 22 zpráv z 22.