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:
#2Kit
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?
#3ondrej39
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
#4Kit
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š?
#6Kit
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.
#7ondrej39
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. "