Thursday, March 6, 2008

Staticke klase u web aplikacijama

Staticke klase su klase koje se ne moraju instancirati da bi se pristupilo njihovim metodama i propertijima.

Ovo je sjajna stvar kada se kreira windows aplikacija. Zahteva mesto u memoriji u koje mozete potrpati podatke (objekte) i koristiti ih za neku vrstu kesha, kako bi se baza podataka zvala sto manje puta i time ustedelo na komunikaciji. Naravno, ne treba preterivati jer treba imati na umu da je radna memorija ogranicena i da teba imati obzira prema racunaru, a i prema klijentu koji tu aplikaciju koristi.

Medjutim, ako se govori o web aplikaciji stvari su drugacije - treba ih apsolutno izbegavati. Ovo preporucuje i Microsoft.
Cak i ako se govori o Intranet aplikacijama (aplikacije koje se "vrte" na lokalnoj mrezi) koje nemaju toliko online usera nakacenih u jednom momentu, treba biti obazriv.


U primeru sa ovcama mozemo videti kako se moze koristiti staticki metod u okviru jedne nestaticke klase. Ovde se broj ovaca dobija pozivanjem metode countAll() koja vraca ukupan broj ovaca.
U slucaju weba, ovde mozete da skladistite bilo koju infomaciju koja se ne menja tako cesto i koja nije promenljiva direktno od strane korisnika. Recimo, svaka suma (ukupan broj clanaka, ukupan broj novinara, ukupan broj komentara, top lista najcitanijih clanaka itd) koja se prikazuje na jednoj stranici se moze cuvati u statiskim klasama, jer za ovu vrstu bi se koristilo direktno zvanje baze podataka i pozivanje razlicitih tabela za svaki entitet.

Sta je zapravo problem? Ako postoji objekat koji predstavlja jedan entitet (ovcu) ciji je podaci menjaju od strane korisnika, taj objekat stoji u memoriji - za korisnika koji hoce da izmeni podatke za jednu specificnu ovcu. Dok korisnik gleda podatke, drugi korisnik takodje zeli da izmeni podatke za drugu ovcu. Prvi korisnik je izmenio podatke za svoju ovcu i posalo ih na "cuvanje". Sta se desava - podaci koje je prosledio prvi korisnik za svoju ovcu ce se sacuvati za ovcu drugog korisnika!
Ovo se naravno moze izbeci instanciranjem novog objekta Ovca koji ce biti popunjen podacima koje je uneo prvi korisnik, ali to vec nije koriscenje statickih klasa.

Medjutim, ako se zeli dobiti na performansama (brzini ucitavanja stranice) bolje je koristiti globalne promenljive (u slucaju ASP i ASP.NET-a, suma clanaka na sajtu Application("sum_clanaka")) ako su podaci vezani za aplikaciju, ili u sesijskim promljivama ako se radi o podacima koji su vezani za svakog korisnika ponaosob (suma clanaka za ulogovanog novinara Session("sum_clanaka")).

Preporucuje se cak da se za ASP.NET koristi ViewState za cuvanje podataka, medjutim ja bih ovu opciju iskljucio jer se sama web stranica, i kolicina podataka pri postovanju iste, povecava bez preke potrebe, jer se podaci smestaju u skriveno polje web form.

Prednost sesijskih i globalnih promenljivih je sto ih mozete kastovati (konvertovati) u bilo koji objekat i raditi sa njim sve sto vam taj objekat pruza.