Dobrý den,
Abych přidal další názor do diskuse :)
Upozorňuju že už je to asi malinko mimo původní záměr (assert vs. JUnit)
1/ Veřejné API + místa, která se často mění a způsobují problémy (taková
by správně neměla existovat, ale občas se stane) řešíme pomocí if ...
throw IllegalArgumentException s nějakým rozumným popisem toho co se stalo.
2/ Na privátní metody (nebo spíš obecně neveřejnou část nějakého kusu
aplikace) potom Assert (ano s velkým A neboť se jedná o třídu
http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/api/org/eclipse/core/runtime/Assert.html
- používáme platformu Eclipse, takže je tato třída po ruce).
Tento postup má jednu nevýhodu a tou je výkon. Kontrola assertů probíhá
vždy i v kódu, který je nasazený. Nicméně tato nevýoda je vysoce
převážena tím, že se nemusí aplikace po zjištění nějakého problému
nasadit znovu a pak začít tepvre ladit co se asi stalo. To je metoda
bohužel nepřípustná. Assert je samozřejmě opět spojen s nějakou hláškou
o tom, co se vlastně stalo.
3/ (trochu offtopic) na místa, kde je potřeba sledovat co přesně
aplikace dělá nějakou dobu po nasazení do produkce se dá díky Log4j (a
stejně tak jakékoliv implementaci java.util.logging aparátu) psát if
(log.isDebugEnabled) { udělej hrozně složitý výpočet a zaloguj ho }.
Takto jakmile vypnu debug, tak se overhead sníží pouze na jednu rychlou
podmínku narozdíl od verze log.debug(opět hrozně složitý výpočet), kde
proběhne výpočet vždy a teprve potom se řeší jestli se zaloguje nebo ne.
Tady bych ještě doporučil jednu aplikaci, která mě nedávno velice
příjemně potěšila a to je LogMX na který jsem přišel zde:
http://www.java.cz/article/log4j-reader-logmx a velice se osvědčil (bylo
třeba jenom překopírovat nastavení formátu log4j, aby LogMX věděl co s tím)
Samozřejmě se to jako obvykle nedá generalizovat, ale toto jsou naše
guidelines a třeba to někoho inspiruje ;)
S pozdravem
Lukáš Záruba (Lukas Zaruba)
Dne 4.4.2011 10:12, "Zdeněk Troníček" napsal(a):
Tímto argumentem můžeš obhajovat používání if ... throw kdekoliv. I v
privátních metodách.
Můj názor je, že assert je na tomto místě lepší a to ze dvou důvodů:
1) assert můžeme snadno zapnout a vypnout a to i selektivně pro dané třídy,
2) kód s příkazem assert je kratší a srozumitelnější - je hned jasné, že
jde jen o verifikaci nějakého invariantu a že nejde o logiku aplikace.
Z.