DevProTalk

Forumi IT profesionalaca
web development, web design, e-business, SEO


Idite nazad   DevProTalk > Web development i web aplikacije > Programiranje
Želite da se reklamirate ekskluzivno na ovoj poziciji? Javite se

Programiranje Java, Perl, VB, ASP, .NET, C, C++, Pascal, Delphi Sponzor: VIP izazov 3

Odgovori
 
Alati teme Način prikaza
Staro 13. 10. 2011.   #1
Nemanja Avramović
emperor Selassie
Grand Master
 
Avatar Nemanja Avramović
 
Datum učlanjenja: 20.10.2006
Lokacija: Mladenovac
Poruke: 754
Hvala: 361
576 "Hvala" u 88 poruka
Nemanja Avramović će postati "faca" uskoroNemanja Avramović će postati "faca" uskoroNemanja Avramović će postati "faca" uskoroNemanja Avramović će postati "faca" uskoroNemanja Avramović će postati "faca" uskoroNemanja Avramović će postati "faca" uskoro
Pošaljite ICQ poruku za Nemanja Avramović Pošaljite poruku preko MSN za Nemanja Avramović Pošaljite poruku preko Yahoo za Nemanja Avramović
Default Java i refleksija

Pravim neki (kao) DB ORM za SQLite (prvenstveno da bih naučio nešto) pa imam sledeću situaciju:

1) (Apstraktna) Klasa SQLiteORM
2) Korisnik iz nje nasledi svoju klasu: Class MojObj extends SQLiteORM i definiše ime tabele i custom funkcije, relacije etc...
3) Kad korisnik u kodu ima:

Kôd:
MojObj obj = new MojObj();
obj.where('kolona', 'vrednost').get();
Ovo treba da mu vrati niz objekata klase MojObj ako ima više rezultata, ili jedan objekat klase MojObj, ako ima jedan rezultat, naravno. Ovo za niz ili jedan obj može da se radi i sa dve f-je, nebitno je.

Međutim, kod za f-ju get() je u klasi SQLiteORM tako da verujem da meni ustvari treba refleksija jer pravim nove instance objekta izvedene klase.

Može neki primer refleksije, tj. kako iz koda natklase (mada je to ustvari objekat potklase, ali ja pišem taj kod u mojoj natklasi) napraviti objekat potklase i pročitati/upisati neka (public, možda neka budu i static, polja), odnosno pozvati neku funkciju? Da li je ovo uopšte moguće uraditi? U PHP-u je moguće jer on nije toliko striktan sa tipovima kao Java npr.
__________________
Moj portfolio sajtić | wat?
Nemanja Avramović je offline   Odgovorite uz citat
Staro 13. 10. 2011.   #2
Nemanja Avramović
emperor Selassie
Grand Master
 
Avatar Nemanja Avramović
 
Datum učlanjenja: 20.10.2006
Lokacija: Mladenovac
Poruke: 754
Hvala: 361
576 "Hvala" u 88 poruka
Nemanja Avramović će postati "faca" uskoroNemanja Avramović će postati "faca" uskoroNemanja Avramović će postati "faca" uskoroNemanja Avramović će postati "faca" uskoroNemanja Avramović će postati "faca" uskoroNemanja Avramović će postati "faca" uskoro
Pošaljite ICQ poruku za Nemanja Avramović Pošaljite poruku preko MSN za Nemanja Avramović Pošaljite poruku preko Yahoo za Nemanja Avramović
Default

Našao sam dobar dokument na ovu temu ovde: http://java.sun.com/developer/techni...LT/Reflection/

Pogledaću pa ću se valjda snaći
__________________
Moj portfolio sajtić | wat?
Nemanja Avramović je offline   Odgovorite uz citat
Staro 14. 10. 2011.   #3
jablan
VD IT Direktora
Invented the damn thing
 
Avatar jablan
 
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
jablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamen
Default

Pripazi samo kad praviš tu factory metodu na činjenicu da parent klasa ne bi smela da bude svesna postojanja konkretne potklase. BTW, ako već praviš ORM da bi nešto naučio, Java je prilično loš izbor.

Nego, nisam siguran da ti je za to o čemu pričaš neophodna refleksija:

Kôd:
abstract class ModelBase {
  public abstract String getTableName();
  public String get() {
    return "SELECT * FROM " + getTableName() + ";";
  }
}

class Radnik extends ModelBase {
  public String getTableName() {
    return "radnici";
  }
}

class Test
{
  public static void main(String args[])
  {
    ModelBase radnik = new Radnik();
    System.out.println(radnik.get());
    /* SELECT * FROM radnici; */
  }
}
Refleksija će ti trebati kad npr. ne budeš hteo da eksplicitno navodiš ime tabele u modelu, već želiš da od imena klase izvedeš ime tabele.
__________________
blog

Poslednja izmena od jablan : 14. 10. 2011. u 14:18.
jablan je offline   Odgovorite uz citat
Staro 14. 10. 2011.   #4
jablan
VD IT Direktora
Invented the damn thing
 
Avatar jablan
 
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
jablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamen
Default

Ustvari lupam, da bi kreirao instance moraćeš da koristiš refleksiju.
__________________
blog
jablan je offline   Odgovorite uz citat
Staro 14. 10. 2011.   #5
degojs
I'm a PC too.
Wrote a book
 
Avatar degojs
 
Datum učlanjenja: 06.06.2005
Lokacija: Kanada
Poruke: 1.354
Hvala: 82
130 "Hvala" u 89 poruka
degojs će postati "faca" uskorodegojs će postati "faca" uskoro
Default

Citat:
BTW, ako već praviš ORM da bi nešto naučio, Java je prilično loš izbor.
Well whaddya know..

Osim što su među najpoznatijim ORM alatima oni koji rade na Javi, kao npr. Hibernate. Sa Javom kvalitetnih ORM biblioteka sigurno ne nedostaje, većina open source, a u praksi se koriste za zaista mission-critical aplikacije već dugo vremena.

Čini mi se i da je ActiveRecord upravo prvo dobio ime i opisan od strane M. Fowlera u njegovoj knjizi Patterns of Ent. Applications, sa primerima u.. Javi i C#-u.
__________________
Commercial-Free !!!

Poslednja izmena od degojs : 14. 10. 2011. u 19:47.
degojs je offline   Odgovorite uz citat
Staro 14. 10. 2011.   #6
degojs
I'm a PC too.
Wrote a book
 
Avatar degojs
 
Datum učlanjenja: 06.06.2005
Lokacija: Kanada
Poruke: 1.354
Hvala: 82
130 "Hvala" u 89 poruka
degojs će postati "faca" uskorodegojs će postati "faca" uskoro
Default

@Nemanja: imaš negde žešći problem sa tim što želiš da uradiš, u samom dizajnu (ideji, zamisli) čitave stvari, jer parent klasa ne bi tebala da poziva funkcije u child klasi..

Negde si pobrkao malo stvari.

Citat:
Međutim, kod za f-ju get() je u klasi SQLiteORM tako da verujem da meni ustvari treba refleksija jer pravim nove instance objekta izvedene klase.
Novu instancu objekta izvede klase je već napravio onaj koji koristi tu izvedenu klasu, ovde:
Kôd:
MojObj obj = new MojObj();
Ali, ono što tebi verovtno treba jeste da iz izvedene klase vratiš čitav niz objekata tog tipa. Obično bi to značilo da negde u izvedenoj klasi imaš static funkciju koja bi to radila, nešto tipa:

Kôd:
public static List<MojObj> get(parametri bla bla)
{
List<MojObj> ret = new ArrayList<MojObj>();
...
sada ovde nekako, obično pozivajući funkcije parent klase, dovučeš ono što ti treba i objekte lepo dodaš u tu kolekciju).
I onda to vratiš:
...
return ret;

}
Pa bi pozivanje išlo sa:
Kôd:
List<MojObj> lista = MojObj.get(bla bla);
i sada radiš nešto u for-each petlji, npr (proveri sintaksu za for-each petlju u javi, mislim da je ovako):

Kôd:
for( MojObj obj : lista )
{
 obj.Balance = 0;
 obj.Save(); // verovatno nije potreban Save() na svakom objektu, već na čitavom kontekstu nakon završetka petlje, tj. svih izmena...
}
__________________
Commercial-Free !!!

Poslednja izmena od degojs : 14. 10. 2011. u 20:15.
degojs je offline   Odgovorite uz citat
Staro 14. 10. 2011.   #7
jablan
VD IT Direktora
Invented the damn thing
 
Avatar jablan
 
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
jablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamen
Default

^ Fora je upravo da instanciranje ne bude u izvedenoj klasi jer bi ta metoda onda glasila potpuno isto u svim izvedenim klasama, osim tog poziva "new MojObj". Zato mu i treba refleksija, da bi dodavanje novog modela moglo da se svodi na "praznu" klasu koja nasleđuje BaseModel. A refleksija je u Javi i C# znatno zapetljanija nego u dinamičkim jezicima.

A glede flejma, nisam ni rekao da u Java ekosistemu nema kvalitetnog softvera (štaviše), već da ima efikasnijih jezika za učenje kako se prave ORM-ovi.
__________________
blog
jablan je offline   Odgovorite uz citat
"Hvala" jablan za poruku:
Staro 15. 10. 2011.   #8
Nemanja Avramović
emperor Selassie
Grand Master
 
Avatar Nemanja Avramović
 
Datum učlanjenja: 20.10.2006
Lokacija: Mladenovac
Poruke: 754
Hvala: 361
576 "Hvala" u 88 poruka
Nemanja Avramović će postati "faca" uskoroNemanja Avramović će postati "faca" uskoroNemanja Avramović će postati "faca" uskoroNemanja Avramović će postati "faca" uskoroNemanja Avramović će postati "faca" uskoroNemanja Avramović će postati "faca" uskoro
Pošaljite ICQ poruku za Nemanja Avramović Pošaljite poruku preko MSN za Nemanja Avramović Pošaljite poruku preko Yahoo za Nemanja Avramović
Default

Ehej, polako sa flejmom, naši smo

Kao prvo, krenuo sam da radim neke Android aplikacije u Javi pa me smara rad sa bazama, odnosno hteo bih više da se fokusiram na funkcionalnost aplikacije a ne na pisanje SQL-a i pisanje 20 redova koda svaki put kad treba nešto da vučem iz baze. A kako mi je diplomski rad na temu programiranja Android aplikacija verujem da ću raditi još nešto osim tog diplomskog pa reko' da spojim lepo i korisno

Drugo, u PHP-u radim sa CodeIgniterom i nekim ORM-om za njega po imenu Datamapper, i iskreno dosta mi se svidelo kako to radi, pa samo pokušavam da napravim nešto slično za Javu (Android) i SQLite, samo ne toliko korisno (čitaj: kompleksno), bar ne za sad.

Dalje, osnovna klasa ne zna za, i ne poziva metode izvedene klase, jer se u izvedenoj klasi nalaze samo metode koje su potrebne za "rad" konkretnog modela (npr. klasa "Radnik", kad smo već krenuli sa tim, treba da ima metodu "izracunajPlatu" ili tako nešto, lupam sad) i osnovna klasa nema potrebe uopšte da ih poziva. Osnovna klasa nikad ne treba (i ne sme) da poziva metode izvedene klase, to mi je jasno i potpuno logično jer osnovna klasa i ne zna da postoje izvedene klase i koje metode u njima postoje.

Fora je što kad izvedena klasa pozove get() koja je u osnovnoj klasi, ta metoda (get) treba preko this.getClass().getName() da vidi ime izvedene klase, i preko refleksije da napravi i vrati objekat te klase, da bi korisnik u vraćenom objektu, pored podataka iz baze, imao i pristup metodama izvedene klase.
__________________
Moj portfolio sajtić | wat?
Nemanja Avramović je offline   Odgovorite uz citat
Staro 15. 10. 2011.   #9
srdjan
xyz
Grand Master
 
Datum učlanjenja: 25.10.2006
Poruke: 893
Hvala: 87
346 "Hvala" u 163 poruka
srdjan ima spektakularnu aurusrdjan ima spektakularnu aurusrdjan ima spektakularnu aurusrdjan ima spektakularnu auru
Default

Citat:
Originalno napisao Nemanja Avramović Pogledajte poruku
Android aplikacije u Javi... smara rad sa bazama... pisanje SQL-a i pisanje 20 redova koda svaki put kad treba nešto da vučem iz baze.
Možda ti ne rešava stvar, ali kad već spominjes ovo... ja sam rešio većinu problema te vrste sa jednim modulom i tabelom od par polja: key, type, value_as_string.

(a la Registry)
srdjan je offline   Odgovorite uz citat
Staro 15. 10. 2011.   #10
miks
član
Certified
 
Datum učlanjenja: 24.02.2009
Poruke: 55
Hvala: 0
11 "Hvala" u 7 poruka
miks is on a distinguished road
Default

A da probas nesto da uradis sa genericima. npr. get<T>()
miks je offline   Odgovorite uz citat
Odgovori


Alati teme
Način prikaza

Pravila pisanja
Možete ne započinjati nove teme
Možete ne slati odgovore
Možete ne slati priloge
Možete ne izmeniti svoje poruke
vB kôd je Uključen
Smajliji su Uključen
[IMG] kod je Uključen
HTML kôd je Isključen
Pogledajte forum


Vreme je GMT +2. Trenutno vreme je 16:56.


Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.
Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.