Pokud přidávám prvek do konstantního seznamu a on tam pak není, pak se není čemu divit. Stejně jako by se nemělo být čemu divit, pokud např. zadávám parametry elipsy, jež nejsou povoleny v dané situaci, nebo se snažím nastavit hlavní a vedlejší poloosu kružnice na různé hodnoty.
Já se naopak výše popsaným způsobem snažím selský rozum neopouštět výměnou za rigidní výklad objektového modelu, který dědění chápe jen jako extenzi, což je právě ve sporu se selským rozumem. Jestliže objektu žárovka pošlu zprávu, aby se rozsvítila, ale ona je prasklá, tak nemůžu čekat, že obdržím stav, že je rozsvícena, když jsem ho tam přece jasně nastavoval. S tou elipsou je to stejné.
Pokud budu mít list, který bude obsahovat metody pro modifikaci, ale zároveň bude možnost, aby existovala implementace, která je nějakým způsobem nepovoluje, tak mě napadají 3 možné situace:
- vyhodím výjimku typu UnsupportedOperationException
- nevyhodím výjimku, ale indikuji neúspěch návratovou hodnotou
- neudělám ani jedno, prostě jsem potichu a nechám klienta, ať se s tím nějak popere sám
Třetí možnost je očividně evil, ale ani ty první dvě (ač jsou v javoském collections API velmi používané) nejsou žádná výhra.
Koncept "optional" metod sice ve své době měl určité opodstatnění, ale stačí se podívat, kolikrát byla na Stack Overflow řešena [img=http://stackoverflow.com/questions/2965747/why-i-get-unsupportedoperationexception-when-trying-to-remove-from-the-list]http://tahle otázka[/img].
Kdysi jsem na tohle někde četl kritiku, kde byl v nadsázce uvedený takovýhle příklad:
/**
* Solves all of the word's problems, but may be unsupported.
*
void solveAllWorldsProblems() {
throw new UnsupportedOperationException("sorry");
}
Ve chvíli kdy člověk musí přemýšlet nad tím, že nějaká metoda někdy nemusí udělat to, co se od ní očekává, případně může vyrazit výjimku, je prostě další věc, která zvětšuje stavový prostor programu, a tím pádem dělá jeho tvorbu a údržbu složitější a nákladnější.
Když si člověk jednou zkusí, jaké to je, pracovat s neměnnými datovými strukturami a funkcemi bez vedlejších efektů, nemusí při tom přemýšlet nad komplikovanou stavovostí programu a ještě jako bonus nemusí jak opičák všude cpát null checky, tak se pak těžko vrací zpět.
