Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: MM Lentilky 13. 03. 2015, 17:36:05

Název: Java - get/set prefixy u metod
Přispěvatel: MM Lentilky 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é.

Název: Re:Java - get/set prefixy u metod
Přispěvatel: fvesfesrgzdsf 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.....
Název: Re:Java - get/set prefixy u metod
Přispěvatel: MM Lentilky 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?
Název: Re:Java - get/set prefixy u metod
Přispěvatel: perceptron 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
Název: Re:Java - get/set prefixy u metod
Přispěvatel: Filip Jirsák 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í.
Název: Re:Java - get/set prefixy u metod
Přispěvatel: noef 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 (http://forum.root.cz/index.php?topic=10754.msg123345#msg123345). 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.
Název: Re:Java - get/set prefixy u metod
Přispěvatel: kert 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ů.
Název: Re:Java - get/set prefixy u metod
Přispěvatel: Ivan 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.
Název: Re:Java - get/set prefixy u metod
Přispěvatel: MaM Lentilky 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.
Název: Re:Java - get/set prefixy u metod
Přispěvatel: JSH 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".
Název: Re:Java - get/set prefixy u metod
Přispěvatel: Kit 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.
Název: Re:Java - get/set prefixy u metod
Přispěvatel: Pavel Tisnovsky 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 :)
Název: Re:Java - get/set prefixy u metod
Přispěvatel: perceptron 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
Název: Re:Java - get/set prefixy u metod
Přispěvatel: Franta <xkucf03/> 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.
Název: Re:Java - get/set prefixy u metod
Přispěvatel: Franta <xkucf03/> 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.
Název: Re:Java - get/set prefixy u metod
Přispěvatel: Natix 14. 03. 2015, 22:20:08
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.

Už po několikáté v téhle diskuzi vidím zaklínadlo "specifikace JavaBean". Mohl by prosím ale někdo uvést nějaký real-life příklad, kdy by to člověka mělo jakkoliv zajímat?

Jasně, pokud použiju Hibernate, tak do entitních tříd dám gettery, settery a defaultní konstruktor. Ale to není přece všechno; aby to bylo k něčemu dobré, tak tam musím ještě doplnit nějaké anotace typu @Entity, @ManyToOne, případně třídu zaregistrovat v persistence.xml. To, že třída je formálně džavabýn samo o sobě k ničemu není.

A naopak, to že používám Hibernate/JPA, v žádném případě automaticky neznamená, že úplně všechny třídy v projektu budou psány tímhle způsobem. Ne, týká se pouze úzkého a velmi jasně definovaného souboru tříd, u kterých přesně vím, k čemu slouží a jak se budou používat.

To samé, pokud používám třeba JSF. Mám konkrétní html stránku, tak k ní vytvořím backing třídu, u které vím, jaké property budu chtít číst/zapisovat, takže pro ně vytvořím gettery a settery a na classu pak plácnu anotaci @ManagedBean. Podobně u JABX - mám několik datových struktur, které chci poskytovat přes své REST API, takže pro ně vytvořím příslušné třídy a na property pověsím nějaké ty @XmlWhatever anotace.

V žádném případě ale neplatí nějaký cargo kult, že bych si řekl "huh, mám tu hibernate/JSF/doplňte, takže všechny třídy musím psát jako javabeany, co kdyby se mi náhodou dostaly do persistence kontextu / faceletu / rest api / biblického ráje. O to víc nerozumím tomuhle komentáři:

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

Ve springu se nevyznám, ale logika mi říká, že přece vím, jaké třídy se jak a kde používají. Nedovedu si představit, že by se mi nějaká random třída Foo sloužící k úplně jinému účelu dostala nějakou automagií na nějaké takovéhle místo, aniž bych s tím počítal.
Název: Re:Java - get/set prefixy u metod
Přispěvatel: Filip Jirsák 14. 03. 2015, 22:44:02
Mohl by prosím ale někdo uvést nějaký real-life příklad, kdy by to člověka mělo jakkoliv zajímat?
Například IoC kontejnery, které používají property pro vkládání závislostí. Binding mezi JavaBeanou a Swing modelem. Binding webových požadavků. Designery formulářů.

To, že třída je formálně džavabýn samo o sobě k ničemu není.
Jistěže není. Potřebujete ještě tu druhou stranu, která JavaBeany očekává.
Název: Re:Java - get/set prefixy u metod
Přispěvatel: Franta <xkucf03/> 14. 03. 2015, 23:30:34
Už po několikáté v téhle diskuzi vidím zaklínadlo "specifikace JavaBean". Mohl by prosím ale někdo uvést nějaký real-life příklad, kdy by to člověka mělo jakkoliv zajímat?

Myslím, že sis odpověděl sám – JPA, JSF, JSP, JAXB (včetně SOAP webových služeb nebo REST API) a další knihovny a frameworky. Někdy se nestandardně pojmenované metody dají obejít, přidáš nějaké ty anotace a bude to fungovat, jen si přiděláš trochu práce, jindy máš smůlu. Ale jak jsem psal – pokud nechceš ty třídy používat na místech, kde se očekává JavaBean, tak si je pojmenuj, jak chceš.

A jestli je někomu zatěžko psát gettery a settery ručně, může zkusit projekt Lombok.