Měnitelnost objektů předávaných odkazem

Měnitelnost objektů předávaných odkazem
« kdy: 18. 09. 2026, 11:36:58 »
Dnešní trend nových programovacích jazyků, jako jsou RUST, Nim, Zig, C3 a dalších, je takzvaná immutabilita. Zde mám na mysli neměnnost složitých datových typů - pole, objekty atd.

AI mi na to řekla, že i tyto složité datové typy předávané funkci odkazem, by měli být neměnné (immutable). A namísto nich, že by funkce měla vytvořit kopii oněch datových typů a poslat je zpět jako návratovou hodnotu.

To se však dělá těžko, když jsou datové typy velmi veliké. Zde se například užívá tzv. přepravka. Vezme se malý objekt, pošle se do funkce, která ho vrátí modifikovaný a tato modifikace se pak zapracuje do velikého datového typu. Jenže v některých případech ta přepravka může zpomalovat běh, jako například u herních enginů.

Jak jsou na tom enginy aplikací? Kdy je lepší používat měnitelnost velikého datového typu zevnitř funkce a kdy je lepší používat přepravku, či jinou techniku?


a6b

  • ****
  • 357
    • Zobrazit profil
    • E-mail
Re:Měnitelnost objektů předávaných odkazem
« Odpověď #1 kdy: 18. 09. 2026, 11:41:21 »
ja jsem zastance toho aby reference byla immutable a kdyz je mutable, tak aby zmena byla levna.
pokud ma jit o zmenu sloziteho objektu, tak jsem treba v rustu zastancem presunuti (move), objekt se presune do funkce, tam se zmodifikuje a pak se zase presune ven z funkce.

Kit

  • *****
  • 1 110
    • Zobrazit profil
    • E-mail
Re:Měnitelnost objektů předávaných odkazem
« Odpověď #2 kdy: 18. 09. 2026, 12:53:53 »
V takovém případě se používají kolekce, které navíc bývají thread-safe.

RDa

  • *****
  • 3 322
    • Zobrazit profil
    • E-mail
Re:Měnitelnost objektů předávaných odkazem
« Odpověď #3 kdy: 18. 09. 2026, 13:56:20 »
Velke data se predavaj neprimo - pres handle - odkazem/indexem na nejaky pool pameti.
Jako tohle je "rukojeť", absolutne ale netusim co je to "přepravka" :D

Re:Měnitelnost objektů předávaných odkazem
« Odpověď #4 kdy: 18. 09. 2026, 14:31:30 »


xyz

  • ****
  • 330
    • Zobrazit profil
Re:Měnitelnost objektů předávaných odkazem
« Odpověď #5 kdy: 18. 09. 2026, 16:21:57 »
Jen na okraj. Imutability neni trend modernich programovacich jazyku, ale je to koncept stary snad 50 let, ktery prisel z objektove orientovaneho programovani. Jen se tomu rikalo zapouzdreni (encapsulation). K polozkam objektu maji pristup jen metody (zpravy objektu). Jenze pak prisly tzv. POJO a nebo java beans a vsude se k objektum zacaly pridavat gettery a settery a rozlezlo se to.

Kit

  • *****
  • 1 110
    • Zobrazit profil
    • E-mail
Re:Měnitelnost objektů předávaných odkazem
« Odpověď #6 kdy: 18. 09. 2026, 17:47:13 »
Jen na okraj. Imutability neni trend modernich programovacich jazyku, ale je to koncept stary snad 50 let, ktery prisel z objektove orientovaneho programovani. Jen se tomu rikalo zapouzdreni (encapsulation). K polozkam objektu maji pristup jen metody (zpravy objektu). Jenze pak prisly tzv. POJO a nebo java beans a vsude se k objektum zacaly pridavat gettery a settery a rozlezlo se to.

Gettery a settery jsou proti principu zapouzdření, protože umožňují manipulaci s jednotlivými atributy.

Re:Měnitelnost objektů předávaných odkazem
« Odpověď #7 kdy: 18. 09. 2026, 17:48:23 »
ano, není to moderní novinka, je to spíše odklon od objektového pekla.

Tazatal má správný čich. Na volbě topologie dat v paměti a na disku prostě záleží. Velmi záleží. A musí se to volit velmi pečlivě, v počátku počítačů triky s datovými strukturami a přístupů k nim umožňilo vznik všech těch legendárních programů a her. Dnes už naštěstí nemusíme dělat takové vylomeniny.

Re:Měnitelnost objektů předávaných odkazem
« Odpověď #8 kdy: 18. 09. 2026, 17:54:17 »
například užívá tzv. přepravka.
Dobře, triggernul jste mě. Víte o tom něco ? Pojmy se tu oháníte. Tak se zeptám, je řeč o RefCell a Box<> v Rustu?

BoneFlute

  • *****
  • 2 152
    • Zobrazit profil
Re:Měnitelnost objektů předávaných odkazem
« Odpověď #9 kdy: 18. 09. 2026, 19:18:49 »
Dnešní trend nových programovacích jazyků, jako jsou RUST, Nim, Zig, C3 a dalších, je takzvaná immutabilita. Zde mám na mysli neměnnost složitých datových typů - pole, objekty atd.

AI mi na to řekla, že i tyto složité datové typy předávané funkci odkazem, by měli být neměnné (immutable). A namísto nich, že by funkce měla vytvořit kopii oněch datových typů a poslat je zpět jako návratovou hodnotu.

To se však dělá těžko, když jsou datové typy velmi veliké. Zde se například užívá tzv. přepravka. Vezme se malý objekt, pošle se do funkce, která ho vrátí modifikovaný a tato modifikace se pak zapracuje do velikého datového typu. Jenže v některých případech ta přepravka může zpomalovat běh, jako například u herních enginů.

Jak jsou na tom enginy aplikací? Kdy je lepší používat měnitelnost velikého datového typu zevnitř funkce a kdy je lepší používat přepravku, či jinou techniku?

Návrhový vzor Přepravka slouží k něčemu jinému.

Předávání hodnotou se používá proto, protože je to bezpečnější a kontrolovatelnější, ale logicky dražší.

Předávání odkazem je správný pattern pro předávání velkého objektu. To tak prostě je, je to správně a nic s tím neuděláš.

Přistupuje se k tomu cca třemi způsoby (možná i více)

1/ chceme přehlednost a kontrolu a rezignujeme na výkon - předávání hodnotou

2/ chceme výkon - předávání odkazem, a předává se i vlastnictví (zpopularizoval Rust, ale koncept je to samozřejmě mnohem starší)

3/ Objekt nepředáváme, ale necháme si tou funkcí vrátit co se má na tom objektu udělat (monády/recepty/commandy/operace). Tedy nepředáváme objekt operacím ale do objektu předáváme operace. Toto je taková více architektonická záležitost. Velký datový objekt má na starost omezený kontext kódu, což znamená, že máme větší šanci si to ohlídat, nemusíme předávat celej velkej blob, o různých optimalizačních technikách nemluvě.


PS:
To se však dělá těžko, když jsou datové typy velmi veliké. Zde se například užívá tzv. přepravka. Vezme se malý objekt, pošle se do funkce, která ho vrátí modifikovaný a tato modifikace se pak zapracuje do velikého datového typu. Jenže v některých případech ta přepravka může zpomalovat běh, jako například u herních enginů.
Tohle je tak zmatenej a zašmodrchanej popis, že tam snad není správně ani zájmeno. [peace]

Kit

  • *****
  • 1 110
    • Zobrazit profil
    • E-mail
Re:Měnitelnost objektů předávaných odkazem
« Odpověď #10 kdy: 18. 09. 2026, 21:12:31 »
Chytře to má uděláno PHP. Objekty se předávají odkazem, pole hodnotou a dá se změnit jedno na druhé a naopak. Navíc to předávání hodnotou je líné, tedy se prakticky nedělá.

tecka

  • ***
  • 184
    • Zobrazit profil
    • E-mail
Re:Měnitelnost objektů předávaných odkazem
« Odpověď #11 kdy: 18. 09. 2026, 22:13:25 »
To je zase otázka, jestli solit, nebo pepřit. Asi podle toho, co vařím a jak mi to chutná!

Re:Měnitelnost objektů předávaných odkazem
« Odpověď #12 kdy: 18. 09. 2026, 23:53:43 »
Velke data se predavaj neprimo - pres handle - odkazem/indexem na nejaky pool pameti.
Jako tohle je "rukojeť", absolutne ale netusim co je to "přepravka" :D

například užívá tzv. přepravka.
Dobře, triggernul jste mě. Víte o tom něco ? Pojmy se tu oháníte. Tak se zeptám, je řeč o RefCell a Box<> v Rustu?

Možná jsem nepoužil ten správný název. Tak alespoň nějaký popis přepravky z knihy: Návrhové vzory - 33 vzorových postupů pro objektové programovaní - Rudolf Pecinovský:


Přepravka – Crate

Stručná charakteristika vzoru:

Vzor Přepravka využijeme při potřebě sloučení několika samostatných informací do jednoho objektu, prostřednictvím nějž je pak možno tyto informace jednoduše ukládat nebo přenášet mezi metodami. V anglicky psané literatuře je tento návrhový vzor někdy označován termínem Messenger.



Odpověď od AI:

V programování je přepravka český slangový nebo komunitní překlad pro DTO (Data Transfer Object, česky objekt pro přenos dat). Jde o jednoduchou datovou schránku či kontejner, který slouží výhradně k přenosu dat mezi různými částmi (vrstvami) aplikace nebo mezi procesy...



Používám ten název v mnohem obecnějším významu. Přepravka jsou prostě zabalená data do objektu, který má dočasnou platnost a který jedna funkce předá druhé funkci. Přepravka je objekt, který slouží jen pro přenos informací.

Jinak RUST moc neznám. Snad jen okrajově.

BoneFlute

  • *****
  • 2 152
    • Zobrazit profil
Re:Měnitelnost objektů předávaných odkazem
« Odpověď #13 kdy: Dnes v 01:22:36 »
Přepravka – Crate

Stručná charakteristika vzoru:

Vzor Přepravka využijeme při potřebě sloučení několika samostatných informací do jednoho objektu, prostřednictvím nějž je pak možno tyto informace jednoduše ukládat nebo přenášet mezi metodami. V anglicky psané literatuře je tento návrhový vzor někdy označován termínem Messenger.

On ten návrhový vzor i v té oficiální definici dost smrdí.


Používám ten název v mnohem obecnějším významu. Přepravka jsou prostě zabalená data do objektu, který má dočasnou platnost a který jedna funkce předá druhé funkci. Přepravka je objekt, který slouží jen pro přenos informací.

Mě se ten popis furt nelíbí :-)
data zabalená do dat zabalená do dat zabalená do objektu? :-P
A jak tam figuruje dočasná platnost?
Jedna funkce jiné si tak nějak furt něco předávají, ne?
Objekty obecně neslouží k přenosu informacím? K tomu potřebuji přepravku?

Sorry za rejpání.

Kit

  • *****
  • 1 110
    • Zobrazit profil
    • E-mail
Re:Měnitelnost objektů předávaných odkazem
« Odpověď #14 kdy: Dnes v 02:05:33 »
Objekty obecně neslouží k přenosu informacím? K tomu potřebuji přepravku?

Vzor Messenger se používá k přenášení dat mezi objekty. Je zjednodušen, nepoužívá gettery ani settery. Výhodou je snadná testovatelnost a žádoucí volná vazba mezi komunikujícími objekty. Pro tyto účely obvykle používám nějakou kolekci.

PDO v PHP v dotazech poskytuje právě takovou kolekci (seznam slovníků). Skvěle se s tím pracuje a dobře se z toho generuje DOM s daty do výstupní šablony.