To je nepatřičná zkratka. Fyzické objekty většinou mají identitu, ta se nemění. A jejich stav se v čase může měnit (jinak by to byla konstanta), ale ten stav samotný ("otisk objektu") bude hodnotou, která je immutable, že? Nebo naopak: modifikace nějakého atributu objektu vede ke změně jeho stavu (to asi souhlasí), ale identita je zachována.
Ale asi souhlas s tím, že čím víc se vzdalujeme od matematiky (kde se pracuje s immutable hodnotami) k fuzzy reálnému světu, tím míň je funkcionální přístup přirozený.
Ta identita je jen naše abstrakce. Při bližším pohledu to drhne (např. Theseova loď nebo dědečkova sekera).
A i ten "fyzický objekt" je naše škatulka, navíc kapku neostrá.
Směřuju k tomu, že když o něčem mluvíme, tak obvykle žonglujeme s abstraktními immutable objekty, které existují leda tak v nějakém paralelním myšlenkovém nebo platonickém světě. Mapování na nějaké immutable reprezentace není nějaká matematická specialitka, děláme to úplně běžně že to ani nevnímáme.
Ano, identita je abstrakce, přesně tak. Umožňuje nám pracovat s "objekty", které se z fyzikálního hlediska mohou měnit. Jak píšeš a budu parafrázovat: identita "Jiří Havel" bezpochyby jako reprezentace objektu existuje, má mnoho referencí uložených jinde (pošta Ti doručí dopis, úřad Tě dokáže zpárovat - tedy většinou), ale třeba na úrovni molekul/atomů je to naprosto jinej objekt, než v době narození. Nicméně identita stále existuje.
Tak ono záleží jak moc chceme slovíčkařit a ponořit se do (z hlediska softwaru nepodstatných) detailů. Např. ty molekuly vody, ze kterých se nějaký objekt včera skládal, můžou být dneska už úplně někde jinde a patřit k jinému objektu. Kde je teď ta identita? V tom původním objektu nebo tam, kam odešla ta voda?
Ale pro potřeby návrhu softwaru je účelnější se na to dívat z nějaké přirozenější a člověku bližší perspektivy. Když někdo orazítkuje papír, tak se jeho stav změnil (nebudu si hrát na to, že dokument je pořád stejný, jen se v jeho blízkosti zrovna vyskytují molekuly barvy; nebo že v mojí představě je pořád dokument neorazítkovaný, protože jsem ho viděl naposledy včera a pamatuji si ho tak). Když se do auta natankuje benzín, tak se změní jeho stav, když se s ním jezdí, tak se mění stav tachometru… Když tam vyměním motor, tak to pořád považuji za to samé auto… Tohle jsou věci, které mne z pohledu informačního systému zajímají a které má smysl evidovat. Ten obraz reálného světa v počítači je z principu nedokonalý – jen aproximace/podmnožina zvolená tak, aby to dobře sloužilo danému účelu. V databázi si můžu historizovat předchozí stavy a v případě potřeby se na ně můžu dívat. Ale v naprosté většině případů mne zajímá aktuální stav a ne nějaká stará kopie. Pokud s tím chci v jednu chvíli pracovat z více vláken, tak to musím ve vhodnou chvíli rozkopírovat, nebo zamknout nebo obalit třídou která má jen
gettery a ne
settery (+ ty
gettery budou obalovat i vnořené objekty). Ale to jsou technikálie. Z hlediska analýzy a návrhu eviduji nějaká měnící se data. U projektů, na kterých pracuji, se většinou v databázi vše historizuje, skoro nic se nemaže a záznamy spíš jen přibývají – to má blíž k těm neměnným objektům – ale i tam se někdy stavy mění (např. se nastaví
validTo, ukončí platnost nebo se změní aktuální zůstatek - byť ty historické jinde zůstanou). Hlavně jsou ale obory a projekty, kde je zvykem ta data i v databázi vesele přepisovat a udržovat tam jen aktuální stav (a historizace se buď nedělá vůbec nebo se ukládá někam bokem pro záznam).
Trochu se omlouvám za to rýpnutí do
funkcionální víry ale nedalo mi to :-) Ona je to svým způsobem úžasná věc, čistá, matematicky dokonalá. Jen to praktické využití trochu drhne (např. Lisp a Scheme úplně čisté nejsou; Haskell čistý je, jenže monády jsou utrpení a hlavně pak člověk zjistí, že velká část aplikace je právě o těch vedlejších efektech). Na jedné straně jsou analytici a uživatelé, kteří uvažují a mluví o měnících se objektech a koncept „immutable“ je jim cizí. A na druhé straně máme hardware – hodnoty registrů procesoru se mění, volají se instrukce, program/procesor obdělává paměť. Vše je proměnlivé a uprostřed toho si funkcionální programátor snaží konstruovat nějaký svůj dokonalý svět.
Nechci to úplně zatracovat, nějaké využití to má – hlavně tam, kde se řešená úloha blíží matematice. Ale došel jsem k tomu, že pro většinu softwaru lépe slouží „nečisté“ multiparadigmatické jazyky, kde toho můžu psát (asi) většinu objektově, něco procedurálně/funkcionálně, něco deklarativně.