Autor Zpráva
Joecocker
Profil *
Zdravím,
mám dotaz ohledně Doctrine. Mám jakousi modelovou třídu, v které provádím update/delete atd. Tam mám třídy deleteById, updateById atd. A potřebuji to změnu promítnou nad danou entitou, či-li když tam mažu/updatuju podle ID, tak logicky potřebuji najít nejprve tu danou entitu podle ID. Od toho mam metodu findById, která nedělá nic jiného než zavolá nad repozitářem doctrinovské find($id).

No a teď jak správně řešit případ, když někdo zavolá například deleteById a jako id uvede takové, které neexistuje. Mě se nabízejí dvě varianty:

1. Když se volá find() tak vrací nalezenou entitu, nebo null. Či-li v delete/update kontrolvoat jestli mi nebyl vrácen null, pokud byl tak nic neprovedu a informuji controller, že tam tam záznam s ID není.
2. v té metodě findById už rovnou kontrolovat, zda nebyl vrácen null a pokud ano tak vyhodit vyjímku, ta pak probublá až ke controlleru, kde si ji odchytí ma zpracuji.

Co je lepší řešení, mě se zdá logicky nejlepší, neduplikuje se kontrola na null, nemůžu tedyn a tu kontrolu zapomenout, a v controlelru si ji hezky odchytnu. Nějaký jiný nápad?
preca1
Profil
Zdravim,
říct, co je lepší řešení, v tomhle případě podle mě nejde. Já bych to vyřešil způsobem 1. - vrátit null a všude kontrolovat.

Výjimky jsou trochu jako náboženství :). Je to věc názoru každýho programátora. Zeptej se 10 programátorů, každej ti řekne jinej názor, podloží ho argumentama a bude mít pravděpodobně pravdu. S kolegou jsme se o výjimkách bavili asi hodinu a neshodli jsme se. Přitom jsem jeho pohled chápal a dával smysl, ale nebyl mi tak blízkej.

Budeš si muset o nich něco nastudovat a udělat si vlastní názor, nebo věřit něčemu, co napsal někdo cizí na internetu a řídit se podle toho. When to use exceptions se mi zdá jako super začátek a určitě doporučuju přečíst i komentáře. Je jich tam pět a úplně z nich čiší ta ambivalentnost. Taky tahle diskuse na stackexchnge je super.

Ve zkratce:
- problém je v relativitě pojmu "výjimečný stav" - každý ho chápe jinak. Je neexistující záznam pro dané ID výjimečný z pohledu aplikace, resp. z pohledu toho, kdo chce daný záznam? Jak pro koho.
- výkon - výjimky nejsou zadarmo; pokud jich bude extrémně moc, může to být problém. Vždycky záleží na konkrétní situaci a nejde obecně říct, kolik je "tak akorát".
- čitelnost a chápání kódu - někomu může dělat problémy sledování toku proudu při používání výjimek - kde se ona výjimka odchytává a kdo zajistí, aby se uživateli nezobrazil stack trace? Je čitelnější try catch blok, nebo if else?
Joecocker
Profil *
Díky za reakci. Já asi dám v tomhle případě na exeption. Protože ve většině případů já očekávám, že id v databnázo bude. Jelikož k findu podle id se dostane uživatel, jen kliknutím na odkaz. Či-li neexistující záznam získá jen přepsáním v URL, tím je to pro mě spíše výjimečný stav. No a hlavně taky, Například když mám delete, tak volám z controlleru deleteById() a ten pak volá právě find() a pošle tu entitu na delete. No a pokud mám výjimku, tka mi ta výjimka probublá hezky až do controlleru.

Kdežto pokud bych controloval jen jestli není null, tak bych musel mít kontrolu v tom deleteById a pokud by byl null, tak co mám udělat. Vracet null? False? to přece od metody deleteById neočekávám, proto dává smysl vyhodit výjimku záznam nenalezen...
joe
Profil
Jednoduše,

find má vrácet nějaké záznamy, takže je buď vrátí nebo nevrátí, tj. NULL.
update a delete mají provést nějakou akci a ta akce se buď zdařila a nebo nezdařila, za mě tedy buď TRUE nebo FALSE. Jiné by to bylo v případě fluent interface.
Vyjímky bych vyhazoval v případě, že někdo zadá nesprávné parametry metodám jakési modeové třídy.
aDAm
Profil
a co takhle si prně udělat findbyid a když se nic nenajde hodit hlášku že co není nejde mazat a když je tak normálně zavolat delete. Jinak stavy kontrolovat a vyhazovat výjimky a patřičně je chytat a zpracovávat.
Joecocker
Profil *
aDAm: máš na mysli, udělat si ten findById v tom controlleru a pokud to něco vráti tak teprve pak mazat? Ano to mě taky napadlo. Ale není tohle lepší mít právě v modelu? Když bduu mít api volané vzdáleně, tak taky budu chtít deleteById()...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: