Java - get/set prefixy u metod

MM Lentilky

Java - get/set prefixy u metod
« kdy: 13. 03. 2015, 17:36:05 »
Ahoj,
zajímal by mě váš názor na pojmenovávání metod v Javě, osobně se snažím psát co nejvíc immutable, OOP stylem, držet se pravidla tell, don't ask a vyhýbat se třídám typu tlupa private fieldů + gettery a settery, nicméně občas prostě potřebuju getter/setter pro nějaké pole. Co si myslíte o stylu, kdy případný getter pojmenuji stejně jako field?

Kód: [Vybrat]
private final String filename;

public String filename() {
  return filename;
}

2) U metod co fakt jen vracejí nějaký private field bych ten [i]get[/i] prefix ještě pochopil, ale třeba u metod, co vrátí nějaký výsledek na základě nějaké operace nad více privátními fieldy, mi to přijde minimálně divné.



fvesfesrgzdsf

Re:Java - get/set prefixy u metod
« Odpověď #1 kdy: 13. 03. 2015, 17:49:16 »
to je premysleni kolik andelu se vejde na spicku jehly.

preklad get a set do cestiny je jasny, tak kdyz to pasuje tak to pouziju.
metoda podle me ma obsahovat sloveso a predmet a hned je videt co to dela:
getRowCount, setTime, calculateDensity, deleteFromArray.....

MM Lentilky

Re:Java - get/set prefixy u metod
« Odpověď #2 kdy: 13. 03. 2015, 17:52:35 »
to je premysleni kolik andelu se vejde na spicku jehly.

preklad get a set do cestiny je jasny, tak kdyz to pasuje tak to pouziju.
metoda podle me ma obsahovat sloveso a predmet a hned je videt co to dela:
getRowCount, setTime, calculateDensity, deleteFromArray.....

a co třeba metody size() nebo iterator() v java.util.List, je nějaký důvod proč jsou tady bez get prefixu?

perceptron

Re:Java - get/set prefixy u metod
« Odpověď #3 kdy: 13. 03. 2015, 18:02:06 »
je to ok
vid size(), stream(), nextLine()

akurat pri bean tooloch a property reflexii si zrusite moznost s tym nieco robit

Re:Java - get/set prefixy u metod
« Odpověď #4 kdy: 13. 03. 2015, 18:24:27 »
get/is a set se u metod používá tehdy, pokud daný objekt je JavaBean a ty metody jsou přístupové metody k properties toho beanu. A pojmenovávají se tak proto, protože to vyžaduje standard pro JavaBeany. Jinak si metody můžete pojmenovávat jak chcete, ideálně podle toho, co ty metody dělají.


noef

  • *****
  • 897
    • Zobrazit profil
    • E-mail
Re:Java - get/set prefixy u metod
« Odpověď #5 kdy: 13. 03. 2015, 21:03:29 »
Napr. ve Scale je to, co popisujete, celkem bezna vec. V Jave psat immutable tridy je za trest (mam pocit, ze je to planovane do budoucna, netusim ale v jakem je to stavu). V jinem vlaknu jsem nedavno posilal nekolik moznych pristupu k immutable tridam v Jave vcetne srovnani se Scalou. A treba ta generovana copy metoda ve spojeni s nepovinnymi parametry usetri opravdu hodne boiler-plate kodu, nebo treba uvadet fieldy pouze jednou v konstruktoru, ne na vice mistech jako v Jave. Ale je mozne, ze nepisi dostatecne "OOP stylem" a neodpovidam tedy uplne na otazku.

kert

Re:Java - get/set prefixy u metod
« Odpověď #6 kdy: 13. 03. 2015, 21:10:37 »
Zdá se, že už nejste začátečník, tak se ještě trochu posuňte:

a) Píšete: "ale třeba u metod, co vrátí nějaký výsledek na základě nějaké operace nad více privátními fieldy, mi to přijde minimálně divné.". Chyba: v té úvaze mícháte dohromady interface a implementaci. get / set metody (nebo jakékoliv jiné) jsou interface a zda ve svém těle (scope) vrací private field nebo něco spočítaného a nebo něco vymyšleného (např. pseudonáhodné číslo) je implementační detail.

b) Seznamte se pojmem "Fluent API", resp. "Fluent interface" a uvědomte si, že JavaBeans jsou standard 20 let starý... a pochopitelně zásadu "tell, don't ask" porušující. Má své místo, ale to je poměrně malé a že se to rozlezlo všude je jenom zákon nezamýšlených důsledků.

Ivan

Re:Java - get/set prefixy u metod
« Odpověď #7 kdy: 14. 03. 2015, 10:05:45 »
Napr. ve Scale je to, co popisujete, celkem bezna vec. V Jave psat immutable tridy je za trest (mam pocit, ze je to planovane do budoucna, netusim ale v jakem je to stavu).
asi myslite JSR-305. (Annotation @Immutable). To je porad jeste proposed standard. Myslim ze to narazi na to, ze to pujde jen velice tezko implementovat.

MaM Lentilky

Re:Java - get/set prefixy u metod
« Odpověď #8 kdy: 14. 03. 2015, 11:29:03 »
Zdá se, že už nejste začátečník, tak se ještě trochu posuňte:

a) Píšete: "ale třeba u metod, co vrátí nějaký výsledek na základě nějaké operace nad více privátními fieldy, mi to přijde minimálně divné.". Chyba: v té úvaze mícháte dohromady interface a implementaci. get / set metody (nebo jakékoliv jiné) jsou interface a zda ve svém těle (scope) vrací private field nebo něco spočítaného a nebo něco vymyšleného (např. pseudonáhodné číslo) je implementační detail.

b) Seznamte se pojmem "Fluent API", resp. "Fluent interface" a uvědomte si, že JavaBeans jsou standard 20 let starý... a pochopitelně zásadu "tell, don't ask" porušující. Má své místo, ale to je poměrně malé a že se to rozlezlo všude je jenom zákon nezamýšlených důsledků.

Děkuji za reakci, fluent api znám, asi jsem ale špatně formuloval celou otázku. Spíš mi šlo o to, jestli si myslíte, že názvy metod bez sloves (právě třeba bez toho get) jsou v pohodě. Dejmetomu že u nějaké svojí třídy File prostě pojmenuji metodu vracející jméno souboru filename(), místo getFilename() v případě, že třída File není JavaBean.

JSH

Re:Java - get/set prefixy u metod
« Odpověď #9 kdy: 14. 03. 2015, 12:52:02 »
Osobně zastávám názor, že jména metod se volí primárně podle pohledu zvenku.

Takže get/set/is nastavují nebo zjišťují nějaké vlastnosti objektu a je celkem jedno jestli je ta vlastnost uvnitř reprezentovaná jednou odpovídající proměnnou, nebo nějak jinak. Ona se ta implementace stejně může časem změnit.

Jen bych si dal bacha aby ten getter/setter byl nějak rozumně nenáročný. Svým názvem totiž vyvolává představu levné operace a i když je v dokumentaci něco jiného, tak první dojem z kódu hodně mate. Pro náročné věci mám rád názvy jako calc/calculate a podobné.

A teď k "getNeco, setNeco" vs "neco, setNeco". Já osobně raději to druhé, ale je to úplně putna. Jestli se ti jeden způsob líbí víc, tak se ho drž. Nebo si hoď korunou (jednou, ne u každé metody). Je to jen o stylu, stejně jako "NejakaVec" vs "nejaka_vec".

Kit

Re:Java - get/set prefixy u metod
« Odpověď #10 kdy: 14. 03. 2015, 13:14:35 »
Spíš mi šlo o to, jestli si myslíte, že názvy metod bez sloves (právě třeba bez toho get) jsou v pohodě. Dejmetomu že u nějaké svojí třídy File prostě pojmenuji metodu vracející jméno souboru filename(), místo getFilename() v případě, že třída File není JavaBean.

Myslím si, že názvy metod bez sloves jsou ve většině případů špatně. Raději bych obětoval ostatní slova v názvu a ponechal jen samotné get/set.

Pavel Tisnovsky

Re:Java - get/set prefixy u metod
« Odpověď #11 kdy: 14. 03. 2015, 13:45:42 »
Napr. ve Scale je to, co popisujete, celkem bezna vec. V Jave psat immutable tridy je za trest (mam pocit, ze je to planovane do budoucna, netusim ale v jakem je to stavu).
asi myslite JSR-305. (Annotation @Immutable). To je porad jeste proposed standard. Myslim ze to narazi na to, ze to pujde jen velice tezko implementovat.

Problem bude taky ve standardnich knihovnach, napriklad cele JCF je navrzeno pro mutable a nekolik snah o vytvoreni "paralelni" hierarchie trid se zatim minuly ucinkem. Dokonce to slo tak daleko, ze jsem si se skalnimi Javisty nerozumel ani v tom, co slovo "immutable" ma znamenat :)

perceptron

Re:Java - get/set prefixy u metod
« Odpověď #12 kdy: 14. 03. 2015, 17:39:36 »
dalsia otazka je "preco vlastne chcete pomenovavat takto metody?" teda aky je na to dovod

v jave je ta konvencia taka silna ze nikdy neviete v akom frameworku sa vasa trieda potencialne ocitne

ako som pisal vasa napr . trieda so setterom bez "set" moze ocitnut v spring xml konfiguraku a uz je to smutne

je to o tom dovode

@immutable ma napriklad groovy ale tam sa to riesi ast transformaciami a je tam zoznam podmienok kedy to bude naozaj immutable

Franta <xkucf03/>

Re:Java - get/set prefixy u metod
« Odpověď #13 kdy: 14. 03. 2015, 17:57:33 »
zajímal by mě váš názor na pojmenovávání metod v Javě, osobně se snažím psát co nejvíc immutable, OOP stylem, držet se pravidla tell, don't ask a vyhýbat se třídám typu tlupa private fieldů + gettery a settery, nicméně občas prostě potřebuju getter/setter pro nějaké pole. Co si myslíte o stylu, kdy případný getter pojmenuji stejně jako field?

Prefixy get (u booleanů volitelně is) a set jsou součástí specifikace JavaBean. I když si lidi často myslí, že je to jen nějaká konvence. Hodně věcí by ti pak vůbec nefungovalo (různá mapování atd.) nebo by sis tím přidělal práci.

Určitě bych je nepřekládal do češtiny (i když proti česky psanému kódu nic nemám, tohle v něm musí zůstat, je to podobné jako if, else, for…).

Ale na druhou stranu, pokud nemáš v plánu používat instance té třídy na místech, kde se očekává JavaBeana, tak si to pojmenuj, jak chceš. Je tu sice pravidlo (obecně v OOP), že název metody by měl obsahovat sloveso, ale v odůvodněných případech se dá udělat výjimka. Např. i ve standardní knihovně máš někdy metody size() nebo length() místo getSize() nebo getLength(). Použil bych to v případě, kdy nejde o klasický getter, ale o metodu, která jen něco vypočte a vrátí výsledek, bez možnosti zápisu. Pokud by to byla dvojice, kdy jednou metodou čteš a druhou zapisuješ, tak bych se držel těch klasických get/isset předpon.

Franta <xkucf03/>

Re:Java - get/set prefixy u metod
« Odpověď #14 kdy: 14. 03. 2015, 18:13:19 »
A teď k "getNeco, setNeco" vs "neco, setNeco". Já osobně raději to druhé, ale je to úplně putna. Jestli se ti jeden způsob líbí víc, tak se ho drž.

Když už, tak něco()něco(Typ hodnota). Když někde vidím metodu setNěco(), tak očekávám, že tam bude protějšek getNěco(). Pokud tedy rezignuješ na soulad se standardem JavaBean, nemá smysl tam cpát to set, když už jsi vypustil get.

Každopádně bys měl dodržovat jednotnou konvenci v rámci celého programu/knihovny nebo lépe týmu/firmy/organizace.