Souhrnný název pro settery/gettery

Miramel

Re:Souhrnný název pro settery/gettery
« Odpověď #45 kdy: 17. 10. 2014, 12:19:59 »
Ještě je třetí typ: predikát.

Se všemi třemi typy přístupových metod je nutné náležitě šetřit. Nepoužívám je prakticky vůbec, zpravidla jsou nežádoucí.

Prosím, vysvětlete mi, co tím básník myslel.
Mě naopak přijde jejich použití víc než žádoucí.


Kolemjdoucí

Re:Souhrnný název pro settery/gettery
« Odpověď #46 kdy: 17. 10. 2014, 12:23:24 »
http://www.inf.ufsc.br/poo/smalltalk/ibm/tutorial/chap2.html

A Keyword message is equalvalent to a procedure call with two or more parameters :-)

Já samozřejmě vím, že to skončí voláním procedury, protože jinak se moc kód ani vykonávat nedá.

No výborně :-)

To posílání zprávy ale považuju za velmi dobrou abstrakci, protože volající o té vlastní proceduře moc neví.

A právě to zpracování zprávy je vždy nadstavba a není součástí OOP, ke zpracování zpráv není OOP potřeba.

JSH

Re:Souhrnný název pro settery/gettery
« Odpověď #47 kdy: 17. 10. 2014, 12:24:25 »
Rec je o tom, ze s objektami sa nekomunikuje (=nevyberaju a nenastavuju sa vlastnosti objektu, v tomto kontexte) len vymienanim sprav, ale aj pomocou setterov a getterov a je nezmysel tvrdit, ze jediny spravny sposob je vymena sprav.
Ty zprávy jsou abstraktní pohled na to, co se vlastně děje. To, že nejsou implementované nějakou frontou zpráv ale přímým zavoláním metody je druhá věc.

objekt.setName("Pepa") může znamenat, že posílám zprávu "setName" s parametrem. Ta zpráva vlastně jen zdůrazňuje :
1) Jako volající netuším, jaký kód se bude volat a jestli vůbec. Pokud volající ví, jaký kód se vykoná, tak je zapouzdření pryč.
2) Po objektu požaduju nějakou rozumně zabalenou činnost, po které by měl zůstat v konzistentním stavu.

Pokud si nějaké volání nedokážu představit jako poslání zprávy s požadavkem, pak to beru jako náznak, že jsem něco navrhl blbě.

Prosím, vysvětlete mi, co tím básník myslel.
Mě naopak přijde jejich použití víc než žádoucí.
Pokud má objekt moc přístupových metod, pak to může znamenat, že nemá zodpovědnost za stav jeho dat on, ale volající kód. Pokud může volající nechat objekt v nekonzistentním stavu, pak není pořádně zapouzdřený.

JSH

Re:Souhrnný název pro settery/gettery
« Odpověď #48 kdy: 17. 10. 2014, 12:31:05 »
A právě to zpracování zprávy je vždy nadstavba a není součástí OOP, ke zpracování zpráv není OOP potřeba.
Už tuším, kde si asi nerozumíme. To posílání zpráv je jen abstraktní pohled na to, že po objektu něco chci a kvůli zapouzdření je to ten objekt, kdo rozhoduje co se stane. Že se to dá implementovat bez nějakého opravdového posílání zpráv je druhá věc.

Re:Souhrnný název pro settery/gettery
« Odpověď #49 kdy: 17. 10. 2014, 12:31:32 »
Objektům ve smyslu OOP prostě zpráva poslat nejde a to ani ve Smalltalku ani v COM, vždy je to volání metody která není nic jiného než převlečené volání funkce.

Ach jo. Nedovedu vyloucit, ze umis programovat, ale teorii OOP jsi proste nepolibeny (to by nebyla ostuda, nedelat tu ze sebe mistra sveta. Proste si sedni a zacni cist, trebaz zde zminovany Cada je pres jistou flemetvornost celkem obstojny zacatek).

Koncepcne je to tak, ze se posle zprava (at uz ta ma nebo nema fyzickou reprezentaci, coz je otazka okolnosti a optimalizaci) a pak se na zaklade pozdni vazby (mozna) zavola nejaka metoda. Nebo taky ne.


Kolemjdoucí

Re:Souhrnný název pro settery/gettery
« Odpověď #50 kdy: 17. 10. 2014, 12:37:38 »

Abstraktní pohledy a koncepce mě nechávají tak nějak klidnými a žádné zprávy objektům se nikde neposílají a dosud jste neprokázali opak. Začíná mě to mírně nudit.

Re:Souhrnný název pro settery/gettery
« Odpověď #51 kdy: 17. 10. 2014, 12:38:15 »
Ještě je třetí typ: predikát.

Se všemi třemi typy přístupových metod je nutné náležitě šetřit. Nepoužívám je prakticky vůbec, zpravidla jsou nežádoucí.

Prosím, vysvětlete mi, co tím básník myslel.
Mě naopak přijde jejich použití víc než žádoucí.

Ne, jsou _spise_ (zalezi na dalsim) nezadouci. Teda od urcite urovne dal, pokud je chces srovnat s tim, ze udelas par public fieldu bez jakekoli ochrany, tak jsou i acessory cesta vpred. Navic je rozdil mezi get a set, to druhe je daleko horsi (protoze implikuje mutabilitu).

Velmi jednoduchy priklad:
Chces udelat counter. Trebas pises takove to "mackatko", kterym se pocitaji lide jdouci na koncert nebo prujezd aut.
Kdyz mas private int count a k tomu getter a setter, tak ti klient zvysuje po pruchodu cloveka count nejakym counter.setCount(getCount() + 1). To neusychronizujes, nezabranis rozjebani stavu z venci... Pritom tam muzes mit metody getCount() a inc() a mas polovinu problemu.

(Jeste jednou zduraznuju - neni to 100% pravidlo, casto jsou acessory naprosto OK. Ale pouzivat opatrne. A set je urcite daleko nebezpecnejsi nez get. Opatrne i s getem, pokud ven pousti nejakou mutovatelnou vnitrni strukturu.)

Re:Souhrnný název pro settery/gettery
« Odpověď #52 kdy: 17. 10. 2014, 12:39:59 »
Abstraktní pohledy a koncepce mě nechávají tak nějak klidnými a žádné zprávy objektům se nikde neposílají a dosud jste neprokázali opak. Začíná mě to mírně nudit.

To je ovsem ciste tvuj problem. Je tu nejaka teorie, vcelku bezne prijimana (a z docela dobrych duvodu) zbytekm sveta. Pokud ji ke sve praxi nepotrebujes, delej si svou praxi. Ale nevyjadruj se k tomu, co poradne neznas.

Kolemjdoucí

Re:Souhrnný název pro settery/gettery
« Odpověď #53 kdy: 17. 10. 2014, 12:43:29 »

Takže důkaz že objektu jde poslat zpráva podat neumíte, jen kupíte slova. Nemám k tomu co dodat.

Re:Souhrnný název pro settery/gettery
« Odpověď #54 kdy: 17. 10. 2014, 12:48:29 »

Takže důkaz že objektu jde poslat zpráva podat neumíte, jen kupíte slova. Nemám k tomu co dodat.

Ze ja vul se necham vzdycky zatahnout do diskuse s trolikem, misto abych si precetl neco od nekoho, kdo tematu rozumi (napriklad ten koncept vymyslel). Co trebas performSelector v ObjC? Nebo prakticky doslova v http://www.inf.ufsc.br/poo/smalltalk/ibm/tutorial/chap2.html#2.00

Nasraný linuxák

Re:Souhrnný název pro settery/gettery
« Odpověď #55 kdy: 17. 10. 2014, 12:52:57 »
No já nevím, nic jako smalltalk se v reálu moc nepoužívá, všechny pracovní místa jsou o C# nebo Java, občas C++.

Obecně volání metody je jasnější než poslání správy, pod tím rozumím že by každý objekt měl svoji frontu zpráv kterou by spracovával v pořadí v jakém mu přišly a nejlépe by běžel ve vlastním vlákně (není ale nutné). Když pošlu objektu zprávu, nemám jistotu že zareaguje hned (je to vlastně asynchronní volání), kdežto když na něm zavolám metodu, tak vím že ani neopustím vlákno dokud ta nebude dokončena. V jistém smyslu lze na volání metod nahlížet jako na posílání zpráv, to ano, ale mnoho lidí to chápe jinak. Smalltalk je třeba "opravdové" OOP, ale to se v praxi neuchytilo, takže všechno jako C++/Java/C# si nese jisté břemeno procedurálnosti. Třída není objekt, primitivní datové typy nejsou objekty, šablony/generiky taky nejsou objekty a jde to dál. Pokud jsem napsal nějakou blbost, tak mě opravte :D

Nasraný linuxák

Re:Souhrnný název pro settery/gettery
« Odpověď #56 kdy: 17. 10. 2014, 12:54:03 »
A mrdat češtin ;D

Hmmm

Re:Souhrnný název pro settery/gettery
« Odpověď #57 kdy: 17. 10. 2014, 13:01:53 »
Rec je o tom, ze s objektami sa nekomunikuje (=nevyberaju a nenastavuju sa vlastnosti objektu, v tomto kontexte) len vymienanim sprav, ale aj pomocou setterov a getterov a je nezmysel tvrdit, ze jediny spravny sposob je vymena sprav.
Ty zprávy jsou abstraktní pohled na to, co se vlastně děje. To, že nejsou implementované nějakou frontou zpráv ale přímým zavoláním metody je druhá věc.

objekt.setName("Pepa") může znamenat, že posílám zprávu "setName" s parametrem. Ta zpráva vlastně jen zdůrazňuje :
1) Jako volající netuším, jaký kód se bude volat a jestli vůbec. Pokud volající ví, jaký kód se vykoná, tak je zapouzdření pryč.
2) Po objektu požaduju nějakou rozumně zabalenou činnost, po které by měl zůstat v konzistentním stavu.

Pokud si nějaké volání nedokážu představit jako poslání zprávy s požadavkem, pak to beru jako náznak, že jsem něco navrhl blbě.

Prosím, vysvětlete mi, co tím básník myslel.
Mě naopak přijde jejich použití víc než žádoucí.
Pokud má objekt moc přístupových metod, pak to může znamenat, že nemá zodpovědnost za stav jeho dat on, ale volající kód. Pokud může volající nechat objekt v nekonzistentním stavu, pak není pořádně zapouzdřený.
Takze je to normalny setter, len ho nazyvame spravou.
Lebo ked pouzijem setter, tak nemusim vediet co tento setter urobi. Neviem to, nepotrebujem to vediet. Jedine co ma zaujima je to, ze objektu nastavi meno na "Pepa". Toto jedine viem a toto nemoze ohrozit zapuzdrenie, pretoze ten setter volam s tymto ucelom.
A taktiez plati aj bod 2, pretoze je to uplne logicke.

Takze sprava = setter/getter.

Re:Souhrnný název pro settery/gettery
« Odpověď #58 kdy: 17. 10. 2014, 13:04:47 »
Takže důkaz že objektu jde poslat zpráva podat neumíte, jen kupíte slova. Nemám k tomu co dodat.

A aby to bylo jeste o neco zrejmejsi [foo bar: baz] vazne neznamena, ze se nakonci na foo nejaka metoda bar zavola.

JSH

Re:Souhrnný název pro settery/gettery
« Odpověď #59 kdy: 17. 10. 2014, 13:08:19 »
Obecně volání metody je jasnější než poslání správy, pod tím rozumím že by každý objekt měl svoji frontu zpráv kterou by spracovával v pořadí v jakém mu přišly a nejlépe by běžel ve vlastním vlákně (není ale nutné). Když pošlu objektu zprávu, nemám jistotu že zareaguje hned (je to vlastně asynchronní volání), kdežto když na něm zavolám metodu, tak vím že ani neopustím vlákno dokud ta nebude dokončena.
A u volání procedury je jistota, že zareaguje hned? Může si ten požadavek uložit do vnitřní fronty. Může to spustit v odděleném vlákně. Možností je spousta. U observerů se volání callbacků přenáší tímhle způsobem mezi vlákny celkem běžně. Tím, že o tom přemýšlím jako o poslání požadavku se mi daleko líp předvídají podobné divočiny.
Citace
V jistém smyslu lze na volání metod nahlížet jako na posílání zpráv, to ano, ale mnoho lidí to chápe jinak. Smalltalk je třeba "opravdové" OOP, ale to se v praxi neuchytilo, takže všechno jako C++/Java/C# si nese jisté břemeno procedurálnosti. Třída není objekt, primitivní datové typy nejsou objekty, šablony/generiky taky nejsou objekty a jde to dál. Pokud jsem napsal nějakou blbost, tak mě opravte :D
Objektové programování není o jazyce. Je to způsob přemýšlení a návrhu. Jazyk jen může pomoct s jednodušším zápisem některých obratů. Je to vidět na hybridních jazycích jako C++. Tam se dá programovat procedurálně, objektově nebo i funkcionálně.