Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Fabrike, fabrike, svuda oko nas

[es] :: Java :: Fabrike, fabrike, svuda oko nas

[ Pregleda: 2303 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.adsl.zonnet.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Fabrike, fabrike, svuda oko nas09.06.2004. u 23:09 - pre 241 meseci
A šta će ova poruka ovde uopšte? Pa, s obzirom da nema foruma koji se nominalno bavi OO dizajnom, rekoh možda je ovde najprikladnije.

Prvo, imam klasu čija instanca tokom rada koristi objekte nekoliko različitih klasa. Kako bih želeo da korisnik može da menja klase za ove objekte, želeo bih da napravim po jedan factory metod za svaku klasu. Da li je bolje za recimo 3 različita objekta staviti 3 različite nepovezane „fabrike“, ili sve fabrike skupiti u novu klasu preko čijeg interfejsa će se dobijati nove instance?

Drugo, u istoj priči postoji i algoritam koji napravi iterator kroz rečene objekte i nešto radi s njima, poput foreach. Da bih postavio sve u konkretne okvire, zamislite da postoji objekat tipa Graph koji sadrži objekte tipa Vertex i Edge (oni se prave gorepomenutim fabrikama).

Recimo da imam iterator koji omogućava korisniku da se prošeta kroz sve objekte tipa Vertex. Ukoliko kasnije napravim klasu LabeledVertex (implements Vertex) i odgovarajuću fabriku, u algoritmu foreach naravno dobijaću elemente tipa Vertex, pa moram ručno da ih pretvaram u LabeledVertex kako bih sa njima odradio ono što želim. Da li je ovo rešenje u redu ili postoji nešto elegantnije? Ono što mi se u ovom rešenju ne sviđa jeste što korisnik može da „podmetne“ neodgovarajući tip datom algoritmu, što će dati ClassCastException kada foreach pokuša da „uforsira“ tip LabeledVertex. Da li to može da se izbegne nekako?

Treće, potrebne su mi dodatne metode za klasu String (konkretnije, neke metode iz java.lang.String iz jre 1.4, dok koristim jre 1.3). Da li je bolje rešenje napraviti klasu (npr. Compat) koja sadrži statičke metode ili možda naslediti String 1.3, delegirati metode koji postoje a dopisati 1.4? Pritom je naravno problem što se u novonapravljenoj klasi ne koristi nijedan metod nasleđen od String pošto je nasleđivanje bilo samo zbog is-a. A možda i nije problem? Ne znam kako JVM tretira takve slučajeve?

f
 
Odgovor na temu

StMilan

Član broj: 5061
Poruke: 144
*.ptt.yu



Profil

icon Re: Fabrike, fabrike, svuda oko nas10.06.2004. u 00:53 - pre 241 meseci
Moguce je da cu sad skroz da promasim, mozda te nisam najbolje shvatio.

Koliko sam shvatio, Vertex i Edge nemaju nista zajednicko, tako da bi tvoja fabrika trebalo da ima metode createVertex i createEdge.
Tvoj objekat inicijalizujes odgovarajucom fabrikom i onda on poziva createVertex i createEdge.

Sto se tice iteratora najbolje da tu iskoristis Vistor obrazac. Znaci imas metodu visit u Vertexu, i nasledis je u podklasama. Dobijes nesto tipa:
Iterator it = getVertexIterator();
while (it.hasNext()) {
Vertex v = it.next();
v.visit();
}
Ovo naravno ako sam dobro razumeo tvoj problem.

Sa Stringom je problem je sto je on deo definicije samog jezika tako da je to nasledjivanje problematicno. Ja bih probao sa Compat klasom.
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.adsl.zonnet.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Fabrike, fabrike, svuda oko nas10.06.2004. u 01:19 - pre 241 meseci
Citat:
StMilan:
Tvoj objekat inicijalizujes odgovarajucom fabrikom i onda on poziva createVertex i createEdge.

Pitanje je bilo da li da, ako mi trebaju recimo 3 posebne fabrike, njih spakujem u neku
klasu koja samo sadrži nijh tri (tuple), ili da ih ostavim kao posebne delove agregata.

Citat:

Sto se tice iteratora najbolje da tu iskoristis Vistor obrazac.


Deluje da je to TO. :)

Citat:
Ja bih probao sa Compat klasom.

Tako ispada na kraju.

f
 
Odgovor na temu

nsivacki
Nikola Sivački
Beograd

Član broj: 20950
Poruke: 6
*.dial.InfoSky.Net

Sajt: galeb.etf.bg.ac.yu/~nicks


Profil

icon Re: Fabrike, fabrike, svuda oko nas10.06.2004. u 08:11 - pre 241 meseci
Citat:
filmil:

Drugo, u istoj priči postoji i algoritam koji napravi iterator kroz rečene objekte i nešto radi s njima, poput foreach. Da bih postavio sve u konkretne okvire, zamislite da postoji objekat tipa Graph koji sadrži objekte tipa Vertex i Edge (oni se prave gorepomenutim fabrikama).
Recimo da imam iterator koji omogućava korisniku da se prošeta kroz sve objekte tipa Vertex. Ukoliko kasnije napravim klasu LabeledVertex (implements Vertex) i odgovarajuću fabriku, u algoritmu foreach naravno dobijaću elemente tipa Vertex, pa moram ručno da ih pretvaram u LabeledVertex kako bih sa njima odradio ono što želim. Da li je ovo rešenje u redu ili postoji nešto elegantnije? Ono što mi se u ovom rešenju ne sviđa jeste što korisnik može da „podmetne“ neodgovarajući tip datom algoritmu, što će dati ClassCastException kada foreach pokuša da „uforsira“ tip LabeledVertex. Da li to može da se izbegne nekako?

f


Mislim da ti ovde treba sledece :
U interfejsu Vertex deklarises apstraktnu metodu
"public Vertex getInstance();",
zatim u svim implementacijama interfejsa u telo definicije metode stavis : "return this;", pa ces pri svakom pozivu getInstance() dobiti objekat klase koja ti treba.
Korisnik Vertex-a definise getInstance() pa nema podmetanja.




pozdrav,
ns


 
Odgovor na temu

sspasic
Sasa Spasic

Član broj: 3261
Poruke: 175
*.medianis.net

Jabber: sspasic@elitesecurity.org
ICQ: 35454521


Profil

icon Re: Fabrike, fabrike, svuda oko nas10.06.2004. u 11:47 - pre 241 meseci
@StMilan
Samo da dodam da se naziv 'Visitor obrazac' obično koristi za nešto drugo,
(http://c2.com/cgi/wiki?VisitorPattern i http://c2.com/cgi/wiki?VisitorPatternExample).

 
Odgovor na temu

StMilan

Član broj: 5061
Poruke: 144
*.ptt.yu



Profil

icon Re: Fabrike, fabrike, svuda oko nas10.06.2004. u 17:54 - pre 241 meseci
Citat:
Pitanje je bilo da li da, ako mi trebaju recimo 3 posebne fabrike, njih spakujem u neku klasu koja samo sadrži nijh tri (tuple), ili da ih ostavim kao posebne delove agregata.

Kao posebne klase.
interface GraphFactory { Vertex createVertex(parametri); Edge creatEdge(parametri); }

class Factory1 implements Factrory {...}
class Factory2 implements Factrory {...}

Nadam se da sam te sad dobro razumeo.

Ono sto sam ja naveo jeste Visitor pattern, mozda njegova najjednostavnija varijanta, gde je zbog jednostavnosti metoda zapravo izostavio Visitor klasu. Ne znam da li Filipu treba nesto komplikovanije, u svakom slucaju ako treba primer koji je naveo sspasic moze da posluzi.

Ono sto je sspasic naveo kao kao getInstance() ne resava Filipu problem, u stvari ne resava nista, jer mora da se pozove sa objekat.getInstance() sto daje isti rezultat kao i samo objekat.
Objekat ima svoju konkretnu klasu, pitanje je samo kako bez kastovanja izvrsiti odgovarajucu operaciju, a to se jednostavno radi koristeci polimorfizam.
 
Odgovor na temu

[es] :: Java :: Fabrike, fabrike, svuda oko nas

[ Pregleda: 2303 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.