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. -- Zdenek Tronicek FIT CTU in Prague Ondra Medek napsal(a): > Ano, narazim na tvoje tvrzeni o "assert": > > "Použití má smysl tam, kde sám píšu metodu i volání (nebo já píšu > metodu a kolega z týmu volání)." > > Podle mne i v tomto pripade je lepsi misto "assert" pouzivat klasicke > if ... throw nebo aspon zalogovat error pres logging (zalezi podle > situace). Zadne testovani neodhali vsechny chyby, tj. nektere chyby se > projevi az v produkcnim prostredi a tedy nebudu psat testy, ktere jsou > na produkcni vypnute. > > > > 2011/4/3 "Zdeněk Troníček" <[email protected]>: >> Asi Ti moc nerozumím. To myslíš tak, že budeš na produkci testovat, zda >> nevoláš metodu se špatnými parametry a pokud ano, tak vyhodíš výjimku? >> To >> mi připadá na stejné úrovni jako chytání ArrayIndexOutOfBoundsException >> pro případ, že bychom použili neplatný index pro přístup k poli. >> Ne že by to nešlo, ale výjimky slouží primárně k ošetření neočekávaných >> (výjimečných) událostí a ne k detekci či řešení chyb programátora. >> >> Jinak assert je dost vidět ve zdrojácích NetBeans. >> >> Z. >> -- >> Zdenek Tronicek >> FIT CTU in Prague >> >> >> Ondra Medek napsal(a): >>> No vzhledem k tomu, ze "By default, assertions are disabled at >>> runtime.", tak bych rekl, ze ten Java "assert" slouzi spise pro >>> debugovani a testovani. Vsude, kde chceme mit kontroly i na produkci, >>> tak musime pouzit vlastni kod if ... throw. Tedy IMHO assert muze >>> obsahovat i narocny kod (prochazeni pole, alokace pameti). >>> >>> Podole mne bylo asi zamyslene pouziti "assert" takove, za na produkci >>> jsou vyple. Kdyz se treba narazi na divny problem, tak se muze spustit >>> aplikace s -ea a treba assert zafunguje a problem odhali. Ale >>> java.logging a podobne resi stejnou vec elegatneji. >>> >>> Je vubec nejaky znamy open source Java projekt, ktery by "assert" >>> pouzival? >>> >>> >>> >>> 2011/4/1 "Zdeněk Troníček" <[email protected]>: >>>> Nejde ani tak o viditelnost metody, ale o to, zda je metoda součástí >>>> API. >>>> Klíčové slovo assert kontroluje podmínku, o které je programátor >>>> přesvědčen, že platí. Motivací pro používání assert je snaha dozvědět >>>> se >>>> co nejdříve o tom, že je něco špatně. Použití má smysl tam, kde sám >>>> píšu >>>> metodu i volání (nebo já píšu metodu a kolega z týmu volání). >>>> Naproti tomu výjimka IllegalArgumentException slouží k informování >>>> volájícího, že zavolal metodu s nesprávnými argumenty. Hodí se tam, >>>> kde >>>> jde o metodu API, které bude přístupné někomu z vnějšku (tj. mimo >>>> systém). >>>> >>>> Z.T. >>>> -- >>>> Zdenek Tronicek >>>> FIT CTU in Prague >>>> >>>> >>>> Ondra Medek napsal(a): >>>>>> Aserce kontroluji, zda modul dostava spravne vstupy a jeho stav je >>>>>> korektni. Je to takova velmi omezena varianta Design by Contract. >>>>>> Nemely by se pouzivat na overovani vstupu od uzivatele, jen na >>>>>> obranu >>>>>> pred programatorskymi chybami. >>>>>> Typicke pouziti: >>>>>> Scitac je napsan jen pro nezaporna cisla. To je popsano v >>>>>> dokumentaci. >>>>>> Na jeho zacatku se assertem overi, ze cisla skutecne nejsou zaporna. >>>>>> Pokud by ho nejaky programator pouzil spatne, brzy se to dozvi. >>>>>> (Otazkou je, zda trebas tady radeji nepouzit >>>>>> InvalidArgumentException, >>>>>> hranice je neostra.) >>>>> >>>>> Java assert se nema pouzivat na kontrolu parametru public metod, viz >>>>> http://download.oracle.com/javase/1.4.2/docs/guide/lang/assert.html#usage-conditions >>>>> Asi protoze ten assert se ma na produkci vypinat. >>>>> >>>>> Misto toho treba Spring ma Assert tridu: >>>>> http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/util/Assert.html >>>>> (A ja si taky kdysi jednu vyrobil: >>>>> http://xmedeko.blogspot.com/2010/12/java-simple-assert-class-for-design-by.html) >>>>> >>>> >>>> >>> >>> >>> >>> -- >>> Ondra Medek >>> >> >> > > > > -- > Ondra Medek >
