Souhrnný název pro settery/gettery

JS

Re:Souhrnný název pro settery/gettery
« Odpověď #30 kdy: 17. 10. 2014, 10:03:50 »
C# tomu rika property, Common Lisp tomu rika accessor. Tak si vyberte.

Nekdy me ale Javisti vazne bavi.. Takze mame dva objekty, A a B, a mezi nimi je vazba, a to se nam nelibi, protoze je to obtizne spravovatelne; kdyz se nejak zmeni A, bude se muset zmenit i B. Jak to vyresit? No, v OOP mame objekty, takze vytvorime dalsi objekt C, ktery ma vazbu na A i B. Tim padem, pokud se zmeni A, nebo se zmeni B, bude stacit zmenit jen objekt C. Problem ovsem ted je, ze nam zde stale zustala vazba mezi A a C, a vazba mezi B a C. To lze samozrejme dale vyresit, jak jinak nez pridanim objektu D a E..


Kolemjdoucí

Re:Souhrnný název pro settery/gettery
« Odpověď #31 kdy: 17. 10. 2014, 10:38:47 »
Nepracuji přece s vlastnostmi objektu, ale objektu posílám zprávy. Je na rozhodnutí metody objektu, co s tou zprávou udělá.

Objektům ve smyslu OOP se nikdy žádné zprávy neposílaly, neposílají a nikdy posílat nebudou. Nevím jak dlouho bude trvat než se tento nesmysl vymýtí. Použití metody objektu funguje naprosto stejně jako volání volání funkce.

Vně objektu nemá být vidět informace o jeho vnitřní struktuře. Má být vidět pouze rozhraní. Pokud dva objekty mají uvnitř různé atributy, ale mají stejné rozhraní, mohu použít polymorfismus. Pokud by měly pouze gettery a settery na různé atributy, polymorfismus použít nemohu.

getter/setter může a nemusí mít souvislost s vnitřní strukturou, právě proto gettery/settery existují.
Solidní jazyk umí getter/setter jako virtuální metodu a můžeš si to v potomkovi přepsat libovolně.

Zkus nějakému programátorovi říct, že tam má dát setter. Automaticky napíše setProperty() a k tomu primitivní řádek this.property = property.

Takový setter je k ničemu, to se shodneme, to se klidně může členská proměnná vystrčit do sekce public a vyjde to skoro nastejno.

Hmmm

Re:Souhrnný název pro settery/gettery
« Odpověď #32 kdy: 17. 10. 2014, 10:42:00 »
Nepracuji přece s vlastnostmi objektu, ale objektu posílám zprávy. Je na rozhodnutí metody objektu, co s tou zprávou udělá. Vně objektu nemá být vidět informace o jeho vnitřní struktuře. Má být vidět pouze rozhraní. Pokud dva objekty mají uvnitř různé atributy, ale mají stejné rozhraní, mohu použít polymorfismus. Pokud by měly pouze gettery a settery na různé atributy, polymorfismus použít nemohu.
A ta metoda, ktora prijme spravu a podla nej zmeni vlastnost objektu nie je nahodou setter? ;) Setter nemusi IBA menit hodnotu a dokonca sa jeho nazov ani nemusi zacinat slovom set.

Zkus nějakému programátorovi říct, že tam má dát setter. Automaticky napíše setProperty() a k tomu primitivní řádek this.property = property. Vím, že to není jediný typ setteru, ale vidím ho v cizích programech až příliš často. A nelíbí se mi.

Pokud název metody nezačíná slůvkem "set", tak se jí většinou setter neříká. Když něco přidáváš do kolekce metodou add() nebo insert(), říkáš jim settery?
Ja som sa ti snazil tym povedat, ze aj ked to nenazves set*, tak je to setter pokial to priradzuje vlastnosti hodnotu. Teda aj ta tvoja metoda, ktora prijima spravu a podla nej nastavuje hodnotu, je setter.

Metodu neurobi setterom slovo "set" v jej nazve, ale to co vykonava jej telo.

NooN

Re:Souhrnný název pro settery/gettery
« Odpověď #33 kdy: 17. 10. 2014, 10:49:21 »
Metodu neurobi setterom slovo "set" v jej nazve, ale to co vykonava jej telo.
Zalezi na implemantacii v konkrétnom jazyku, nemozete to zhrnut na jeden konkretny jazyk.

Lucas

Re:Souhrnný název pro settery/gettery
« Odpověď #34 kdy: 17. 10. 2014, 10:50:48 »
Citace
Já bych jako možný termín pro gettery/settery použil property.
Citace
C# tomu rika property, Common Lisp tomu rika accessor. Tak si vyberte.

Property se mi nelíbí, je to až moc obecné. Nakonec jsem se rozhodl použít accessors. To taky není ideální, ale je to asi nejsrozumitelnější. V tomhle ohledu se stejně na terminologii většina neshodne, záleží mi ale na tom, aby byla na první pohled srozumitelná pro co nejširší okruh lidí. Lidem vyjadřujícím se k věci díky, za mě to je definitivně všechno. Můžete nerušeně pokračovat ve flame.


JS

Re:Souhrnný název pro settery/gettery
« Odpověď #35 kdy: 17. 10. 2014, 11:05:52 »
Jinak, gettery/settery/property mají hlavně ten význam, že oddělují implementaci od rozhraní, takže klient objektu neví jestli je ta properta jen členskou proměnnou, je nějak počítána, jestli je permanentně v paměti a nebo je při get načtena z disku a podobně.

To je asi jedine legitimni pouziti. Bohuzel to cele stoji a pada s tim, ze se pristup k promennym (atributum) zapisuje syntakticky stejne jako volani funkci, coz ma jen malo jazyku (treba Common Lisp nebo Haskell). V Jave a C# to tak uplne neni (C# je v tomhle ale trochu lepsi), takze proto mnoho lidi ze zoufalstvi trva na tom, aby se z toho vzdy delaly funkce, aby vubec tu vyhodu bylo mozne potencialne vyuzit. Uzitecnost takove praktiky je ovsem sporna, uz proto, ze porusuje princip YAGNI.

JSH

Re:Souhrnný název pro settery/gettery
« Odpověď #36 kdy: 17. 10. 2014, 11:07:46 »
Objektům ve smyslu OOP se nikdy žádné zprávy neposílaly, neposílají a nikdy posílat nebudou. Nevím jak dlouho bude trvat než se tento nesmysl vymýtí. Použití metody objektu funguje naprosto stejně jako volání volání funkce.
Právě naopak. OOP je o tom, že se objektům zasílají zprávy a objekty na ně nějak reagují (převážně voláním metody, ale volající netuší které). Smalltalk snad není objektový jazyk? A to zasílání zpráv je dobrá představa i u mainstream jazyků. Co takový COM nebo CORBA?

Chápu, že většina programátorů ani netuší, že volání metod v C++/Javě/C#/... je jen osekaná verze obecnějšího principu. Vlastně je to taková konkrétní implementace místo obecnějšího popisu chování. :D

Re:Souhrnný název pro settery/gettery
« Odpověď #37 kdy: 17. 10. 2014, 11:23:09 »
Objektům ve smyslu OOP se nikdy žádné zprávy neposílaly, neposílají a nikdy posílat nebudou. Nevím jak dlouho bude trvat než se tento nesmysl vymýtí. Použití metody objektu funguje naprosto stejně jako volání volání funkce.

Nekdy mam problem rozhodnout se, zda verit anonymnimu Kolemjdoucimu nebo Alanu Kayovi. Ne.

Hmmm

Re:Souhrnný název pro settery/gettery
« Odpověď #38 kdy: 17. 10. 2014, 11:24:00 »
Metodu neurobi setterom slovo "set" v jej nazve, ale to co vykonava jej telo.
Zalezi na implemantacii v konkrétnom jazyku, nemozete to zhrnut na jeden konkretny jazyk.
Preco? Ako sa napriklad tento princip uplatneny v PHP lisi od tohto principu uplatneneho v Jave? V oboch jazykoch predsa plati, ze setter je metoda, ktora nastavuje hodnotu a nie metoda, ktorej nazov sa zacina na set*.

Hmmm

Re:Souhrnný název pro settery/gettery
« Odpověď #39 kdy: 17. 10. 2014, 11:25:05 »
Objektům ve smyslu OOP se nikdy žádné zprávy neposílaly, neposílají a nikdy posílat nebudou. Nevím jak dlouho bude trvat než se tento nesmysl vymýtí. Použití metody objektu funguje naprosto stejně jako volání volání funkce.

Nekdy mam problem rozhodnout se, zda verit anonymnimu Kolemjdoucimu nebo Alanu Kayovi. Ne.
Kludne nech sa objektom posielaju spravy. Ale urcite je nezmysel, ze s objektom sa komunikuje LEN prostrednictvom sprav.

Re:Souhrnný název pro settery/gettery
« Odpověď #40 kdy: 17. 10. 2014, 11:27:31 »
C# tomu rika property, Common Lisp tomu rika accessor. Tak si vyberte.

Nekdy me ale Javisti vazne bavi.. Takze mame dva objekty, A a B, a mezi nimi je vazba, a to se nam nelibi, protoze je to obtizne spravovatelne; kdyz se nejak zmeni A, bude se muset zmenit i B. Jak to vyresit? No, v OOP mame objekty, takze vytvorime dalsi objekt C, ktery ma vazbu na A i B. Tim padem, pokud se zmeni A, nebo se zmeni B, bude stacit zmenit jen objekt C. Problem ovsem ted je, ze nam zde stale zustala vazba mezi A a C, a vazba mezi B a C. To lze samozrejme dale vyresit, jak jinak nez pridanim objektu D a E..

Hodne zalezi na okolnostech (vlastnictvi kodu, pozadavky na kompatibility, buildsystem...). Ale casto je dobre resni mit interface IA, B nechat pouzivat jen IA misto A a na jich propojeni pouzit IOC. Pak te nejake rozumne zmeny v A nerozhazi.

JSH

Re:Souhrnný název pro settery/gettery
« Odpověď #41 kdy: 17. 10. 2014, 11:45:49 »
Kludne nech sa objektom posielaju spravy. Ale urcite je nezmysel, ze s objektom sa komunikuje LEN prostrednictvom sprav.
Hmmm, proč? Takový smalltalk přesně tímhle způsobem funguje (a jeho problémy jsou úplně jinde, než v tomhle). Posílání "zprávy" o které objekt sám rozhoduje, co s ní udělá (např. pohledem do VFT) je obecnější popis toho, co se děje i při volání metody. Takový interface v javě, nebo abstraktní třída v C++ je jen popis zpráv, kterým objekt rozumí.

Ano, veřejné proměnné do tohohle pohledu moc nezapadají, ale na ty se dost OOP puristů kouká skoro jako na goto.

A zásadní zádrhel zpráv/metod není v ničem menším než že jen jeden objekt rozhoduje o tom, co se stane. S nadsázkou bych řekl, že tak polovina návrhových vzorů obchází tohle omezení pro různé specifické případy. Z toho taky plyne, že OOP se dobře hodí jen na určitou třídu úloh.

Kolemjdoucí

Re:Souhrnný název pro settery/gettery
« Odpověď #42 kdy: 17. 10. 2014, 11:58:33 »
Právě naopak. OOP je o tom, že se objektům zasílají zprávy a objekty na ně nějak reagují (převážně voláním metody, ale volající netuší které). Smalltalk snad není objektový jazyk? A to zasílání zpráv je dobrá představa i u mainstream jazyků. Co takový COM nebo CORBA?

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.

Nazývat si to ve svém soukromí můžete jak chcete, ale s reálným stavem světa to nemá nic společného. Jestliže chcete vaši vlastní metodu ZpracujZprávu(int message, ...) nazývat posílání zpráv pak samozřejmě můžete, nikdo vám v tom nebrání.

Takový interface v javě, nebo abstraktní třída v C++ je jen popis zpráv, kterým objekt rozumí.

Nesmysly.

Hmmm

Re:Souhrnný název pro settery/gettery
« Odpověď #43 kdy: 17. 10. 2014, 12:01:06 »
Kludne nech sa objektom posielaju spravy. Ale urcite je nezmysel, ze s objektom sa komunikuje LEN prostrednictvom sprav.
Hmmm, proč? Takový smalltalk přesně tímhle způsobem funguje (a jeho problémy jsou úplně jinde, než v tomhle). Posílání "zprávy" o které objekt sám rozhoduje, co s ní udělá (např. pohledem do VFT) je obecnější popis toho, co se děje i při volání metody. Takový interface v javě, nebo abstraktní třída v C++ je jen popis zpráv, kterým objekt rozumí.

Ano, veřejné proměnné do tohohle pohledu moc nezapadají, ale na ty se dost OOP puristů kouká skoro jako na goto.

A zásadní zádrhel zpráv/metod není v ničem menším než že jen jeden objekt rozhoduje o tom, co se stane. S nadsázkou bych řekl, že tak polovina návrhových vzorů obchází tohle omezení pro různé specifické případy. Z toho taky plyne, že OOP se dobře hodí jen na určitou třídu úloh.
Co? Interface? Ake verejne premenne? Ale o tom vobec nie je rec.

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.

JSH

Re:Souhrnný název pro settery/gettery
« Odpověď #44 kdy: 17. 10. 2014, 12:08:01 »
Objektům ve smyslu OOP prostě zpráva poslat nejde a to ani ve Smalltalku ...
http://www.inf.ufsc.br/poo/smalltalk/ibm/tutorial/chap2.html

Citace
Nazývat si to ve svém soukromí můžete jak chcete, ale s reálným stavem světa to nemá nic společného. Jestliže chcete vaši vlastní metodu ZpracujZprávu(int message, ...) nazývat posílání zpráv pak samozřejmě můžete, nikdo vám v tom nebrání.
Já to tak nenazývám ve svém soukromí. Minimálně u toho smalltalku jsou to běžně používané termíny.

Já samozřejmě vím, že to skončí voláním procedury, protože jinak se moc kód ani vykonávat nedá. To posílání zprávy ale považuju za velmi dobrou abstrakci, protože volající o té vlastní proceduře moc neví. Volající posílá požadavek a o tom, jak se ten požadavek obslouží, co za kód se vlastně zavolá je závislé na volaném objektu.