🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.java
Article #153753

Re: jak to jest z tymi JavaBeans

#153753
From: 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
Technical Details
Message-ID: <50e60438$0$1306$65785112@news.neostrada.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!newsfeed.neostrada.pl!unt-exc-01.news.neostrada.pl!unt-spo-a-02.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
References: <50e54418$0$1298$65785112@news.neostrada.pl> <50e5eb16$0$26696$65785112@news.neostrada.pl> <50e5eff0$0$1295$65785112@news.neostrada.pl> <kc4uho$urh$1@news.dialog.net.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!newsfeed.neostrada.pl!unt-exc-01.news.neostrada.pl!unt-spo-a-02.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
Date: Thu, 03 Jan 2013 23:20:35 +0100
From: x <x@x.x>
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20121010 Thunderbird/16.0.1
MIME-Version: 1.0
Newsgroups: pl.comp.lang.java
Subject: Re: jak to jest z tymi JavaBeans
References: <50e54418$0$1298$65785112@news.neostrada.pl> <50e5eb16$0$26696$65785112@news.neostrada.pl> <50e5eff0$0$1295$65785112@news.neostrada.pl> <kc4uho$urh$1@news.dialog.net.pl>
In-Reply-To: <kc4uho$urh$1@news.dialog.net.pl>
Lines: 180
Message-ID: <50e60438$0$1306$65785112@news.neostrada.pl>
Organization: Telekomunikacja Polska
NNTP-Posting-Host: 178.43.244.214
X-Trace: 1357251640 unt-rea-a-02.news.neostrada.pl 1306 178.43.244.214:3268
X-Complaints-To: abuse@news.neostrada.pl
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit