Nápady z Objective-C pro Javu

Aneb úvaha o "tichém zahazování chyb"…

V Objective-C není ve zvyku vyhazovat výjimky. Jednak to zesložiťuje práci s pamětí a druhak to není potřeba - stačí doplnit do pointeru NSError příslušnou chybu a o ošetření se postará volající. Odpadne tím drahé vyvolávání výjimky a její následné odchytávání pomocí @try/@catch/@finally bloku. Druhak, odpadne velmi špatný návyk přinesený z Javy a tím je vyhazování výjimky kvůli každému "prdu".

Spojme si nyní toto chování s další vlastností Javy: neschopnost zaslat null objektu zprávu. To už je dost nepříjemná vlastnost vedoucí ke spoustě konstrukcí typu: if (objekt == null) throw new IllegalStateException("…"); Při představě, že ošetřuji takto 5 objektů mě jímá hrůza.

Proč vlastně takovouto kontrolu, která vyhazuje výjimku píšeme? V Objective-C necháme volání normálně "propadnout". Pakliže je volající natolik neschopný a nečte dokumentaci nebo zrovna vypnul mozek, tak ať si klidně metodu zavolá. Ta však nic neudělá, zprávy do nil objektů zasyčí jak němci do krytu a nic se nestane. Teď asi většina Javistů začne protestovat: "Ale jak já poznám, že je něco špatně, když mi to nic nevyhodí??" Jak? Nu přeci pomocí testů, které tak rádi všichni používáme! Proč by měl program spadnout za běhu, když beztak se musí pak chyba ošetřit novým patchem? To už je docela pozdě, ne? Nezajišťujeme si takto vyhozenou výjimkou onen pohodlný polštář, který nás chrání v případě lenosti a nepsání testů, "aby to aspoň vypadlo za runtime"?

Takovýto nechutný zlozvyk nám Objective-C zrovna moc neusnadňuje, takže už od počátku psaní počítáme s tím, že se nemusí volání podařit. Nespoléháme se na to, že se kdyžtak vyhodí výjimka a pak to z logů nějak najdem. Změňme svět a zařiďme podobné chování i v Javě. Není nic snažšího, než před každý objekt (byť potupně) přidat kontrolu na null objekt a v případě null nic nevolat. Ano, je pravda, že takovou to zbytečnost bychom v Objective-C dělat nemuseli, ale budiž…

Abychom však nebyli takoví škrti, pojďme si přeci jenom udělat drobné programátorské pohodlí - než-li zprávu u null objektu ignorujeme, můžeme si ji alespoň zalogovat. Warning level je docela příhodný, což?