🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.java
23 messages
23 total messages Started by Jadalbert Thu, 03 Jan 2013 08:40
jak to jest z tymi JavaBeans
#153734
Author: Jadalbert
Date: Thu, 03 Jan 2013 08:40
28 lines
1890 bytes
problem (czy raczej moja niewiedza) jest taki
Mam program liczący pewne wielkości i, dajmy na to 
w uproszczeniu, w klasie Geom metodę
public double V(double x, double y, double z) {
	return x * y * z;
}
gdzieś tam jest to wywoływane:
V_ = Geom.V(2,3,4);
czyli trzeba wstawić trzy argumenty. Wszystko 
działa bez zarzutu.
Teraz, z klas liczących chcę zrobić beans'y.
Czyli powinno być tak (opierając się na powyższym 
przykładzie):
private double v;
...
public double getV() {return v};
public void setV(double v) {this.v = v;}

i tu, zgodnie z konwencją, metoda set ma tylko 
jeden argument, a ja potrzebuję przekazać 3. Jak 
wybrnąć sensownie z takiej sytuacji? Osobna klasa 
licząca + osobna typu beans? W beans'ie dodatkowe 
metody liczące? Można oczywiście już w 
implementacji dołożyć odpowiednie zmienne, ale co 
wtedy przekazywać jako argument?
Najchętniej wszystko co dotyczy liczenia i, że tak 
powiem, formalnej struktury beans'ów chciałbym 
mieć w jednej klasie.
Re: jak to jest z tymi JavaBeans
#153735
Author: Arivald
Date: Thu, 03 Jan 2013 09:18
54 lines
3057 bytes
W dniu 2013-01-03 09:40, Jadalbert pisze:
> problem (czy raczej moja niewiedza) jest taki
> Mam program liczący pewne wielkości i, dajmy na to w uproszczeniu, w
> klasie Geom metodę
> public double V(double x, double y, double z) {
>      return x * y * z;
> }
> gdzieś tam jest to wywoływane:
> V_ = Geom.V(2,3,4);
> czyli trzeba wstawić trzy argumenty. Wszystko działa bez zarzutu.
> Teraz, z klas liczących chcę zrobić beans'y.
> Czyli powinno być tak (opierając się na powyższym przykładzie):
> private double v;
> ...
> public double getV() {return v};
> public void setV(double v) {this.v = v;}

To jest tylko para sette/getter. W zamyśle razem tworzą jedną właściwość 
obiektu.

> i tu, zgodnie z konwencją, metoda set ma tylko jeden argument, a ja
> potrzebuję przekazać 3. Jak wybrnąć sensownie z takiej sytuacji? Osobna
> klasa licząca + osobna typu beans? W beans'ie dodatkowe metody liczące?
> Można oczywiście już w implementacji dołożyć odpowiednie zmienne, ale co
> wtedy przekazywać jako argument?
> Najchętniej wszystko co dotyczy liczenia i, że tak powiem, formalnej
> struktury beans'ów chciałbym mieć w jednej klasie.

Możesz to zrobić np tak

//property X
public double getX() {return x};
public void setX(double x) {this.x = x;}
//property Y
public double getY() {return y};
public void setY(double y) {this.y = y;}
//property Z
public double getZ() {return z};
public void setZ(double z) {this.z = z;}

//property V
public double getV() {return x * y * z;}


Jak widzisz, właściwość V nie ma settera, jest tyko do odczytu. A 
jednocześnie jej getter wykonuje potrzebne obliczenia.

Zauważ że w ciałach setterów/getterów nie musisz wcale pisać/czytać ze 
zmiennych. Możesz na przykład przekazywać wartości do innych obiektów, 
lub bazy danych, albo wołać jakieś funkcje API odwołujące się do 
realnego świata (np. sterować robotem).

-- 
Arivald
Re: jak to jest z tymi JavaBeans
#153736
Author: Jadalbert
Date: Thu, 03 Jan 2013 10:03
79 lines
3530 bytes
W dniu 2013-01-03 10:18, Arivald pisze:
> W dniu 2013-01-03 09:40, Jadalbert pisze:
>> problem (czy raczej moja niewiedza) jest taki
>> Mam program liczący pewne wielkości i, dajmy na
>> to w uproszczeniu, w
>> klasie Geom metodę
>> public double V(double x, double y, double z) {
>>      return x * y * z;
>> }
>> gdzieś tam jest to wywoływane:
>> V_ = Geom.V(2,3,4);
>> czyli trzeba wstawić trzy argumenty. Wszystko
>> działa bez zarzutu.
>> Teraz, z klas liczących chcę zrobić beans'y.
>> Czyli powinno być tak (opierając się na
>> powyższym przykładzie):
>> private double v;
>> ...
>> public double getV() {return v};
>> public void setV(double v) {this.v = v;}
>
> To jest tylko para sette/getter. W zamyśle razem
> tworzą jedną właściwość obiektu.
>
>> i tu, zgodnie z konwencją, metoda set ma tylko
>> jeden argument, a ja
>> potrzebuję przekazać 3. Jak wybrnąć sensownie z
>> takiej sytuacji? Osobna
>> klasa licząca + osobna typu beans? W beans'ie
>> dodatkowe metody liczące?
>> Można oczywiście już w implementacji dołożyć
>> odpowiednie zmienne, ale co
>> wtedy przekazywać jako argument?
>> Najchętniej wszystko co dotyczy liczenia i, że
>> tak powiem, formalnej
>> struktury beans'ów chciałbym mieć w jednej klasie.
>
> Możesz to zrobić np tak
>
> //property X
> public double getX() {return x};
> public void setX(double x) {this.x = x;}
> //property Y
> public double getY() {return y};
> public void setY(double y) {this.y = y;}
> //property Z
> public double getZ() {return z};
> public void setZ(double z) {this.z = z;}
>
> //property V
> public double getV() {return x * y * z;}
>
>
> Jak widzisz, właściwość V nie ma settera, jest
> tyko do odczytu. A jednocześnie jej getter
> wykonuje potrzebne obliczenia.
>
> Zauważ że w ciałach setterów/getterów nie musisz
> wcale pisać/czytać ze zmiennych. Możesz na
> przykład przekazywać wartości do innych obiektów,
> lub bazy danych, albo wołać jakieś funkcje API
> odwołujące się do realnego świata (np. sterować
> robotem).
>
Dziękuję za odpowiedź.
Tyle, że dane do getV pochodzą z innej klasy, u 
mnie z takiego kontenera danych. Nie ma więc 
(potrzeby?) get/set właściwości x,y,z w klasie 
liczącej.

Z tego by wynikało, że aby zachować konwencje 
beans'a wystarczy mi jedynie odczytywać wartość:

private double v;
...
public double getV() {
   return kontener.x * kontener.y * kontener.z;
}
Czy dobrze rozumiem?
Re: jak to jest z tymi JavaBeans
#153737
Author: Arivald
Date: Thu, 03 Jan 2013 10:15
84 lines
3731 bytes
W dniu 2013-01-03 11:03, Jadalbert pisze:
> W dniu 2013-01-03 10:18, Arivald pisze:
>> W dniu 2013-01-03 09:40, Jadalbert pisze:
>>> problem (czy raczej moja niewiedza) jest taki
>>> Mam program liczący pewne wielkości i, dajmy na
>>> to w uproszczeniu, w
>>> klasie Geom metodę
>>> public double V(double x, double y, double z) {
>>>      return x * y * z;
>>> }
>>> gdzieś tam jest to wywoływane:
>>> V_ = Geom.V(2,3,4);
>>> czyli trzeba wstawić trzy argumenty. Wszystko
>>> działa bez zarzutu.
>>> Teraz, z klas liczących chcę zrobić beans'y.
>>> Czyli powinno być tak (opierając się na
>>> powyższym przykładzie):
>>> private double v;
>>> ...
>>> public double getV() {return v};
>>> public void setV(double v) {this.v = v;}
>>
>> To jest tylko para sette/getter. W zamyśle razem
>> tworzą jedną właściwość obiektu.
>>
>>> i tu, zgodnie z konwencją, metoda set ma tylko
>>> jeden argument, a ja
>>> potrzebuję przekazać 3. Jak wybrnąć sensownie z
>>> takiej sytuacji? Osobna
>>> klasa licząca + osobna typu beans? W beans'ie
>>> dodatkowe metody liczące?
>>> Można oczywiście już w implementacji dołożyć
>>> odpowiednie zmienne, ale co
>>> wtedy przekazywać jako argument?
>>> Najchętniej wszystko co dotyczy liczenia i, że
>>> tak powiem, formalnej
>>> struktury beans'ów chciałbym mieć w jednej klasie.
>>
>> Możesz to zrobić np tak
>>
>> //property X
>> public double getX() {return x};
>> public void setX(double x) {this.x = x;}
>> //property Y
>> public double getY() {return y};
>> public void setY(double y) {this.y = y;}
>> //property Z
>> public double getZ() {return z};
>> public void setZ(double z) {this.z = z;}
>>
>> //property V
>> public double getV() {return x * y * z;}
>>
>>
>> Jak widzisz, właściwość V nie ma settera, jest
>> tyko do odczytu. A jednocześnie jej getter
>> wykonuje potrzebne obliczenia.
>>
>> Zauważ że w ciałach setterów/getterów nie musisz
>> wcale pisać/czytać ze zmiennych. Możesz na
>> przykład przekazywać wartości do innych obiektów,
>> lub bazy danych, albo wołać jakieś funkcje API
>> odwołujące się do realnego świata (np. sterować
>> robotem).
>>
> Dziękuję za odpowiedź.
> Tyle, że dane do getV pochodzą z innej klasy, u mnie z takiego kontenera
> danych. Nie ma więc (potrzeby?) get/set właściwości x,y,z w klasie
> liczącej.
>
> Z tego by wynikało, że aby zachować konwencje beans'a wystarczy mi
> jedynie odczytywać wartość:
>
> private double v;
> ...
> public double getV() {
>    return kontener.x * kontener.y * kontener.z;
> }
> Czy dobrze rozumiem?

Dokładnie tak.

-- 
Arivald
Re: jak to jest z tymi JavaBeans
#153738
Author: Jadalbert
Date: Thu, 03 Jan 2013 10:26
88 lines
3926 bytes
W dniu 2013-01-03 11:15, Arivald pisze:
> W dniu 2013-01-03 11:03, Jadalbert pisze:
>> W dniu 2013-01-03 10:18, Arivald pisze:
>>> W dniu 2013-01-03 09:40, Jadalbert pisze:
>>>> problem (czy raczej moja niewiedza) jest taki
>>>> Mam program liczący pewne wielkości i, dajmy na
>>>> to w uproszczeniu, w
>>>> klasie Geom metodę
>>>> public double V(double x, double y, double z) {
>>>>      return x * y * z;
>>>> }
>>>> gdzieś tam jest to wywoływane:
>>>> V_ = Geom.V(2,3,4);
>>>> czyli trzeba wstawić trzy argumenty. Wszystko
>>>> działa bez zarzutu.
>>>> Teraz, z klas liczących chcę zrobić beans'y.
>>>> Czyli powinno być tak (opierając się na
>>>> powyższym przykładzie):
>>>> private double v;
>>>> ...
>>>> public double getV() {return v};
>>>> public void setV(double v) {this.v = v;}
>>>
>>> To jest tylko para sette/getter. W zamyśle razem
>>> tworzą jedną właściwość obiektu.
>>>
>>>> i tu, zgodnie z konwencją, metoda set ma tylko
>>>> jeden argument, a ja
>>>> potrzebuję przekazać 3. Jak wybrnąć sensownie z
>>>> takiej sytuacji? Osobna
>>>> klasa licząca + osobna typu beans? W beans'ie
>>>> dodatkowe metody liczące?
>>>> Można oczywiście już w implementacji dołożyć
>>>> odpowiednie zmienne, ale co
>>>> wtedy przekazywać jako argument?
>>>> Najchętniej wszystko co dotyczy liczenia i, że
>>>> tak powiem, formalnej
>>>> struktury beans'ów chciałbym mieć w jednej
>>>> klasie.
>>>
>>> Możesz to zrobić np tak
>>>
>>> //property X
>>> public double getX() {return x};
>>> public void setX(double x) {this.x = x;}
>>> //property Y
>>> public double getY() {return y};
>>> public void setY(double y) {this.y = y;}
>>> //property Z
>>> public double getZ() {return z};
>>> public void setZ(double z) {this.z = z;}
>>>
>>> //property V
>>> public double getV() {return x * y * z;}
>>>
>>>
>>> Jak widzisz, właściwość V nie ma settera, jest
>>> tyko do odczytu. A jednocześnie jej getter
>>> wykonuje potrzebne obliczenia.
>>>
>>> Zauważ że w ciałach setterów/getterów nie musisz
>>> wcale pisać/czytać ze zmiennych. Możesz na
>>> przykład przekazywać wartości do innych obiektów,
>>> lub bazy danych, albo wołać jakieś funkcje API
>>> odwołujące się do realnego świata (np. sterować
>>> robotem).
>>>
>> Dziękuję za odpowiedź.
>> Tyle, że dane do getV pochodzą z innej klasy, u
>> mnie z takiego kontenera
>> danych. Nie ma więc (potrzeby?) get/set
>> właściwości x,y,z w klasie
>> liczącej.
>>
>> Z tego by wynikało, że aby zachować konwencje
>> beans'a wystarczy mi
>> jedynie odczytywać wartość:
>>
>> private double v;
>> ...
>> public double getV() {
>>    return kontener.x * kontener.y * kontener.z;
>> }
>> Czy dobrze rozumiem?
>
> Dokładnie tak.
>
Ok, dzięki, działam.
Re: jak to jest z tymi JavaBeans
#153739
Author: Roman W
Date: Thu, 03 Jan 2013 19:23
17 lines
1945 bytes
On Thu, 03 Jan 2013 11:15:53 +0100, Arivald 
<arivald_@AT_interia_DOT_.pl> wrote:
> > Z tego by wynika?o, ?e aby zachowa? konwencje beans'a wystarczy mi
> > jedynie odczytywa? warto??:
> >
> > private double v;
> > ...
> > public double getV() {
> >    return kontener.x * kontener.y * kontener.z;
> > }
> > Czy dobrze rozumiem?
> Dok?adnie tak.

Naprawd? tak sie to robi? Zaczynam rozumie? czemu ludzie nienawidz? 
Java Beans.

RW
Re: jak to jest z tymi JavaBeans
#153740
Author: Arivald
Date: Thu, 03 Jan 2013 20:15
27 lines
2086 bytes
W dniu 2013-01-03 20:23, Roman W pisze:
> On Thu, 03 Jan 2013 11:15:53 +0100, Arivald
> <arivald_@AT_interia_DOT_.pl> wrote:
>> > Z tego by wynika?o, ?e aby zachowa? konwencje beans'a wystarczy mi
>> > jedynie odczytywa? warto??:
>> >
>> > private double v;
>> > ...
>> > public double getV() {
>> >    return kontener.x * kontener.y * kontener.z;
>> > }
>> > Czy dobrze rozumiem?
>> Dok?adnie tak.
>
> Naprawd? tak sie to robi? Zaczynam rozumie? czemu ludzie nienawidz? Java
> Beans.
>
> RW

Jak masz jakieś uwagi, to merytorycznie poproszę.

I używaj proszę jakiegoś kompatybilnego czytnika newsów, albo 
do-konfiguruj sobie ten Twój żeby prawidłowo kodował polskie literki... 
Przypominam że kodowanie na grupach do albo ISO-8859-2, albo UTF-8.

-- 
Arivald
Re: jak to jest z tymi JavaBeans
#153749
Author: x
Date: Thu, 03 Jan 2013 20:33
42 lines
2468 bytes
W dniu 2013-01-03 09:40, Jadalbert pisze:
> problem (czy raczej moja niewiedza) jest taki
> Mam program liczący pewne wielkości i, dajmy na to w uproszczeniu, w
> klasie Geom metodę
> public double V(double x, double y, double z) {
>      return x * y * z;
> }
> gdzieś tam jest to wywoływane:
> V_ = Geom.V(2,3,4);
> czyli trzeba wstawić trzy argumenty. Wszystko działa bez zarzutu.
> Teraz, z klas liczących chcę zrobić beans'y.
> Czyli powinno być tak (opierając się na powyższym przykładzie):
> private double v;
> ...
> public double getV() {return v};
> public void setV(double v) {this.v = v;}
>
> i tu, zgodnie z konwencją, metoda set ma tylko jeden argument, a ja
> potrzebuję przekazać 3. Jak wybrnąć sensownie z takiej sytuacji? Osobna
> klasa licząca + osobna typu beans? W beans'ie dodatkowe metody liczące?
> Można oczywiście już w implementacji dołożyć odpowiednie zmienne, ale co
> wtedy przekazywać jako argument?
> Najchętniej wszystko co dotyczy liczenia i, że tak powiem, formalnej
> struktury beans'ów chciałbym mieć w jednej klasie.

Konwencja JavaBeans ma zastosowanie w przypadku klas, których obiekty 
mają jakieś "pola" lub "własności". W przypadku klasy Geom to nie zachodzi.

Czy jest jakiś konkretny powód, dla którego chcesz zastosować JavaBeans ?

Możesz oczywiście wykonać swoje obliczenie w ten sposób:

Geom g = new Geom();
g.setX(2);
g.setY(3);
g.setZ(4);
println(g.getV());

ale to jest po prostu bez sensu.

Pozdrawiam,
Marcin Jaskolski
Re: jak to jest z tymi JavaBeans
#153742
Author: x
Date: Thu, 03 Jan 2013 20:47
91 lines
4106 bytes
W dniu 2013-01-03 11:15, Arivald pisze:
> W dniu 2013-01-03 11:03, Jadalbert pisze:
>> W dniu 2013-01-03 10:18, Arivald pisze:
>>> W dniu 2013-01-03 09:40, Jadalbert pisze:
>>>> problem (czy raczej moja niewiedza) jest taki
>>>> Mam program liczący pewne wielkości i, dajmy na
>>>> to w uproszczeniu, w
>>>> klasie Geom metodę
>>>> public double V(double x, double y, double z) {
>>>>      return x * y * z;
>>>> }
>>>> gdzieś tam jest to wywoływane:
>>>> V_ = Geom.V(2,3,4);
>>>> czyli trzeba wstawić trzy argumenty. Wszystko
>>>> działa bez zarzutu.
>>>> Teraz, z klas liczących chcę zrobić beans'y.
>>>> Czyli powinno być tak (opierając się na
>>>> powyższym przykładzie):
>>>> private double v;
>>>> ...
>>>> public double getV() {return v};
>>>> public void setV(double v) {this.v = v;}
>>>
>>> To jest tylko para sette/getter. W zamyśle razem
>>> tworzą jedną właściwość obiektu.
>>>
>>>> i tu, zgodnie z konwencją, metoda set ma tylko
>>>> jeden argument, a ja
>>>> potrzebuję przekazać 3. Jak wybrnąć sensownie z
>>>> takiej sytuacji? Osobna
>>>> klasa licząca + osobna typu beans? W beans'ie
>>>> dodatkowe metody liczące?
>>>> Można oczywiście już w implementacji dołożyć
>>>> odpowiednie zmienne, ale co
>>>> wtedy przekazywać jako argument?
>>>> Najchętniej wszystko co dotyczy liczenia i, że
>>>> tak powiem, formalnej
>>>> struktury beans'ów chciałbym mieć w jednej klasie.
>>>
>>> Możesz to zrobić np tak
>>>
>>> //property X
>>> public double getX() {return x};
>>> public void setX(double x) {this.x = x;}
>>> //property Y
>>> public double getY() {return y};
>>> public void setY(double y) {this.y = y;}
>>> //property Z
>>> public double getZ() {return z};
>>> public void setZ(double z) {this.z = z;}
>>>
>>> //property V
>>> public double getV() {return x * y * z;}
>>>
>>>
>>> Jak widzisz, właściwość V nie ma settera, jest
>>> tyko do odczytu. A jednocześnie jej getter
>>> wykonuje potrzebne obliczenia.
>>>
>>> Zauważ że w ciałach setterów/getterów nie musisz
>>> wcale pisać/czytać ze zmiennych. Możesz na
>>> przykład przekazywać wartości do innych obiektów,
>>> lub bazy danych, albo wołać jakieś funkcje API
>>> odwołujące się do realnego świata (np. sterować
>>> robotem).
>>>
>> Dziękuję za odpowiedź.
>> Tyle, że dane do getV pochodzą z innej klasy, u mnie z takiego kontenera
>> danych. Nie ma więc (potrzeby?) get/set właściwości x,y,z w klasie
>> liczącej.
>>
>> Z tego by wynikało, że aby zachować konwencje beans'a wystarczy mi
>> jedynie odczytywać wartość:
>>
>> private double v;
>> ...
>> public double getV() {
>>    return kontener.x * kontener.y * kontener.z;
>> }
>> Czy dobrze rozumiem?
>
> Dokładnie tak.
>

Oj to nie wygląda za dobrze. Przede wszystkim dlatego, że większość 
programistów zinterpretuje nazwę getV() jako "zwracam pole V". Tymczasem 
metoda nawet nie operuje na polach obiektu na rzecz którego jest 
wywoływana, tylko na obiekcie "kontener"...

Pozdrawiam,
Marcin Jaskolski
Re: jak to jest z tymi JavaBeans
#153750
Author: Jadalbert
Date: Thu, 03 Jan 2013 20:54
74 lines
3617 bytes
W dniu 2013-01-03 21:33, x pisze:
> W dniu 2013-01-03 09:40, Jadalbert pisze:
>> problem (czy raczej moja niewiedza) jest taki
>> Mam program liczący pewne wielkości i, dajmy na
>> to w uproszczeniu, w
>> klasie Geom metodę
>> public double V(double x, double y, double z) {
>>      return x * y * z;
>> }
>> gdzieś tam jest to wywoływane:
>> V_ = Geom.V(2,3,4);
>> czyli trzeba wstawić trzy argumenty. Wszystko
>> działa bez zarzutu.
>> Teraz, z klas liczących chcę zrobić beans'y.
>> Czyli powinno być tak (opierając się na
>> powyższym przykładzie):
>> private double v;
>> ...
>> public double getV() {return v};
>> public void setV(double v) {this.v = v;}
>>
>> i tu, zgodnie z konwencją, metoda set ma tylko
>> jeden argument, a ja
>> potrzebuję przekazać 3. Jak wybrnąć sensownie z
>> takiej sytuacji? Osobna
>> klasa licząca + osobna typu beans? W beans'ie
>> dodatkowe metody liczące?
>> Można oczywiście już w implementacji dołożyć
>> odpowiednie zmienne, ale co
>> wtedy przekazywać jako argument?
>> Najchętniej wszystko co dotyczy liczenia i, że
>> tak powiem, formalnej
>> struktury beans'ów chciałbym mieć w jednej klasie.
>
> Konwencja JavaBeans ma zastosowanie w przypadku
> klas, których obiekty mają jakieś "pola" lub
> "własności". W przypadku klasy Geom to nie zachodzi.
>
> Czy jest jakiś konkretny powód, dla którego chcesz
> zastosować JavaBeans ?
>
> Możesz oczywiście wykonać swoje obliczenie w ten
> sposób:
>
> Geom g = new Geom();
> g.setX(2);
> g.setY(3);
> g.setZ(4);
> println(g.getV());
>
> ale to jest po prostu bez sensu.
>
> Pozdrawiam,
> Marcin Jaskolski
W klasie Geom rzeczywiście nie ma to sensu ale to 
tylko prosty przykład. Inne klasy mają własności.
Nie mam dużego doświadczenia w javie, ale 
pamiętam, że kiedyś czytałem, że pisze się jakby 
dwie klasy. Jedna to typowy beans z polami np. V_, 
a druga to klasa licząca to V i nie będąca beansem.
i wtedy będzie 1.setV_(2.V);
tak w uproszczeniu rzecz jasna.
Ale jestem raz leniwy, a dwa nie wiem czy to aby 
na pewno jest sensowne i poprawne.

A powód tych beansów jest taki, że się 
przeliczyłem w tym by mieć prosty (tylko java) 
program do robienia obliczeń z danych wsadowych. 
Zagadnienie jednak wymaga jakiegoś interfejsu 
zjadliwego dla użytkownika stąd chcę to przerobić 
na jsf, jsp czy tak jakoś. Choćby prezentacja 
wyników - za dużo ich na konsolę czy plik 
tekstowy. Prócz tego te beansy będą mieć 
zastosowanie przy rozbudowie aplikacji.
Re: jak to jest z tymi JavaBeans
#153743
Author: Jadalbert
Date: Thu, 03 Jan 2013 20:58
104 lines
4644 bytes
W dniu 2013-01-03 21:47, x pisze:
> W dniu 2013-01-03 11:15, Arivald pisze:
>> W dniu 2013-01-03 11:03, Jadalbert pisze:
>>> W dniu 2013-01-03 10:18, Arivald pisze:
>>>> W dniu 2013-01-03 09:40, Jadalbert pisze:
>>>>> problem (czy raczej moja niewiedza) jest taki
>>>>> Mam program liczący pewne wielkości i, dajmy na
>>>>> to w uproszczeniu, w
>>>>> klasie Geom metodę
>>>>> public double V(double x, double y, double z) {
>>>>>      return x * y * z;
>>>>> }
>>>>> gdzieś tam jest to wywoływane:
>>>>> V_ = Geom.V(2,3,4);
>>>>> czyli trzeba wstawić trzy argumenty. Wszystko
>>>>> działa bez zarzutu.
>>>>> Teraz, z klas liczących chcę zrobić beans'y.
>>>>> Czyli powinno być tak (opierając się na
>>>>> powyższym przykładzie):
>>>>> private double v;
>>>>> ...
>>>>> public double getV() {return v};
>>>>> public void setV(double v) {this.v = v;}
>>>>
>>>> To jest tylko para sette/getter. W zamyśle razem
>>>> tworzą jedną właściwość obiektu.
>>>>
>>>>> i tu, zgodnie z konwencją, metoda set ma tylko
>>>>> jeden argument, a ja
>>>>> potrzebuję przekazać 3. Jak wybrnąć sensownie z
>>>>> takiej sytuacji? Osobna
>>>>> klasa licząca + osobna typu beans? W beans'ie
>>>>> dodatkowe metody liczące?
>>>>> Można oczywiście już w implementacji dołożyć
>>>>> odpowiednie zmienne, ale co
>>>>> wtedy przekazywać jako argument?
>>>>> Najchętniej wszystko co dotyczy liczenia i, że
>>>>> tak powiem, formalnej
>>>>> struktury beans'ów chciałbym mieć w jednej
>>>>> klasie.
>>>>
>>>> Możesz to zrobić np tak
>>>>
>>>> //property X
>>>> public double getX() {return x};
>>>> public void setX(double x) {this.x = x;}
>>>> //property Y
>>>> public double getY() {return y};
>>>> public void setY(double y) {this.y = y;}
>>>> //property Z
>>>> public double getZ() {return z};
>>>> public void setZ(double z) {this.z = z;}
>>>>
>>>> //property V
>>>> public double getV() {return x * y * z;}
>>>>
>>>>
>>>> Jak widzisz, właściwość V nie ma settera, jest
>>>> tyko do odczytu. A jednocześnie jej getter
>>>> wykonuje potrzebne obliczenia.
>>>>
>>>> Zauważ że w ciałach setterów/getterów nie musisz
>>>> wcale pisać/czytać ze zmiennych. Możesz na
>>>> przykład przekazywać wartości do innych obiektów,
>>>> lub bazy danych, albo wołać jakieś funkcje API
>>>> odwołujące się do realnego świata (np. sterować
>>>> robotem).
>>>>
>>> Dziękuję za odpowiedź.
>>> Tyle, że dane do getV pochodzą z innej klasy, u
>>> mnie z takiego kontenera
>>> danych. Nie ma więc (potrzeby?) get/set
>>> właściwości x,y,z w klasie
>>> liczącej.
>>>
>>> Z tego by wynikało, że aby zachować konwencje
>>> beans'a wystarczy mi
>>> jedynie odczytywać wartość:
>>>
>>> private double v;
>>> ...
>>> public double getV() {
>>>    return kontener.x * kontener.y * kontener.z;
>>> }
>>> Czy dobrze rozumiem?
>>
>> Dokładnie tak.
>>
>
> Oj to nie wygląda za dobrze. Przede wszystkim
> dlatego, że większość programistów zinterpretuje
> nazwę getV() jako "zwracam pole V". Tymczasem
> metoda nawet nie operuje na polach obiektu na
> rzecz którego jest wywoływana, tylko na obiekcie
> "kontener"...
>
> Pozdrawiam,
> Marcin Jaskolski
>
>
no właśnie też mi się wydaje, że do zmiany 
wartości pola służy set..., a get... do odczytu
i stąd moje całkiem na górze pytanie i wątpliwości
jednak w javie to se poczynam na razie mizernie
Re: jak to jest z tymi JavaBeans
#153744
Author: Arivald
Date: Thu, 03 Jan 2013 21:15
44 lines
2840 bytes
W dniu 2013-01-03 21:47, x pisze:
> W dniu 2013-01-03 11:15, Arivald pisze:
>> W dniu 2013-01-03 11:03, Jadalbert pisze:
>>> W dniu 2013-01-03 10:18, Arivald pisze:
>>>
>>> Z tego by wynikało, że aby zachować konwencje beans'a wystarczy mi
>>> jedynie odczytywać wartość:
>>>
>>> private double v;
>>> ...
>>> public double getV() {
>>>    return kontener.x * kontener.y * kontener.z;
>>> }
>>> Czy dobrze rozumiem?
>>
>> Dokładnie tak.
>>
>
> Oj to nie wygląda za dobrze. Przede wszystkim dlatego, że większość
> programistów zinterpretuje nazwę getV() jako "zwracam pole V". Tymczasem
> metoda nawet nie operuje na polach obiektu na rzecz którego jest
> wywoływana, tylko na obiekcie "kontener"...

Większość programistów? Może Javowców.
A interpretacja jest nie "zwracam pole V", tylko "zwracam wartość 
właściwości 'V' ". A że właściwość jest zależna od innych, to trzeba ją 
obliczyć. Gdyby chodziło tylko o dostęp do pola, to nie miało by sensu w 
ogóle robienie settera czy gettera.

W językach gdzie właściwości (property) są standardem (C#, VB, Delphi 
czy JavaScript), jest to normalne podejście żeby robić jakieś proste 
obliczenie w getterze. A czasem nawet skomplikowane działania typu lazy 
init, czy obsługa cache.

Tak samo jak w setterze sprawdza się czy nowa wartość jest inna niż 
dotychczasowa, i jeśli tak to podejmuje się stosowną akcję (no 
odrysowanie kontrolki po zmianie jej rozmiaru czy koloru).

A Java nie ma natywnego wsparcia dla właściwości, ma tyko konwencję 
"Java beans", która symuluje właściwości. Może dlatego tyle 
nieporozumień z tym związanych.

-- 
Arivald
Re: jak to jest z tymi JavaBeans
#153751
Author: x
Date: Thu, 03 Jan 2013 21:44
96 lines
4500 bytes
W dniu 2013-01-03 21:54, Jadalbert pisze:
> W dniu 2013-01-03 21:33, x pisze:
>> W dniu 2013-01-03 09:40, Jadalbert pisze:
>>> problem (czy raczej moja niewiedza) jest taki
>>> Mam program liczący pewne wielkości i, dajmy na
>>> to w uproszczeniu, w
>>> klasie Geom metodę
>>> public double V(double x, double y, double z) {
>>>      return x * y * z;
>>> }
>>> gdzieś tam jest to wywoływane:
>>> V_ = Geom.V(2,3,4);
>>> czyli trzeba wstawić trzy argumenty. Wszystko
>>> działa bez zarzutu.
>>> Teraz, z klas liczących chcę zrobić beans'y.
>>> Czyli powinno być tak (opierając się na
>>> powyższym przykładzie):
>>> private double v;
>>> ...
>>> public double getV() {return v};
>>> public void setV(double v) {this.v = v;}
>>>
>>> i tu, zgodnie z konwencją, metoda set ma tylko
>>> jeden argument, a ja
>>> potrzebuję przekazać 3. Jak wybrnąć sensownie z
>>> takiej sytuacji? Osobna
>>> klasa licząca + osobna typu beans? W beans'ie
>>> dodatkowe metody liczące?
>>> Można oczywiście już w implementacji dołożyć
>>> odpowiednie zmienne, ale co
>>> wtedy przekazywać jako argument?
>>> Najchętniej wszystko co dotyczy liczenia i, że
>>> tak powiem, formalnej
>>> struktury beans'ów chciałbym mieć w jednej klasie.
>>
>> Konwencja JavaBeans ma zastosowanie w przypadku
>> klas, których obiekty mają jakieś "pola" lub
>> "własności". W przypadku klasy Geom to nie zachodzi.
>>
>> Czy jest jakiś konkretny powód, dla którego chcesz
>> zastosować JavaBeans ?
>>
>> Możesz oczywiście wykonać swoje obliczenie w ten
>> sposób:
>>
>> Geom g = new Geom();
>> g.setX(2);
>> g.setY(3);
>> g.setZ(4);
>> println(g.getV());
>>
>> ale to jest po prostu bez sensu.
>>
>> Pozdrawiam,
>> Marcin Jaskolski
> W klasie Geom rzeczywiście nie ma to sensu ale to tylko prosty przykład.
> Inne klasy mają własności.
> Nie mam dużego doświadczenia w javie, ale pamiętam, że kiedyś czytałem,
> że pisze się jakby dwie klasy. Jedna to typowy beans z polami np. V_, a

Czyli jedna klasa opisuje strukturę danych, a w drugiej siedzi logika 
obliczeń. Moim zdaniem to ma ręce i nogi, przede wszystkim dlatego że 
logika obliczeń lubi się mocno rozrastać. Co gorsza, często dotyczy 
więcej niż 1 obiektu, więc wpychanie jej do klasy "domenowej" nie musi 
być najlepszym pomysłem.

Oczywiście umieszczenie logiki w klasie domenowej jest bardziej "obiektowe".

Oczywiście klasa opisująca strukturę danych wcale nie musi być beanem.

> druga to klasa licząca to V i nie będąca beansem.
> i wtedy będzie 1.setV_(2.V);
Coś dziwnego - skąd obiekt 2 weźmie wartość v ?

Prędzej:

Obliczacz o = new Obliczacz();
MojeDane dane = new Dane(7, true, "ble");
o.obliczCoś(dane);


> tak w uproszczeniu rzecz jasna.
> Ale jestem raz leniwy, a dwa nie wiem czy to aby na pewno jest sensowne
> i poprawne.
>
> A powód tych beansów jest taki, że się przeliczyłem w tym by mieć prosty
> (tylko java) program do robienia obliczeń z danych wsadowych.
> Zagadnienie jednak wymaga jakiegoś interfejsu zjadliwego dla użytkownika
> stąd chcę to przerobić na jsf, jsp czy tak jakoś. Choćby prezentacja
> wyników - za dużo ich na konsolę czy plik tekstowy. Prócz tego te beansy
> będą mieć zastosowanie przy rozbudowie aplikacji.

Aha. Zdaje się że JSP lubią się z beanami.

Pozdrawiam,
Marcin Jaskolski
Re: jak to jest z tymi JavaBeans
#153752
Author: Arivald
Date: Thu, 03 Jan 2013 21:51
160 lines
5349 bytes
W dniu 2013-01-03 21:54, Jadalbert pisze:
> W dniu 2013-01-03 21:33, x pisze:
>> W dniu 2013-01-03 09:40, Jadalbert pisze:
>>> problem (czy raczej moja niewiedza) jest taki
>>> Mam program liczący pewne wielkości i, dajmy na
>>> to w uproszczeniu, w
>>> klasie Geom metodę
>>> public double V(double x, double y, double z) {
>>>      return x * y * z;
>>> }
>>> gdzieś tam jest to wywoływane:
>>> V_ = Geom.V(2,3,4);
>>> czyli trzeba wstawić trzy argumenty. Wszystko
>>> działa bez zarzutu.
>>> Teraz, z klas liczących chcę zrobić beans'y.
>>> Czyli powinno być tak (opierając się na
>>> powyższym przykładzie):
>>> private double v;
>>> ...
>>> public double getV() {return v};
>>> public void setV(double v) {this.v = v;}
>>>
>>> i tu, zgodnie z konwencją, metoda set ma tylko
>>> jeden argument, a ja
>>> potrzebuję przekazać 3. Jak wybrnąć sensownie z
>>> takiej sytuacji? Osobna
>>> klasa licząca + osobna typu beans? W beans'ie
>>> dodatkowe metody liczące?
>>> Można oczywiście już w implementacji dołożyć
>>> odpowiednie zmienne, ale co
>>> wtedy przekazywać jako argument?
>>> Najchętniej wszystko co dotyczy liczenia i, że
>>> tak powiem, formalnej
>>> struktury beans'ów chciałbym mieć w jednej klasie.
>>
>> Konwencja JavaBeans ma zastosowanie w przypadku
>> klas, których obiekty mają jakieś "pola" lub
>> "własności". W przypadku klasy Geom to nie zachodzi.
>>
>> Czy jest jakiś konkretny powód, dla którego chcesz
>> zastosować JavaBeans ?
>>
>> Możesz oczywiście wykonać swoje obliczenie w ten
>> sposób:
>>
>> Geom g = new Geom();
>> g.setX(2);
>> g.setY(3);
>> g.setZ(4);
>> println(g.getV());
>>

Zakładając że Geom ma liczyć coś dla jakichś obiektów (tu obiekt 
'figura'), można by to zrobić tak:

println(new Geom(figura).getV());


albo zrobić Geom klasą statyczną (a dokładniej jej funkcję getV):

println(Geom.getV(figura));


Ostatnia wersja wydaje się być najoptymalniejsza, bo nie tworzy obiektu 
tymczasowego.


>> ale to jest po prostu bez sensu.
>>
>> Pozdrawiam,
>> Marcin Jaskolski
> W klasie Geom rzeczywiście nie ma to sensu ale to tylko prosty przykład.
> Inne klasy mają własności.
> Nie mam dużego doświadczenia w javie, ale pamiętam, że kiedyś czytałem,
> że pisze się jakby dwie klasy. Jedna to typowy beans z polami np. V_, a
> druga to klasa licząca to V i nie będąca beansem.
> i wtedy będzie 1.setV_(2.V);
> tak w uproszczeniu rzecz jasna.
> Ale jestem raz leniwy, a dwa nie wiem czy to aby na pewno jest sensowne
> i poprawne.

To raczej miało tak wyglądać:

klasa 1 to POJO (http://pl.wikipedia.org/wiki/Plain_Old_Java_Object), 
ergo nie ma żadnego przetwarzania, tylko dane. Może być beanem (bez 
serializacji).

do tego druga klasa (lub kolekcja klas) realizująca jakieś przetwarzanie.

pełny przykład:

   public class First {
     private double x;
     private double y;
     private double z;

     public double getX() {
       return x;
     }
     public void setX(double x) {
       this.x = x;
     }
     public double getY() {
       return y;
     }
     public void setY(double y) {
       this.y = y;
     }
     public double getZ() {
       return z;
     }
     public void setZ(double z) {
       this.z = z;
     }
   }

   public class Second {
     private First first;

     public Second(First first) {
       this.first = first;
     }

     public double getV() {
       return first.getX() * first.getY() * first.getZ();
     }
   }


i użycie:

First f = something.getFirst(); //skądś tam się bierz
Second sec = new Second(f);
double v = sec.getV();

lub nawet

double v = new Second(something.getFirst()).getV();


W innej wersji, klasa Second jest statyczna (coś jak namespace z C++), 
dostarcza obliczeń bez konieczności tworzenia instancji.

public class Second {

   public static double getV(First first) {
     return first.getX() * first.getY() * first.getZ();
   }
}


Wtedy używa się jej tak:

double v = Second.getV(something.getFirst());


Wszystko zależy od potrzeb.

-- 
Arivald
Re: jak to jest z tymi JavaBeans
#153745
Author: x
Date: Thu, 03 Jan 2013 21:53
43 lines
2755 bytes
W dniu 2013-01-03 22:15, Arivald pisze:
> W dniu 2013-01-03 21:47, x pisze:
>> W dniu 2013-01-03 11:15, Arivald pisze:
>>> W dniu 2013-01-03 11:03, Jadalbert pisze:
>>>> W dniu 2013-01-03 10:18, Arivald pisze:
>>>>
>>>> Z tego by wynikało, że aby zachować konwencje beans'a wystarczy mi
>>>> jedynie odczytywać wartość:
>>>>
>>>> private double v;
>>>> ...
>>>> public double getV() {
>>>>    return kontener.x * kontener.y * kontener.z;
>>>> }
>>>> Czy dobrze rozumiem?
>>>
>>> Dokładnie tak.
>>>
>>
>> Oj to nie wygląda za dobrze. Przede wszystkim dlatego, że większość
>> programistów zinterpretuje nazwę getV() jako "zwracam pole V". Tymczasem
>> metoda nawet nie operuje na polach obiektu na rzecz którego jest
>> wywoływana, tylko na obiekcie "kontener"...
>
> Większość programistów? Może Javowców.
> A interpretacja jest nie "zwracam pole V", tylko "zwracam wartość
> właściwości 'V' ". A że właściwość jest zależna od innych, to trzeba ją
> obliczyć. Gdyby chodziło tylko o dostęp do pola, to nie miało by sensu w
> ogóle robienie settera czy gettera.

Tylko niech ta właściwość dotyczy obiektu na rzecz którego jest 
wywoływana, a nie jakiegoś innego.

> W językach gdzie właściwości (property) są standardem (C#, VB, Delphi
> czy JavaScript), jest to normalne podejście żeby robić jakieś proste
> obliczenie w getterze. A czasem nawet skomplikowane działania typu lazy
> init, czy obsługa cache.

W Javie również jest to bardzo powszechna praktyka. Ale trzeba z tym 
podejściem uważać, łatwo narobić bałaganu.

Pozdrawiam,
Marcin Jaskolski
Re: jak to jest z tymi JavaBeans
#153746
Author: Arivald
Date: Thu, 03 Jan 2013 22:06
64 lines
3504 bytes
W dniu 2013-01-03 22:53, x pisze:
> W dniu 2013-01-03 22:15, Arivald pisze:
>> W dniu 2013-01-03 21:47, x pisze:
>>> W dniu 2013-01-03 11:15, Arivald pisze:
>>>> W dniu 2013-01-03 11:03, Jadalbert pisze:
>>>>> W dniu 2013-01-03 10:18, Arivald pisze:
>>>>>
>>>>> Z tego by wynikało, że aby zachować konwencje beans'a wystarczy mi
>>>>> jedynie odczytywać wartość:
>>>>>
>>>>> private double v;
>>>>> ...
>>>>> public double getV() {
>>>>>    return kontener.x * kontener.y * kontener.z;
>>>>> }
>>>>> Czy dobrze rozumiem?
>>>>
>>>> Dokładnie tak.
>>>>
>>>
>>> Oj to nie wygląda za dobrze. Przede wszystkim dlatego, że większość
>>> programistów zinterpretuje nazwę getV() jako "zwracam pole V". Tymczasem
>>> metoda nawet nie operuje na polach obiektu na rzecz którego jest
>>> wywoływana, tylko na obiekcie "kontener"...
>>
>> Większość programistów? Może Javowców.
>> A interpretacja jest nie "zwracam pole V", tylko "zwracam wartość
>> właściwości 'V' ". A że właściwość jest zależna od innych, to trzeba ją
>> obliczyć. Gdyby chodziło tylko o dostęp do pola, to nie miało by sensu w
>> ogóle robienie settera czy gettera.
>
> Tylko niech ta właściwość dotyczy obiektu na rzecz którego jest
> wywoływana, a nie jakiegoś innego.
>

Ale czemu? To nie ma uzasadnienia.

Dla przykładu, mamy klasę Samochod:

class Samochod {
   Siedzenie kierowca;
   Siedzenie pasazerZPrzodu;
   Siedzenie kanapaTylna;

   int getIloscOsob() {
     return kierowca.getIloscOsob()
          + pasazerZPrzodu.getIloscOsob()
          + kanapaTylna.getIloscOsob();
   }

}

>> W językach gdzie właściwości (property) są standardem (C#, VB, Delphi
>> czy JavaScript), jest to normalne podejście żeby robić jakieś proste
>> obliczenie w getterze. A czasem nawet skomplikowane działania typu lazy
>> init, czy obsługa cache.
>
> W Javie również jest to bardzo powszechna praktyka. Ale trzeba z tym
> podejściem uważać, łatwo narobić bałaganu.

Oczywiście, z tym się w pełni zgadzam.

-- 
Arivald
Re: jak to jest z tymi JavaBeans
#153753
Author: x
Date: Thu, 03 Jan 2013 22:20
180 lines
6309 bytes
W dniu 2013-01-03 22:51, Arivald pisze:
> W dniu 2013-01-03 21:54, Jadalbert pisze:
>> W dniu 2013-01-03 21:33, x pisze:
>>> W dniu 2013-01-03 09:40, Jadalbert pisze:
>>>> problem (czy raczej moja niewiedza) jest taki
>>>> Mam program liczący pewne wielkości i, dajmy na
>>>> to w uproszczeniu, w
>>>> klasie Geom metodę
>>>> public double V(double x, double y, double z) {
>>>>      return x * y * z;
>>>> }
>>>> gdzieś tam jest to wywoływane:
>>>> V_ = Geom.V(2,3,4);
>>>> czyli trzeba wstawić trzy argumenty. Wszystko
>>>> działa bez zarzutu.
>>>> Teraz, z klas liczących chcę zrobić beans'y.
>>>> Czyli powinno być tak (opierając się na
>>>> powyższym przykładzie):
>>>> private double v;
>>>> ...
>>>> public double getV() {return v};
>>>> public void setV(double v) {this.v = v;}
>>>>
>>>> i tu, zgodnie z konwencją, metoda set ma tylko
>>>> jeden argument, a ja
>>>> potrzebuję przekazać 3. Jak wybrnąć sensownie z
>>>> takiej sytuacji? Osobna
>>>> klasa licząca + osobna typu beans? W beans'ie
>>>> dodatkowe metody liczące?
>>>> Można oczywiście już w implementacji dołożyć
>>>> odpowiednie zmienne, ale co
>>>> wtedy przekazywać jako argument?
>>>> Najchętniej wszystko co dotyczy liczenia i, że
>>>> tak powiem, formalnej
>>>> struktury beans'ów chciałbym mieć w jednej klasie.
>>>
>>> Konwencja JavaBeans ma zastosowanie w przypadku
>>> klas, których obiekty mają jakieś "pola" lub
>>> "własności". W przypadku klasy Geom to nie zachodzi.
>>>
>>> Czy jest jakiś konkretny powód, dla którego chcesz
>>> zastosować JavaBeans ?
>>>
>>> Możesz oczywiście wykonać swoje obliczenie w ten
>>> sposób:
>>>
>>> Geom g = new Geom();
>>> g.setX(2);
>>> g.setY(3);
>>> g.setZ(4);
>>> println(g.getV());
>>>
>
> Zakładając że Geom ma liczyć coś dla jakichś obiektów (tu obiekt
> 'figura'), można by to zrobić tak:
>
> println(new Geom(figura).getV());
>
>
> albo zrobić Geom klasą statyczną (a dokładniej jej funkcję getV):
>
> println(Geom.getV(figura));
>
>
> Ostatnia wersja wydaje się być najoptymalniejsza, bo nie tworzy obiektu
> tymczasowego.
>
>
>>> ale to jest po prostu bez sensu.
>>>
>>> Pozdrawiam,
>>> Marcin Jaskolski
>> W klasie Geom rzeczywiście nie ma to sensu ale to tylko prosty przykład.
>> Inne klasy mają własności.
>> Nie mam dużego doświadczenia w javie, ale pamiętam, że kiedyś czytałem,
>> że pisze się jakby dwie klasy. Jedna to typowy beans z polami np. V_, a
>> druga to klasa licząca to V i nie będąca beansem.
>> i wtedy będzie 1.setV_(2.V);
>> tak w uproszczeniu rzecz jasna.
>> Ale jestem raz leniwy, a dwa nie wiem czy to aby na pewno jest sensowne
>> i poprawne.
>
> To raczej miało tak wyglądać:
>
> klasa 1 to POJO (http://pl.wikipedia.org/wiki/Plain_Old_Java_Object),
> ergo nie ma żadnego przetwarzania, tylko dane. Może być beanem (bez
> serializacji).
>
> do tego druga klasa (lub kolekcja klas) realizująca jakieś przetwarzanie.
>
> pełny przykład:
>
>    public class First {
>      private double x;
>      private double y;
>      private double z;
>
>      public double getX() {
>        return x;
>      }
>      public void setX(double x) {
>        this.x = x;
>      }
>      public double getY() {
>        return y;
>      }
>      public void setY(double y) {
>        this.y = y;
>      }
>      public double getZ() {
>        return z;
>      }
>      public void setZ(double z) {
>        this.z = z;
>      }
>    }

To ma ręce i nogi, oczywiście przy założeniu że koniecznie chcemy 
JavaBeana...

>
>    public class Second {
>      private First first;
>
>      public Second(First first) {
>        this.first = first;
>      }
>
>    public double getV() {
>      return first.getX() * first.getY() * first.getZ();
>    }

To jest bez sensu. Pojedynczą operację obliczenia V rozbiłeś na dwie: 
utworzenia nowego obiektu klasy Second (po co ???) i właściwego 
obliczenia. No i znowu wygląda na to, że V jest właściwością obiektu 
klasy Second, a nie jest.

Po prostu w ten sposób:

public double computeV(First first) {
   return first.getX() * first.getY() * first.getZ();
}

> i użycie:
>
> First f = something.getFirst(); //skądś tam się bierz
> Second sec = new Second(f);
> double v = sec.getV();
>
> lub nawet
>
> double v = new Second(something.getFirst()).getV();
>
> W innej wersji, klasa Second jest statyczna (coś jak namespace z C++),
> dostarcza obliczeń bez konieczności tworzenia instancji.

To jest akceptowalne w przypadku naprawdę prostych funkcjonalności (tak 
jak Apachowe StringUtils. W ogólnym przypadku trochę śliskie, bo nie da 
się zamienić implementacji (np na mocka).

>
> public class Second {
>
>    public static double getV(First first) {
>      return first.getX() * first.getY() * first.getZ();
>    }
> }
>
>
> Wtedy używa się jej tak:
>
> double v = Second.getV(something.getFirst());
>
> Wszystko zależy od potrzeb.

Należy róznież pamiętać o tym, że w Javie nie ma reguły mówiącej że 
wszystkie nazwy metod muszą się zaczynać od set lub get ;-)

Pozdrawiam,
Marcin Jaskolski
Re: jak to jest z tymi JavaBeans
#153747
Author: x
Date: Thu, 03 Jan 2013 22:27
57 lines
3060 bytes
W dniu 2013-01-03 23:06, Arivald pisze:
> W dniu 2013-01-03 22:53, x pisze:
>> W dniu 2013-01-03 22:15, Arivald pisze:
>>> W dniu 2013-01-03 21:47, x pisze:
>>>> W dniu 2013-01-03 11:15, Arivald pisze:
>>>>> W dniu 2013-01-03 11:03, Jadalbert pisze:
>>>>>> W dniu 2013-01-03 10:18, Arivald pisze:
>>>>>>
>>>>>> Z tego by wynikało, że aby zachować konwencje beans'a wystarczy mi
>>>>>> jedynie odczytywać wartość:
>>>>>>
>>>>>> private double v;
>>>>>> ...
>>>>>> public double getV() {
>>>>>>    return kontener.x * kontener.y * kontener.z;
>>>>>> }
>>>>>> Czy dobrze rozumiem?
>>>>>
>>>>> Dokładnie tak.
>>>>>
>>>>
>>>> Oj to nie wygląda za dobrze. Przede wszystkim dlatego, że większość
>>>> programistów zinterpretuje nazwę getV() jako "zwracam pole V".
>>>> Tymczasem
>>>> metoda nawet nie operuje na polach obiektu na rzecz którego jest
>>>> wywoływana, tylko na obiekcie "kontener"...
>>>
>>> Większość programistów? Może Javowców.
>>> A interpretacja jest nie "zwracam pole V", tylko "zwracam wartość
>>> właściwości 'V' ". A że właściwość jest zależna od innych, to trzeba ją
>>> obliczyć. Gdyby chodziło tylko o dostęp do pola, to nie miało by sensu w
>>> ogóle robienie settera czy gettera.
>>
>> Tylko niech ta właściwość dotyczy obiektu na rzecz którego jest
>> wywoływana, a nie jakiegoś innego.
>>
>
> Ale czemu? To nie ma uzasadnienia.
>
> Dla przykładu, mamy klasę Samochod:
>
> class Samochod {
>    Siedzenie kierowca;
>    Siedzenie pasazerZPrzodu;
>    Siedzenie kanapaTylna;
>
>    int getIloscOsob() {
>      return kierowca.getIloscOsob()
>           + pasazerZPrzodu.getIloscOsob()
>           + kanapaTylna.getIloscOsob();
>    }
> }

OK, racja, w tym przypadku mamy części składowe samochodu.

Pozdrawiam,
Marcin Jaskolski
Re: jak to jest z tymi JavaBeans
#153754
Author: Arivald
Date: Thu, 03 Jan 2013 22:40
140 lines
5419 bytes
W dniu 2013-01-03 23:20, x pisze:
> W dniu 2013-01-03 22:51, Arivald pisze:
>> W dniu 2013-01-03 21:54, Jadalbert pisze:
>>> W dniu 2013-01-03 21:33, x pisze:
>>>> W dniu 2013-01-03 09:40, Jadalbert pisze:
>>> W klasie Geom rzeczywiście nie ma to sensu ale to tylko prosty przykład.
>>> Inne klasy mają własności.
>>> Nie mam dużego doświadczenia w javie, ale pamiętam, że kiedyś czytałem,
>>> że pisze się jakby dwie klasy. Jedna to typowy beans z polami np. V_, a
>>> druga to klasa licząca to V i nie będąca beansem.
>>> i wtedy będzie 1.setV_(2.V);
>>> tak w uproszczeniu rzecz jasna.
>>> Ale jestem raz leniwy, a dwa nie wiem czy to aby na pewno jest sensowne
>>> i poprawne.
>>
>> To raczej miało tak wyglądać:
>>
>> klasa 1 to POJO (http://pl.wikipedia.org/wiki/Plain_Old_Java_Object),
>> ergo nie ma żadnego przetwarzania, tylko dane. Może być beanem (bez
>> serializacji).
>>
>> do tego druga klasa (lub kolekcja klas) realizująca jakieś przetwarzanie.
>>
>> pełny przykład:
>>
>>    public class First {
>>      private double x;
>>      private double y;
>>      private double z;
>>
>>      public double getX() {
>>        return x;
>>      }
>>      public void setX(double x) {
>>        this.x = x;
>>      }
>>      public double getY() {
>>        return y;
>>      }
>>      public void setY(double y) {
>>        this.y = y;
>>      }
>>      public double getZ() {
>>        return z;
>>      }
>>      public void setZ(double z) {
>>        this.z = z;
>>      }
>>    }
>
> To ma ręce i nogi, oczywiście przy założeniu że koniecznie chcemy
> JavaBeana...
>

Oczywiście wystarczyły by publiczne pola, ale OP pytał o beany.

>>
>>    public class Second {
>>      private First first;
>>
>>      public Second(First first) {
>>        this.first = first;
>>      }
>>
>>    public double getV() {
>>      return first.getX() * first.getY() * first.getZ();
>>    }
>
> To jest bez sensu. Pojedynczą operację obliczenia V rozbiłeś na dwie:
> utworzenia nowego obiektu klasy Second (po co ???) i właściwego
> obliczenia. No i znowu wygląda na to, że V jest właściwością obiektu
> klasy Second, a nie jest.

Założenie jest takie że klasa Second realizuje wiele różnych obliczeń. W 
przykładzie jest tylko jedno.

Osobiście lubię ten model że konkretną instancję klasy danych na stałe 
wiąże się z instancją klasy obliczeniowej.

Choć nie zawsze jest to najsensowniejsze.

>
> Po prostu w ten sposób:
>
> public double computeV(First first) {
>    return first.getX() * first.getY() * first.getZ();
> }
>

Też można.
Do OP: Oczywiście w tym wypadku zakładamy że konstruktor Second jest 
domyślny, bezargumentowy, a jedna instancja klasy Second może być 
używana do obsługi wielu obiektów First. Implikuje to także bezstanowość 
klasy Second (tzn nie ma ona żadnych pól),


>> i użycie:
>>
>> First f = something.getFirst(); //skądś tam się bierz
>> Second sec = new Second(f);
>> double v = sec.getV();
>>
>> lub nawet
>>
>> double v = new Second(something.getFirst()).getV();
>>
>> W innej wersji, klasa Second jest statyczna (coś jak namespace z C++),
>> dostarcza obliczeń bez konieczności tworzenia instancji.
>
> To jest akceptowalne w przypadku naprawdę prostych funkcjonalności (tak
> jak Apachowe StringUtils. W ogólnym przypadku trochę śliskie, bo nie da
> się zamienić implementacji (np na mocka).
>

No cóż, to prawda. Coś za coś ;-)

>>
>> public class Second {
>>
>>    public static double getV(First first) {
>>      return first.getX() * first.getY() * first.getZ();
>>    }
>> }
>>
>>
>> Wtedy używa się jej tak:
>>
>> double v = Second.getV(something.getFirst());
>>
>> Wszystko zależy od potrzeb.
>
> Należy róznież pamiętać o tym, że w Javie nie ma reguły mówiącej że
> wszystkie nazwy metod muszą się zaczynać od set lub get ;-)

A to już moje przyzwyczajenie kolidujące z konwencją beanów. Na co dzień 
programuję w języku z właściwościami, i funkcje typu GetXX czy IsXX 
używam to nie są gettery ;-)

-- 
Arivald
Re: jak to jest z tymi JavaBeans
#153756
Author: Piotr Rezmer
Date: Fri, 04 Jan 2013 07:19
30 lines
2466 bytes
Jadalbert pisze:

> A powód tych beansów jest taki, że się przeliczyłem w tym by mieć prosty
> (tylko java) program do robienia obliczeń z danych wsadowych.
> Zagadnienie jednak wymaga jakiegoś interfejsu zjadliwego dla użytkownika
> stąd chcę to przerobić na jsf, jsp czy tak jakoś. Choćby prezentacja
> wyników - za dużo ich na konsolę czy plik tekstowy. Prócz tego te beansy
> będą mieć zastosowanie przy rozbudowie aplikacji.

Zupełnie niepotrzebnie narzucasz ograniczenia związane z warstwą widoku 
na logikę aplikacji. JavaBeans sprawuje się dobrze w takich 
zagadnieniach jak serializacja, spring framework. To taka klasa typu 
entity. Jeśli w którymś fragmencie projektu pojawi się takie wymaganie 
(czyli najczęściej na brzegu systemu - klasy boundary), to tam dopiero 
przeprowadź konwersję obiektu biznesowego na taki który spełnia 
wymagania systemu zewnętrznego (pliku, soap,.., jsp). W ten sposób jeśli 
zmienisz system zewnętrzny, będziesz musiał wprowadzić zmiany tylko w 
jednym miejscu systemu.

W przypadku stron JSP skorzystaj z jakiegoś frameworka MVC. Ja korzystam 
ze struts. Wtedy javaBean'em jest klasa formularza. Wewnątrz akcji 
struts (metoda execute() ) odczytasz właściwości obiektu biznesowego i 
ustawisz property formularza.



-- 
pozdrawiam
Piotr
XLR250&bmw_f650_dakar
Re: jak to jest z tymi JavaBeans
#153755
Author: x
Date: Fri, 04 Jan 2013 07:41
86 lines
3837 bytes
W dniu 2013-01-03 23:40, Arivald pisze:
> W dniu 2013-01-03 23:20, x pisze:
>> W dniu 2013-01-03 22:51, Arivald pisze:
>>> W dniu 2013-01-03 21:54, Jadalbert pisze:
>>>> W dniu 2013-01-03 21:33, x pisze:
>>>>> W dniu 2013-01-03 09:40, Jadalbert pisze:
>>>> W klasie Geom rzeczywiście nie ma to sensu ale to tylko prosty
>>>> przykład.
>>>> Inne klasy mają własności.
>>>> Nie mam dużego doświadczenia w javie, ale pamiętam, że kiedyś czytałem,
>>>> że pisze się jakby dwie klasy. Jedna to typowy beans z polami np. V_, a
>>>> druga to klasa licząca to V i nie będąca beansem.
>>>> i wtedy będzie 1.setV_(2.V);
>>>> tak w uproszczeniu rzecz jasna.
>>>> Ale jestem raz leniwy, a dwa nie wiem czy to aby na pewno jest sensowne
>>>> i poprawne.
>>>
>>> To raczej miało tak wyglądać:
>>>
>>> klasa 1 to POJO (http://pl.wikipedia.org/wiki/Plain_Old_Java_Object),
>>> ergo nie ma żadnego przetwarzania, tylko dane. Może być beanem (bez
>>> serializacji).
>>>
>>> do tego druga klasa (lub kolekcja klas) realizująca jakieś
>>> przetwarzanie.
>>>
>>> pełny przykład:
>>>
>>>    public class First {
>>>      private double x;
>>>      private double y;
>>>      private double z;
>>>
>>>      public double getX() {
>>>        return x;
>>>      }
>>>      public void setX(double x) {
>>>        this.x = x;
>>>      }
>>>      public double getY() {
>>>        return y;
>>>      }
>>>      public void setY(double y) {
>>>        this.y = y;
>>>      }
>>>      public double getZ() {
>>>        return z;
>>>      }
>>>      public void setZ(double z) {
>>>        this.z = z;
>>>      }
>>>    }
>>
>> To ma ręce i nogi, oczywiście przy założeniu że koniecznie chcemy
>> JavaBeana...
>>
>
> Oczywiście wystarczyły by publiczne pola, ale OP pytał o beany.
>
>>>
>>>    public class Second {
>>>      private First first;
>>>
>>>      public Second(First first) {
>>>        this.first = first;
>>>      }
>>>
>>>    public double getV() {
>>>      return first.getX() * first.getY() * first.getZ();
>>>    }
>>
>> To jest bez sensu. Pojedynczą operację obliczenia V rozbiłeś na dwie:
>> utworzenia nowego obiektu klasy Second (po co ???) i właściwego
>> obliczenia. No i znowu wygląda na to, że V jest właściwością obiektu
>> klasy Second, a nie jest.
>
> Założenie jest takie że klasa Second realizuje wiele różnych obliczeń. W
> przykładzie jest tylko jedno.
>
> Osobiście lubię ten model że konkretną instancję klasy danych na stałe
> wiąże się z instancją klasy obliczeniowej.

W sumie to jakiś czas temu użyłem tego podejścia w Scali i było OK ;-)

Pozdrawiam,
Marcin Jaskolski
Re: jak to jest z tymi JavaBeans
#153741
Author: Roman W
Date: Fri, 04 Jan 2013 09:45
20 lines
2097 bytes
On Thu, 03 Jan 2013 21:15:41 +0100, Arivald 
<NOSPAMarivald@interia.pl> wrote:
> >> >
> >> > private double v;
> >> > ...
> >> > public double getV() {
> >> >    return kontener.x * kontener.y * kontener.z;
> >> > }
> >> > Czy dobrze rozumiem?
> >> Dok?adnie tak.
> >
> > Naprawd? tak sie to robi? Zaczynam rozumie? czemu ludzie 
nienawidz? Java
> > Beans.
> Jak masz jakieś uwagi, to merytorycznie poproszę.

Po co deklaracja zmiennej v jezeli getV jej nie odczytuje tylko robi 
obliczenie?

RW
Re: jak to jest z tymi JavaBeans
#153748
Author: William Bonawentura
Date: Fri, 04 Jan 2013 10:19
5 lines
1616 bytes
> Dla przykładu, mamy klasę Samochod:
>

Przez analogię z realnym światem. Nigdy nie słyszałam o tym, by samochód mówił ilu ma pasażerów. To ktoś z zewnątrz np. obserwator 
spogląda na każdy z foteli i liczy. 
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads