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.

Odpovedet emailem