#16 gcx11
Ahoj gcx11, děkuji ti za reakci,
nepotřebuji rozšířit třídu za běhu, to zvládám pomocí monkey-patching. Jde mi opravdu jen o přesměrování zpráv - to za složitý hack nepovažuji, protože je to běžně užívaná technika a to zejména u kachnotypích jazyků. Nechci sem pořád zatahovat Ruby, ale tam se to používá běžně. Zkusím vysvětlit:
Jak v jazycích staticky i dynamicky typovaných se občas využívá vkládání objektů, tj něco takového:
class Obj():
server = Nejakytyp()
...
Může to být v __init__, ale to je nepodstatné. Ve třídě/typu se vytváří instance dalšího objektu (tzv. vkládaného), na kterého se - za horizontem zapouzdření - přesměrují "služby" objektu (Obj()). Já ale nechci implementovat všechny "služby" ručně a přesměrovávat každou zprávu zvlášť - chci, aby se za horizontem zapouzdření o to přesměrování zpráv postaral objekt, který (např v ukázce v Ruby předávám pomocí vlastnosti server) ve kterém jsou služby implementovány. A samozřejmě postup v úkázce, kromě zbytečné dřiny pro programátora není úplně zrovna elegantní řešení, ale to je nepodstatné, jde jen o vysvětlení podstatného.
Můj problém je vlastně takový, že potřebuji alternativu k rubiovskému obj.send, která umí dynamicky sestavit obj.zprava() pro vestavěný a vlastní typ. Jinak řečeno: umí nepřímo zaslat zprávu jinému objektu. Díky, ale nestojím o jiné postupy a návrhy. Jde to nějak v Pythonu nebo ne tak, abych to mohl využít pro přesměrování zpráv? To je moje otázka.
Přesměrování jsem si nevymyslel sám, ale jiný uznávaní odborníci, který tento princip za porušení OOP principů nepovažují, spíše naopak - je v souladu s myšlenkou předávání zpráv - tak jako v reálném životě se může objekt rozhodnout, jak na zprávu zareaguje (přijmout a vykonat službu, odmítnout, nebo předat). Vše se děje za horizontem zapouzdření, programátor ani nemusí vědět, že objekt zprávu předal jinému objektu, který se o služby postará. Nerozumím té argumentaci o porušení zapouzření - kde proboha? Valstně jsou to z mé strany spíše parafráze - není to z mé hlavy.
Díky za ukázky, určitě je doma prostuduji a uvidím zda by mi v tomto ohledu mohli pomoci.