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

Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.

[es] :: PHP :: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.

Strane: < .. 1 2 3 4 5 6

[ Pregleda: 28210 | Odgovora: 101 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

masinac_1
Novi Sad

Član broj: 260719
Poruke: 44
*.adsl-3.sezampro.yu.



Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.21.06.2010. u 21:27 - pre 168 meseci
@mitke013
A moze se i po statovanju sesije proveriti i podatak smestiti u objekat kao true/false, ili 1/2/3 uz sta bi mogle i privilegije da se odrede (recimo: registrovan, mod, admin) i to pozivati iz objekta.
Ovo je u sustini slicno tvom samo sto metoda kojom proveravas vrednost za userLogged trazi u objektu a ne direktno preko sesije/kolacia, to je uradjeno kad se startovala sesija sa metodom in one prve klase.

Jako je slicno, ali ima mala razlika. Sta je vise OOP... sta deluje da je vise OOP?

@Goran Rakić
Dobro kazes. I ja sam skrenuo sa teme.. al' reko pomenuto je u posledjih nekoliko postova pa ajd usput :) .. ipak to nije za ovu temu.
 
Odgovor na temu

mitke013
As Divljine
Freelancer

Član broj: 231934
Poruke: 338
178.22.216.*



+34 Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.22.06.2010. u 23:32 - pre 168 meseci
Citat:
masinac_1: @mitke013
A moze se i po statovanju sesije proveriti i podatak smestiti u objekat kao true/false, ili 1/2/3 uz sta bi mogle i privilegije da se odrede (recimo: registrovan, mod, admin) i to pozivati iz objekta.
Ovo je u sustini slicno tvom samo sto metoda kojom proveravas vrednost za userLogged trazi u objektu a ne direktno preko sesije/kolacia, to je uradjeno kad se startovala sesija sa metodom in one prve klase.


Ako sam te razumeo, i ne bas. User::isLogged() je ovo:
Code:

        public static function isLogged()
        {
            return isset($_SESSION['userID']) ;
        }


Nema kreiranja objekta dok bas ne zaskripi . Tj:
Code:

        /**
        * Return instance of logged User
        * @return User
        */
        public static function getLogged()
        {
            if ( !self::isLogged() )
                throw new Exception('User is not logged in') ;
            if (self::$loggedUser==null){
                $loggedUser = Doctrine_Query::create()
                    ->from('User u')
                    ->where( 'u.id=?', $_SESSION['userID'] )
                    ->fetchOne() ;
            
                self::$loggedUser = $loggedUser ;
            }
            return self::$loggedUser ;
        }


self::$loggedUser se koristi kako se ne bi instancirao isti objekat kad god nam treba logovani korisnik. Tj. samo prvi put ce se raditi instanca citanjem iz baze, od tada pa nadalje se koristi isti objekat.
 
Odgovor na temu

mitke013
As Divljine
Freelancer

Član broj: 231934
Poruke: 338
178.22.216.*



+34 Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.24.07.2010. u 10:27 - pre 167 meseci
Citat:
Rekao sam ti već, ubrizgaj taj $_COOKIE['nesto'] spolja kao parametar metode. Nemoj da koristiš globalnu promenljivu unutar klase, to nije enkapsulacija, to je prikrivanje kompleksnosti i mazanje očiju.

Još bolje ako taj $_COOKIE predstavlja posetioca, penesi objekat posetioca ili sesije kao parametar.

Sada tvoja klasa ne izlazi više u globalni prostor da zahvati svoj kontekst. Drugo, pisanje unit testova je lakše jer sada možeš lepo da preneseš vrednost $_COOKIE i proveriš metod za različite situacije. Treće klasu možeš i da iskoristiš u kodu koji se ne izvršava preko veb servera i umesto $_COOKIE koristiš nešto drugo.

Razmisli i da li ti se isplati da refaktorišeš kod tako da ovaj uslov o logovanju izmestiš spolja, tj. da isReatable() proveri da li vlasnik pesme nije preneti korisnik i možda još neke druge uslove, a da grananje vršiš po uslovu ($user->isLogged() && $song->isReatable($user)). Onda iz nekog trećeg koda možeš da ignorišeš ovo o prijavi i skriptom oceniš pesme za korisnika Peru Perića ako nisu njegove, nešto što bez refaktorisanja ti ne možeš da izvedeš. To bi bilo poštovanje dogovora o nadležnostima. Pesmu ne zanima da li je korisnik prijavljen.


Kako dugo nisam trol.... postovao nista, rekoh da posaljem nesto i obradujem siroke narodne mase svojim nepresusnim znanjem

Elem; bas juce, klijent je pozeleo da umesto kukija koji traju neko vreme (podesivo iz admin dela, mislim da je 30 dana), glasanje bude moguce izvesti samo jednom. Znaci baza. Kako se glasanje za pesmu moze obaviti na ~8-9 razlicitih stranica, dogovorili smo cenu od 50 evra jer covek nema pojma da je meni trebalo 15 minuta da izmenim samo tu famoznu metodu isRateable() (obrati paznju; nema parametara i dalje) gde sam uslov iz kukija zamenio citanjem podatka iz baze. Metoda Song::rate($rate) je takodje pretrpela izmene; umesto da salje kuki, glas se upisuje many-2-many u SongVoting tabelu . Da sam slusao vase savete, pored ovih metoda morao bih da menjam i tih 8-9 stranica, samo za glasanje za pesmu. Verovatno mu ne gine jos minimum 50e jer u programu postoji glasanje i za albume i za korisnike.

Sta je jos i poenta? Covek je bio presrecan sto sam to izmenio za tako sitnu lovu, misleci valjda da cu morati sve te stranice da menjam, testiram da li rade itd. A ja sam to uradio pisuci Phpunit test i proverio samo jednu stranicu preko browser-a.

Mislim da ovo jos jednom pokazuje zasto je vazno koristeci moj minimalisticki pristup. Zamislite da umesto 8-9 stranica, imate 20++ koje koriste 'neku' cesto koriscenu metodu (nije vazno koja, bitna je poenta). To sto je metoda citanjem kukija izasla u 'globalni prostor' nema nikakve lose strane; to je globalni prostor pa je globalni, znaci da je namenjen pristupu sa bilo koje strane u bilo kom trenutku.
PS:
to nije isto sto i koriscenje 'global' funkcije.
 
Odgovor na temu

lermi
Freelancer

Član broj: 230692
Poruke: 62
*.crnagora.net.



+5 Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.17.08.2010. u 15:08 - pre 166 meseci
Pratio sam čitavu temu, pa pošto je ne nekoliko mjesta otišla u off (jer je ovo PHP forum), htio nih nešto da pitam. Valjda se može primijeniti na PHP.

1. Buni me kada kažete da je bolja praksa u kojoj metode u klasi ne dobijaju parametre. Kako onda da ih ubacim u klasu? Javnim atributima? Neko se pobunio protiv goriščenja "global" - ovo se ne odnosi na public atribute u klasi?

2. Recimo da imam 100 fajlova koji se obrađuju jednom klasom. Da li je bolje za svaki fajl u petlji kreirati novu instancu klase, ili napraviti jedno instancu pa pozivati Obrada.load(fajl) i Obrada.run()?


 
Odgovor na temu

Goran Rakić
Beograd

Moderator
Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.17.08.2010. u 15:14 - pre 166 meseci
Citat:
lermi: 1. Buni me kada kažete da je bolja praksa u kojoj metode u klasi ne dobijaju parametre. Kako onda da ih ubacim u klasu? Javnim atributima? Neko se pobunio protiv goriščenja "global" - ovo se ne odnosi na public atribute u klasi?


Koliko se sećam, samo jedan učesnik teme to kaže.


Citat:
2. Recimo da imam 100 fajlova koji se obrađuju jednom klasom. Da li je bolje za svaki fajl u petlji kreirati novu instancu klase, ili napraviti jedno instancu pa pozivati Obrada.load(fajl) i Obrada.run()?


Da li Obrada zavisi samo od datoteke koja se obrađuje ili ima i neka spoljna svojstva? Ako ima, ja bih inicijalizovao klasu, to je valjda service obrazac, i onda pozvao nad svakom datotekom u petlji. Ukoliko postoje neke specifičnosti obrade, napravio bih male klase koje predstavljaju svaku vrstu obrade, i onda bi ih servis pozivao (to je valjda delegate/helper obrazac)

http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

mitke013
As Divljine
Freelancer

Član broj: 231934
Poruke: 338
178.22.216.*



+34 Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.17.08.2010. u 15:43 - pre 166 meseci
Citat:
lermi: Pratio sam čitavu temu, pa pošto je ne nekoliko mjesta otišla u off (jer je ovo PHP forum), htio nih nešto da pitam. Valjda se može primijeniti na PHP.

1. Buni me kada kažete da je bolja praksa u kojoj metode u klasi ne dobijaju parametre. Kako onda da ih ubacim u klasu? Javnim atributima? Neko se pobunio protiv goriščenja "global" - ovo se ne odnosi na public atribute u klasi?

Goran je u pravu, to sam jedino ja tvrdio i kroz brdo primera, verujem i dokazao.

Nisi razumeo poentu. Naravno da moras da imas parametar ako zelis da preimenujes neku slika npr. 'slika.jpg'. Tada bi radio $image->rename('ja na moru')->save() a ta instance bi fajl preimenovala u 'ja-na-moru.jpg' . Ako taj fajl vec postoji, onda bi preimenovala u 'ja-na-moru-1.jpg' itd. Ovo je zbog google-a jer sam negde procitao da pretrazivaci vole ovakva imena fajlova.

Cela prica se najvise odnosila kroz primer o glasanju za neku pesmu. Umesto da se koristi metoda $song->isRateable() bez parametara jer instanca moze i sama da zakljuci da li se moze glasati ili ne, bilo je predloga poput:
Song::isRateable($songId, $_COOKIE['$songId'], $_SESSION['userID'], .... ), ili da se to resi javascriptom ?!? i slicno. Mrzi me bas da gledam opet gomilu postova.
Prakticno, saljes nesto sto instanca moze da izvuce; suvisno. Mozda jednog dana hocu da se to resi citanjem podatka iz baze sto se i desilo; pogledaj opet ovaj post kad se ta situacija konkretno i desila. Da sam koristio princip slanja brda parametara, bilo bi mi potrebno mnogo vise od 15 minuta za refactoring. Morao bih da promenim svaki template (sajt je poveci) gde prikaz zavisi od toga da li se za pesmu/album/korisnika moze glasati ili ne.
Ako ukapiras ovaj problem, vrati se opet na moju pricu o jadnom vojniku, letecoj metli i zlom kapetanu.
Citat:

2. Recimo da imam 100 fajlova koji se obrađuju jednom klasom. Da li je bolje za svaki fajl u petlji kreirati novu instancu klase, ili napraviti jedno instancu pa pozivati Obrada.load(fajl) i Obrada.run()?


Nisam bas siguran da sam razumeo problem, ali ajde da probam. Ako imas 100 fajlova, verovatno imas i 100 upisa u bazu sto je i logicno (zbog referenci tipa one-2-many, many-2-many itd). Ako su to recimo 100 slika kojima hoces da promenis velicinu thumbnail-a, ja bih kreirao 100 instanci na sledeci nacin:

Code:

$allImages = ImageTable::getInstance()->createQuery()->execute() ; // ovo ce da kreira niz sastavljen od instanci klase Image za svaku sliku koju imas

foreach ($allImages as $image)
  $image->resizeThumb(100,80)->save() ;


Mislim da ti je najbolje da celu temu pazljivo procitas i sam doneses zakljucak. Ali pazljivo, jer ipak sam ja jedini bio zagovornik teorije 'objekat je tu da nesto uradi a ne da bude drzac funkcija', sto ti izgleda promaklo
 
Odgovor na temu

Goran Rakić
Beograd

Moderator
Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.17.08.2010. u 15:47 - pre 166 meseci
Citat:
mitke013: ipak sam ja jedini bio zagovornik teorije 'objekat je tu da nesto uradi a ne da bude drzac funkcija', sto ti izgleda promaklo :


Ovo nije tačno, a moglo bi da se razume i kao uvredljivo.

Citat:
...createQuery()->execute() ; // ovo ce da kreira niz sastavljen od instanci klase Image za svaku sliku koju imas


Zato što imaš višak memorije, pa da se ne baci?



http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

mitke013
As Divljine
Freelancer

Član broj: 231934
Poruke: 338
178.22.216.*



+34 Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.17.08.2010. u 16:16 - pre 166 meseci
Citat:
Ovo nije tačno, a moglo bi da se razume i kao uvredljivo.


Mislim da nije uvreda nekom reci da mu nesto promaklo u citanju 50KB teksta. Malopre sam pogledao sve postove (na brzaka) i cini mi se da mi jedino dakipro dao podrsku ovde .

Citat:
Zato što imaš višak memorije, pa da se ne baci?


hmm.... Koga briga za memoriju? Taj veliki program koji sam radio je zahtevao migraciju stare baze na novu. Tu je bilo oko 600 slika i 1200 mp3 fajlova. Za svaku sliku se kreira i thumbnail posto stari program to nije radio; ako posetioc ode na listu top25 pesama, a pesma ima sliku od 200KB, stari kod je to ucitavao pa osedis dok se ne ucita cela stranica. Znaci, mora thumb.

Isti kod iz gornjeg primera sam koristio za migraciju tih slika i kreiranje thumb-a. Na serveru je memory limit za proces standardnih 64MB, nikakav problem nije bio. Jedino sto sam jos dodao je $image->free() nakon snimanja, kako bi se oslobodili resursi. Linija koja bi trebala da se doda u gornji kod.

Kako zapravo OOP radi; samo prva instanca neke klase zauzima puno prostora. Npr. instanca klase Image nek zauzme 2MB; realno je posto koristim Doctrine koji nije neki stedisa. Svaka naredna instanca ne uzima vise od 100KB. Ne zaboravi da je to instanca u active-record patternu; znaci OOP prikaz kolone iz tabele. Fajl na koju cilja kolona 'filename' se ne ucitava u memoriju dok ne zatreba.
 
Odgovor na temu

lermi
Freelancer

Član broj: 230692
Poruke: 62
*.crnagora.net.



+5 Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.17.08.2010. u 16:27 - pre 166 meseci
@Goran Rakić
Razmijem. Očito je cilj napraviti vrlo preciznu raspodjelu posla, radi veće efikasnosti.

@mitke013
Pročitao sam temu od početka, posebno Safirov post i raspravu o skrivenim metodama i sjetio sam se kako ja mogu da preradim neke svoje programe. Nažalost, malo sam teže ispratio tvoje zvjezdice, više me je interesovala programerska praksa.

Razumijem ja da objekat mora da dobije parametre, ali moja dilema je šta je najbolja praksa. Ali me buni da li je riječ o a) globalnom namespaceu (koji je dostupan apsolutno svemu) ili b) namespaceu klase.

Ja nikad ne bih odjednom stvorio 100 istih instaci u memoriji, kao što ti predlažeš. Ni na pamet mi nije palo da to uradim, niti jednom (pogotovo ne na serveru). Pitanje je glasilo, u principu, da li klasu treba stvoriti 100 puta dajući joj svaki put nove parametre za inicijalizaciju, ili je treba stvoriti samo jednom, mijenjajući samo atibute?

Uzgred, ti ovdje nisi jedini koji pravi razliku između proceduralnog i OO programiranja, funkcija i parametara, metoda i atributa...


 
Odgovor na temu

Tudfa
Jovicevic Vladimir

Član broj: 152699
Poruke: 384
*.dynamic.sbb.rs.



+3 Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.17.08.2010. u 17:13 - pre 166 meseci
Citat:
mitke013
Code:
$allImages = ImageTable::getInstance()->createQuery()->execute() ; // ovo ce da kreira niz sastavljen od instanci klase Image za svaku sliku koju imas

foreach ($allImages as $image)
  $image->resizeThumb(100,80)->save() ;


Uf.. Nije ovde samo problem memorija, vec i vreme izvrsavanja. Ne znam da li je sistem tako organizovan da je velicina thumb-a uvek ista ?
Ako jeste, zasto bi svaka instanca klase Image nosila informaciju o velicini thumb-a, umesto da to stoji u nekoj config tabeli ?
I samo na jednom mestu radis update ?

Drugo, recimo da hoces da radis update nekog tamo polja i setujes mu novu rednost, istu za svaki red, kao sto si u ovom primeru radio ( i da se to odrazi na 100 redova),
jesi razmisljao da radis jedan update sa WHERE klauzulom ? Da li si svestan koliko je velika razlika u vremenu izvrsenja,
kad radis jedan UPDATE sa WHERE i 100 UPDATE-a tako u for petlji (plus zauzece memorije za kreiranje objekata) ?

Mislim da bih ovo update-ovanje prvo trebalo probati da se izvede jednim upitom, pa ako nije zgodno, raditi drugacije.

Nesto ovako:
Code:
$ids = array(...);//ovde skupis id slika cije to neko polje hoces da promenis

$query = "...";//kreiras upit, iskoristis petlju

$db->query($query);//izvrsis upit koji si dinamicki kreirao

I taj upit jedan upit ce se izvrsiti oko 30-40 puta brze, ako ne verujes probaj sam jer ja sam imao slicnu situaciju,
i nije isto kad ti se update koji ce se odnositi na 300 redova izvrsi za 1.5 sec i za 0.04 sec.

Btw, nemoj da shvatis ovo kao neko odvracanje citalaca od tvog nacina rada, ima i on svojih prednosti...
Ovo se odnosilo samo na brojke.
 
Odgovor na temu

Tudfa
Jovicevic Vladimir

Član broj: 152699
Poruke: 384
*.dynamic.sbb.rs.



+3 Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.17.08.2010. u 17:49 - pre 166 meseci
Citat:
mitke013:To sto je metoda citanjem kukija izasla u 'globalni prostor' nema nikakve lose strane; to je globalni prostor pa je globalni, znaci da je namenjen pristupu sa bilo koje strane u bilo kom trenutku.
PS:
to nije isto sto i koriscenje 'global' funkcije.
Sa ovim bih se slozio, i procitao sam postove protiv ovoga, i i dalje ne vidim neki praktican razlog zasto to ne raditi bas tako.
A izgleda da i programerska ekipa iz Zend-a nema nista protiv toga, jer se taj princip koristi u klasama ZF-a. Jednostavno lakse, manje komplikovanja..
 
Odgovor na temu

mitke013
As Divljine
Freelancer

Član broj: 231934
Poruke: 338
178.22.216.*



+34 Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.17.08.2010. u 18:47 - pre 166 meseci
Citat:
Tudfa: Uf.. Nije ovde samo problem memorija, vec i vreme izvrsavanja. Ne znam da li je sistem tako organizovan da je velicina thumb-a uvek ista ?
Ako jeste, zasto bi svaka instanca klase Image nosila informaciju o velicini thumb-a, umesto da to stoji u nekoj config tabeli ?
I samo na jednom mestu radis update ?

Moram da ispravim sebe; kod koji sam postovao NIJE taj koji sam zapravo i koristio. Sad sam pogledao moju Image klasu i evo kako izgleda taj deo za thumb:
Code:

        /**
        * After saving to DB, check if image is changed (like resized) and update image and thumb if needed
        * 
        * @param Doctrine_Event $event
        */
        public function postSave(Doctrine_Event $event)
        {       
            if ( $this->imageChanged ){
                $image = $this->getWorkingImage() ;
                $image->save( $this->getFilePath() ) ;
                
                $thumb = $image ;
                $thumbName =$this->getThumbPath() ;
                $thumb->adaptiveResize($this->getThumbWidth(), $this->getThumbHeight()) ;
                $thumb->save($thumbName ) ;
                
                $this->imageChanged = false ;
            }
            parent::postSave($event) ;
        }

        /**
        * Set size of created thumbnails
        * 
        * @param integer $width
        * @param integer $height
        */
        public function setThumbSize($width=false, $height=false)
        {
            if ($width)
                $this->thumbWidth = $width ;
            if ($height)
                $this->thumbHeight = $height ;
        }

        /**
        * Get thumb width; returns default from Settings if none is provided from controller
        */
        protected function getThumbWidth()
        {
            return $this->thumbWidth==null ? Settings::getInstance()->getThumbWidth() : $this->thumbWidth ;
        }
        
        /**
        * Get thumb height; returns default from Settings if none is provided from controller
        */
        protected function getThumbHeight()
        {
            return $this->thumbHeight==null ? Settings::getInstance()->getThumbHeight() : $this->thumbHeight ;
        }


Znaci; ako nisi podesio velicinu thumba pozivom $image->setThumbSize(x,y), instanca image ce uzeti vrednosti koje su u settings.ini fajlu a citaju se Settings klasom. Migracije sam obrisao da bih video bas tacan kod za to, ali recimo da je samo ovo:
Code:

foreach ($allOldImages as $oldImage) {
  $image = Image::createFromFilename($oldImage->.... kolona koju je prethodni programer koristio..) ;
  if ( $image->isValid() )  
    $image->save() ;
  $image->free() ;
}


Ovo iznad je API kako se koristi moja klasa. Validacija (izmedju ostalog) proverava da li je fajl zaista jpg, gif ili png, ostale formate ne dozvoljava (nije bitno zasto).
Citat:


Drugo, recimo da hoces da radis update nekog tamo polja i setujes mu novu rednost, istu za svaki red, kao sto si u ovom primeru radio ( i da se to odrazi na 100 redova),
jesi razmisljao da radis jedan update sa WHERE klauzulom ? Da li si svestan koliko je velika razlika u vremenu izvrsenja,
kad radis jedan UPDATE sa WHERE i 100 UPDATE-a tako u for petlji (plus zauzece memorije za kreiranje objekata) ?
...

Btw, nemoj da shvatis ovo kao neko odvracanje citalaca od tvog nacina rada, ima i on svojih prednosti...
Ovo se odnosilo samo na brojke.


Ne zaboravi jedno: slika mora da se ucita, resizuje na odredjenu velicinu, uradi validacija i tek onda snimi. Zato mora da se to uradi jedna po jedna slika. Bulk update tabele ne vazi u ovom konkretnom slucaju.
 
Odgovor na temu

mitke013
As Divljine
Freelancer

Član broj: 231934
Poruke: 338
178.22.216.*



+34 Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.17.08.2010. u 18:59 - pre 166 meseci
Citat:
Tudfa: Sa ovim bih se slozio, i procitao sam postove protiv ovoga, i i dalje ne vidim neki praktican razlog zasto to ne raditi bas tako.
A izgleda da i programerska ekipa iz Zend-a nema nista protiv toga, jer se taj princip koristi u klasama ZF-a. Jednostavno lakse, manje komplikovanja..

Hvala, nisam znao za ovo. Mozda ekipa iz Zend-a prati ovaj forum i krade ideje?
 
Odgovor na temu

Tudfa
Jovicevic Vladimir

Član broj: 152699
Poruke: 384
*.dynamic.sbb.rs.



+3 Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.17.08.2010. u 19:54 - pre 166 meseci
Ja to gledam ovako:

Kao sto je u okviru magicne metode __get() iz Zend_Controller_Request_Http klase,
potrebno da se pristupi nekoj od superglobals da bi uradila potreban posao,
tako si i ti imao potrebu da u svojoj klasi u nekoj metodi pristupis nekoj od superglobals.

Stoji da su te klase razlicite namene,
ali zajednicko za obe klase je da im je u okviru metoda bilo potrebno da pristupe nekoj od superglobalnih promenljivih da bi obavile posao.

A tu sad dolazimo do onoga, zasto u metodi gde je potreban pristup superglobalnoj promenljivoj,
u tvom slucaju klasa Song(ako se ne varam), to ne raditi nego proslediti parametar, sto je to korisno, kad je ovo nekako prirodnije ?

Iskreno nikad nisam o ovome razmisljao mnogo, jednostavno sam koristio superglobals direktno tamo gde mi zatreba.
 
Odgovor na temu

masinac_1
Novi Sad

Član broj: 260719
Poruke: 44
*.dynamic.isp.telekom.rs.



Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.18.08.2010. u 00:31 - pre 166 meseci
Citat:
mitke013: Song::isRateable($songId, $_COOKIE['$songId'], $_SESSION['userID'], .... ), ili da se to resi javascriptom ?!? i slicno. Mrzi me bas da gledam opet gomilu postova.

Mitke legendo... stalno nesto zakomplikujes. :))

Priznajem da se nisam puno upustao u razumevanje svakog napisanog posta, neke cak nisam ni procitao u celosti. Ali sto se tice ovog ..->isRateable() i javascript-a secam se tacno o cemu se radilo... i kontekst u kom si to pomenuo uopste ne ogovara onome o cemu je zapravo bilo reci.
Mozda mislis na neku drugu situaciju gde se pominjalo resenje sa js (samim tim bez metode isReateble)?

Uglavnom, isReatable se nalazi u view delu gde po filozofiji MVC-a ne treba da bude. Moj predlog je bio, ako vec hoces da radis ispravno (sa akcentom na OOP-u), da izbacis logiku iz view dela (prosiris akcenat i na MVC). Da napomenem da i ja pozovem neku metodu (to su ustvari view helperi) iz view-a, ali posto nastojis da radis sto ispravnije, onda sa tog stanovista isReatable nema sta da trazi u view. :)
Zato sam predlozio da view servira kod browser-u normalno kao da je moguce glasanje, a js da na osnovu kolacica po ucitavanju iskljuci mogucnost glasanja, usput sredi zvezdice da prikazuju rejting itd. A u akciji koja odradjuje glasanje normalno dodati proveru da je korisnik autorizovan.
Verovatno bih uradio kao ti (ako zanemarim pravilo mvc-a). Ovo sto sam predlozio definitivno nije za "?!?" jer je jasno i u zavisnosti od situacije moze da bude resenje ako izbacujes logiku iz view. Ponovih opet... valjda si sad razumeo. :)

edit:
E da, ovo sa slikama i zauzecem memorije... pa stvarno, zar nije cilj programera da poveca kapacitete softverskim putem, a ne kupovinom hardvera? Naravno kada i ako je u mogucnosti. Ovde je evidentno da se lako moze uticati na performanse bez nadogradnje hardvera.
 
Odgovor na temu

mitke013
As Divljine
Freelancer

Član broj: 231934
Poruke: 338
178.22.216.*



+34 Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.18.08.2010. u 11:19 - pre 166 meseci
Citat:
masinac_1: Mitke legendo... stalno nesto zakomplikujes. )

Haha... Pa znas kako je; sunce przi, forum jedva ziv, mrzi me da radim, sportska povreda me sprecava za neki basket.... Negde to mora da izadje
Citat:

Priznajem da se nisam puno upustao u razumevanje svakog napisanog posta, neke cak nisam ni procitao u celosti. Ali sto se tice ovog ..->isRateable() i javascript-a secam se tacno o cemu se radilo... i kontekst u kom si to pomenuo uopste ne ogovara onome o cemu je zapravo bilo reci.
Mozda mislis na neku drugu situaciju gde se pominjalo resenje sa js (samim tim bez metode isReateble)?

Uglavnom, isReatable se nalazi u view delu gde po filozofiji MVC-a ne treba da bude. Moj predlog je bio, ako vec hoces da radis ispravno (sa akcentom na OOP-u), da izbacis logiku iz view dela (prosiris akcenat i na MVC). Da napomenem da i ja pozovem neku metodu (to su ustvari view helperi) iz view-a, ali posto nastojis da radis sto ispravnije, onda sa tog stanovista isReatable nema sta da trazi u view.
Zato sam predlozio da view servira kod browser-u normalno kao da je moguce glasanje, a js da na osnovu kolacica po ucitavanju iskljuci mogucnost glasanja, usput sredi zvezdice da prikazuju rejting itd. A u akciji koja odradjuje glasanje normalno dodati proveru da je korisnik autorizovan.
Verovatno bih uradio kao ti (ako zanemarim pravilo mvc-a). Ovo sto sam predlozio definitivno nije za "?!?" jer je jasno i u zavisnosti od situacije moze da bude resenje ako izbacujes logiku iz view. Ponovih opet... valjda si sad razumeo.

Ma razumeo djavola verovatno. Gle; ti si ovim predlogom logiku iz view dela prebacio u logiku javascript-e. Sto je iskreno, losije resenje cak i od Song::isRateable($songId, @$_COOKIE[$songId], @$_SESSION[]... )

Trebao si da procitas ceo post (gore si naglasio da nisi sve procitao). Ja imam petlju tipa

Code:

foreach ($allSongs as $song) {
  if ($song->isRateable()
   // iscrtaj zvezdice
}

... i to je to. Logika se nikad ne moze izbaciti 100% iz view dela; cak se i foreach moze smatrati nekom logikom. Ovaj moj dodatni 'if'; JS ne dolazi u obzir jer je ovo php problem, znaci da je if u view delu zaista neophodan. Ali je ovo tema o slanju parametara metodi ili ne.
Citat:


edit:
E da, ovo sa slikama i zauzecem memorije... pa stvarno, zar nije cilj programera da poveca kapacitete softverskim putem, a ne kupovinom hardvera? Naravno kada i ako je u mogucnosti. Ovde je evidentno da se lako moze uticati na performanse bez nadogradnje hardvera.


Ne

Kakav crni hardware, ja sam cicija koja placa shared hosting od $10 mesecno na hostgatoru. Ogranicenja su: 64MB po procesu, 25% CPU zauzeca ne duza od 2 minuta i 25 DB konekcija po sekundi. Sve ostalo je neograniceno. U gornjim primerima sam objasnio kako brdo instanci iste klase zauzima smesnu memoriju. Drugo; migraciju necega radis samo jednom. Ne mogu da zamislim nijedan sajt koji bi na stranici prikazao 600 slika php-om (tipa <img src="show.php?id=15">), pa da se mozda i prekoraci ovaj limit.
Verujem da i ostale hosting kompanije imaju slicna ogranicenja.
Poenta:
Doctrine+Smarty koje koristim mi zauzmu oko 6MB. Program o kome je rec u peak-u zauzme 10 MB i to samo na prvoj stranici. Na njoj ima:
1 instanca klase Banner
2++ instanci klase Translation; trenutno su dve jer je sajt na spanskom i engleskom
5++ instanci klase News; toliko trenutno ima vesti koje se prikazuju
30 instanci klase Song koje se ucitavaju iz 6 puta po 5 komada, zavisno od broja pregleda, ocene itd.
oko 30 instanci klase Category
8 instanci klase Staticpage
5 instanci klase Image za najaktivnije korisnike

Pritom:
Klase News, Category i Staticpage imaju prevode sto znaci da se radi 'leftJoin' sa prevodom tipa CategoryTranslation itd
Za Songs se radi leftJoin sa Dailyvisits i Statistics tabelama/klasama.
Na sve to dodaj 213 'recenica' za prevod sajta koje se ucitavaju za svaku stranicu.

Sve to se izvrsi za ~400ms i zauzme dodatnih 4MB na mom shared serveru. Da li sad razumes zasto se ne treba zezati sa optimizacijom? Ta prva stranica je bas prepunjena, a opet sam zauzeo tek 1/6 dozvoljene memorije.
I jos:
Sve ovo su bas instance objekata. Doctrine moze rezultate da vrati i kao array i da ustedi memoriju i poveca brzinu. Ali.... 4MB i 400ms za sve ovo? Koga briga za HYDRATE_ARRAY...

Za modove:
ovo za HG nije reklama jer vidite da nigde nema referal link. Mislim da ne krsi TOS.

PS:
Uz sliku je screenshot zauzeca memorije. Kod za ovo je:
echo memory_get_peak_usage() .'<br />' ;
echo memory_get_usage() .'<br />' ;

Nek me neko ispravi ako sam pogresio kako se meri zauzece.

Prikačeni fajlovi
 
Odgovor na temu

masinac_1
Novi Sad

Član broj: 260719
Poruke: 44
*.dynamic.isp.telekom.rs.



Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.18.08.2010. u 19:50 - pre 166 meseci
Procitao sam tvoj post i znam za tu petlju. Kontas da se bas na njoj i zasniva to sto sam napisao :D

Kako bre covece moze da bude losije resenje?! Logika je u metodi do koje se dolazi posle klika na zvezdicu. Js je tu kao prilikom registrovanja da proveri unete podatke, ali ti podaci prolaze proveru i kroz php. Js je nekako usput tu.

Ajd, dobro... misljenja sam da ces tesko naci browser u kom je iskljucen js, tako da je cak i pozeljno u nekim situacijama rasteretiti php tako sto se deo posla prenese u js. U tvom slucaju kazes mora bez js, ok.. ali to si na kraju rekao. Moje resenje nije za takvu situaciju, ali da je blesavo, pa tesko... u protivnom google, youtube i sl. rade totalno pogresno. :)
 
Odgovor na temu

Goran Rakić
Beograd

Moderator
Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.18.08.2010. u 19:56 - pre 166 meseci
Citat:
mitke013
Da li sad razumes zasto se ne treba zezati sa optimizacijom? Ta prva stranica je bas prepunjena, a opet sam zauzeo tek 1/6 dozvoljene memorije.


To znači da ne možeš da imaš više od šest simultanih poseta. Vreme odziva stranice ti je preko 1s (400ms + output + dok prođe kroz mrežu), što je jako sporo. Generalno, veoma si aljkav.

Podržavam stav da su prerane optimizacije nepotrebne, ali imati sistem koji se ovako rasipa nije za ponos.

Koliko upita izvršavaš za tu jednostavnu stranicu?

http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

mitke013
As Divljine
Freelancer

Član broj: 231934
Poruke: 338
178.22.216.*



+34 Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.19.08.2010. u 00:33 - pre 166 meseci
Citat:
Goran Rakić: To znači da ne možeš da imaš više od šest simultanih poseta. Vreme odziva stranice ti je preko 1s (400ms + output + dok prođe kroz mrežu), što je jako sporo. Generalno, veoma si aljkav.

Podržavam stav da su prerane optimizacije nepotrebne, ali imati sistem koji se ovako rasipa nije za ponos.

Koliko upita izvršavaš za tu jednostavnu stranicu?


Ja aljkav? Prilicno jaka rec za nekog ko predlaze Song::isRateable($songID, @$_COOKIE[nesto], @$_SESSION[nesto]).... Ove @ simbole moras da stavis kako bi sprecio ispis gresaka ako element ne postoji. I ja aljkav?

Vrati se na moje postove gde lepo pise sledece:
64 MB po procesu!

To znaci po PHP procesu, ne po sekundi. Po sekundi mi jedini limit 25 konekcija, sto takodje lepo pise gore.

Gorane; zasto je toliki problem procitati moju poruku? I ja sam kao OOP pocetnik prvo pitao 'zar gomila instanci ne zauzima previse memorije', pa kad sam dobio odgovor, vise nisam postavljao takva pitanja. Ako sam gore SVE lepo objasnio, cemu onda prozivka da sam aljkav? Navodno si 'oop guru', a sa druge strane postavljas ovakva pitanja, iznova i iznova.

Ali dobro; jednom si izjavio da je OOP 50 puta sporiji od proceduralnog, verovatno sam sam kriv sto nisam odmah ukapirao sa kakvim 'strucnjakom' pricam.
ISPRAVKA: Moja greska, ovo nije Goran izjavio vec drugi clan.

A u primerima mog koda se aljkavost zaista nigde ne moze videti. Tvoj primeri; samo jedan koji je koristio 'global'. Sve ostalo je copy&paste definicija prepisana iz nekog udzbenika. Ti bas nikad nista nisi konkretno rekao.

Drugo:
400ms za sve sto sam naveo je nikakvo vreme. Opet pricas 'gluposti' (kako ti volis da opisujes): dok prođe kroz mrežu!? Da ne treba mozda i da posetiocima sajta platim brz net mozda? Treptaj oka ti 400ms; jel ti pricas samo da bi nesto rekao? Koliko vreme tvoji programi (koje sumnjam da uopste imas) trose CPU vremena? Da li uopste razlikujes vreme izvrsavanja logike od vremena ucitavanja sajta? Sta ako stranica treba da prikaze sliku od 3 MB; da nije mozda moj PHP kriv i za sporo ucitavanje kod korisnika na modemu?

Nakon sto je Tupfa rekao da Zend koristi isti nacin rada kao i ja, vise ne komentarises ovo o 'superglobals' i kako je glupost to sto metoda ume i sama da uzme to sto joj treba. Verovatno nije 'glupost' kad neko zvucno ime tipa Zend radi tako, ali ako to ja predlozim, i time poljuljam tvoj imidz samoproklamovanog gurua, prica je skroz drugacija.

Verovatno ces kao mod da obrises ovu poruku, ali ovo nije prvi put da me direktno prozivas tako da cu je sigurno obnavljati. Da me proziva neko ko je pokazao da zna da programira; nema problema, poklonimo se kralju i slicne stvari. Ali ovakve gluposti, pogotovo na es-u, tesko mogu da ignorisem.

Citat:
Ajd, dobro... misljenja sam da ces tesko naci browser u kom je iskljucen js, tako da je cak i pozeljno u nekim situacijama rasteretiti php tako sto se deo posla prenese u js. U tvom slucaju kazes mora bez js, ok.. ali to si na kraju rekao. Moje resenje nije za takvu situaciju, ali da je blesavo, pa tesko... u protivnom google, youtube i sl. rade totalno pogresno.

Problem nastaje kad sajt posecuju botovi; oni se ponasaju kao browser bez JS.

[Ovu poruku je menjao mitke013 dana 19.08.2010. u 13:05 GMT+1]

[Ovu poruku je menjao mitke013 dana 19.08.2010. u 13:06 GMT+1]
 
Odgovor na temu

Goran Rakić
Beograd

Moderator
Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.19.08.2010. u 02:00 - pre 166 meseci
Nemam nameru da brišem tvoju poruku, ne znam zašto stalno pokrećeš to pitanje. Ni jednom ti nisam obrisao poruku u kojoj iznosiš kritiku na moj račun, uopšte nemam problem sa takvim porukama.

Inače, memory_limit koji sada vidim da hostgator koristi ne određuje limit po procesu kako si napisao već je to interni limit unutar PHP-a pri alokaciji i važi za jedno izvršavanje skripta. Osim pri obradi spoljnih datoteka to je sasvim dovoljno za bilo šta rasipnički što zamisliš. Ograničenje po Apache procesu je nešto sasvim drugo, pošto je to onda limit na memoriju koje dele sve niti unutar učitanog php modula.

Ja uopšte ne komentarišem koliko objekti zauzimaju prostora, sam si rekao da tvoja skripta traži 4MB u vrhu.

Ne znam gde sam izjavio da je OOP 50 puta sporiji od proceduralnog?

Ostale komentare nisi razumeo i pogrešno ih tumačiš (global, cookie, unit test, poziv metode, vreme izvršavanja), pa nema svrhe da se raspravljamo.




[Ovu poruku je menjao Goran Rakić dana 19.08.2010. u 03:21 GMT+1]
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

[es] :: PHP :: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.

Strane: < .. 1 2 3 4 5 6

[ Pregleda: 28210 | Odgovora: 101 ] > FB > Twit

Postavi temu Odgovori

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