Použít assert nebo if jako ověřování kritérií za běhu programu? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Použít assert nebo if jako ověřování kritérií za běhu programu? – C / C++ – Fórum – Programujte.comPoužít assert nebo if jako ověřování kritérií za běhu programu? – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
ondrej39+1
Věrný člen
18. 12. 2014   #1
-
0
-

Ahoj,

vytvářím projekt v němž chci mít červeno černý strom a samozřejmě mi přišlo zbytečné to dělat úplně od začátku, tak jsem našel již implementovanou strukturu.Programátor v kódu používá assert funkci, což mě překvapilo.

Z dokumentace jsem se dočetl, že assert ověřuje kritické stavy, když se stav ověřit nepovede, tak třeba aplikaci odstřelí, a na stackoverflow jsem se dočetl, že assert by se měl používat výhradně jako ladící nástroj.

Je tedy lepší ve finále předělat assert podmínky normálně na if, například následujícím způsobem pro metodu grandparent:

Uzel * R_B_Strom::prarodic(Uzel * uzel)
{
	if (uzel != NULL && uzel->rodic_ != NULL && uzel->rodic_->rodic_ != NULL)
		return uzel->rodic_->rodic_;
	else
		return NULL;	
}
Nahlásit jako SPAM
IP: 213.226.234.–
Inject all the dependencies!
Kit+15
Guru
18. 12. 2014   #2
-
0
-

#1 ondrej39
Assert v běžném provozu neměl být závislý na uživatelských datech, může však detekovat selhání programu.

Místo "return NULL;" je často výhodnější NullObject.

Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ondrej39+1
Věrný člen
18. 12. 2014   #3
-
0
-

#2 Kit
Chápu to tedy správně, že data a algoritmy, která nejsou závislá na samotných uživatelích programu, ale jsou napevno dána v kódu, je možné ověřovat pomocí assert macra, protože pokud je macro dobře použité a jsou ověřeny podmínky, uživatel by nikdy neměl zjistit, že tam vůbec je?

Co se NullObject týče, to vrací právě assert při chybě, resp. nesplnění kritické podmínky?

Nahlásit jako SPAM
IP: 213.226.234.–
Inject all the dependencies!
Kit+15
Guru
18. 12. 2014   #4
-
0
-

#3 ondrej39
Ano, asserty jsou pouze na detekci vlastních chyb programátora. U odladěných aplikací se většinou vypínají kvůli úspoře výkonu, proto s jejich funkčností za běhu nesmíš počítat.

NullObject nevyhazuje žádný assert. Tváří se, jako kdyby fungoval, ale nic nedělá. Nemusíš pak při spouštění metod testovat, zda objekt existuje nebo ne a rovnou tu metodu spustíš. Místo  

if (uzel != NULL && uzel->rodic_ != NULL && uzel->rodic_->rodic_ != NULL)
	return uzel->rodic_->rodic_;
else
	return NULL;

píšeš jen  

return uzel->rodic_->rodic_;
Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ondrej39+1
Věrný člen
18. 12. 2014   #5
-
0
-

#4 Kit
To úplně nechápu. Myslíš to tak, že po dokončení programu a zjištění, že správně funguje, veškerá assert macra prostě z kódu oddělat a například v metodě prarodič by mi opravdu zůstal jen ten return, jak píšeš?

Nahlásit jako SPAM
IP: 213.226.234.–
Inject all the dependencies!
Kit+15
Guru
18. 12. 2014   #6
-
0
-

#5 ondrej39
Ty asserty se vypínají pouhou změnou parametru při spouštění aplikace. Ve zdrojáku zůstávají.

Je možné, že autor prostě nepočítal s tím, že by tam ten NULL mohl nastat, ale jen si to chtěl posichrovat assertem. To je v naprostém pořádku.

Na řízení běhu programu se však assert použít nesmí. Proto se také AssertException nezachytává.

Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ondrej39+1
Věrný člen
18. 12. 2014   #7
-
0
-

#6 Kit
Pokud bych tedy programoval algoritmus, kde bych se odkazoval na prarodiče určitého uzlu, který by prarodiče neměl

prarodic(uzel_bez_prarodice);

a měl v kódu assert, tak mi program spadne? Tím tedy budu vědět, že program mám udělaný špatně a je třeba ho opravit, je to tak? Naopak pokud bych tam assert neměl, vyvolal bych metodu prarodic na uzel, který prarodiče nemá, tak mi metoda vrátí NULL pointer, což pochopitelně nechci.

Nahlásit jako SPAM
IP: 213.226.234.–
Inject all the dependencies!
Kit+15
Guru
18. 12. 2014   #8
-
0
-

#7 ondrej39
Tak nějak to bude. Původní program jsem moc nezkoumal.

BTW: klíčové slovo "else" za returnem je zbytečné a je lepší ho nepoužívat. Podmínku by bylo dobré negovat.

Nahlásit jako SPAM
IP: 37.48.41.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
vitamin+8
Grafoman
18. 12. 2014   #9
-
0
-

#7 ondrej39
assert vecsinou funguje tak ze v debug mode sa testuje a v release mode sa asserty ignoruju.

Tak ako ti povedal Kit, asserty nemaju byt zavysle na vstupnych datach.

Ja pouzivam asserty na otestovanie chyb ktore by nemali nikdy nastat, testovanie takychto chyb pomocou if-ov vynimiek... zbytocne spomaluje program a zneprehladnuje kod, preto sa na ne hodi asserty ktore sa v release mode ignoruju.

Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
ondrej39+1
Věrný člen
18. 12. 2014   #10
-
0
-

#8 Kit
Jo, máš pravdu, že else je v mém případě zbytečné díky returnu.

#9 vitamin

Pánové, každopádně díky za odpovědi, oběma :).

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
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, 70 hostů

Podobná vlákna

Konec běhu programu — založil Polarski

Zrychleni behu programu — založil VeverkaVeveri

Zastaveni behu programu — založil Tom@sQo

Moderátoři diskuze

 

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