php.hr
Dobrodošli, Gost. Molimo, prijavite se ili se registrirajte.
08.12.2019., 05:29
1878 Postova 1000 Tema 442 Članova
Najnoviji Član: medolino
php.hr  |  PHP & MySQL  |  PHP for newbies  |  Klase - koncepcijsko pitanje « natrag naprijed »
 Str: [1]
Autor Tema: Klase - koncepcijsko pitanje  (Posjeta: 3844 )
Stari.Konj
Novi član
*
Offline Offline

Postova: 7


Profil WWW
« : 19.12.2005., 21:04 »

Koristim php 4.4;Zanima me ova stvar u "logici" izrade klasa:
Posto su varijable u klasi - klasni propertiesi, a funkcije klasne metode, je li ovakav pristup ok:

Kod:
class boje{
var $sveBoje;

function boje($boja){
$this->sveBoje=$this->popuniSveBoje($boja);
}

function popuniSveBoje(boja){
...popuni array $this->sveBoje svim bojama iz baze...
}

function a(){
...manipuliraj podacima iz $this->sveBoje na 'a'nacin...
}

function b(){
...manipuliraj podacima iz $this->sveBoje na 'b'nacin...
}

function c(){
...manipuliraj podacima iz $this->sveBoje na 'c'nacin...
}

...itd...
}


a) zapravo $sveBoje je podatak koji se postavi, a onda se razne funkcije u klasi koriste tom vrijednoscu. ali onda se taj podatak moze dohvatit i s $boja->sveBoje...

b) ili bi bilo bolje iz svake a, b, c funkcije pozvati popuniSveBoje?

hvala.
Evidentirano
BerislavLopac
Novi član
*
Offline Offline

Postova: 19


Profil WWW
« Odgovor #1 : 20.12.2005., 22:37 »

Temeljna stvar je da treba razlikovati dvije vrste metoda: javne, tj. one kojima ce pristupati i pozivati ih drugi objekti, te privatne, koje se koriste samo unutar tvoje klase. PHP4 nema formalnog nacina razlikovanja -- tu su sve metode automatski javne -- ali se ponekad imena privatnih metoda zapocinju s _ kako bi ih se razlikovalo.

Razlika je u tome da kod privatnih metoda mozes raditi sto i kako hoces -- dok metoda radi ono sto tije u klasi potrebno, nepotrebno je kako to radi. U tvom primjeru, sasvim je nebitno hoce li konstruktor boje() koristiti implementaciju kakvu si napisao, ili ce samo pozvati $this->popuniSveBoje() koji se onda obaviti assignment varijable.

Medjutim, javne metode moraju biti vrlo jasne i definirane, te ne smiju imati side-efekata. Sve sto rade na vlastitom objektu mora biti enkapsulirano u njima, tako da nema poziva iz nekog objekta u stilu:

Kod:
$mojeBoje->sveBoje = $mojeBoje->popuniSveBoje()

Umjesto toga, javna metoda mora atribute vlastitog objekta popuniti u sebi, ili pozvati neke druge (privatne) metode koje ce to obaviti.

Takodjer, iako mi je jasno da kod koji si postavio nije stvaran kod neke aplikacije, nalazim nekoliko problema u njemu. Prvo, nije jasno kakva je to klasa "boje", sto ona predstavlja? Ne zaboravi da se u izvrsavanju koda ne koriste klase, vec njihove instance, odnosno objekti, koji su kombinacija odredjenih atributa i metoda, tj. "znanja i ponasanja". Kakav je to objekt "boje"? I tko tocno poziva njegove metode, odnosno tko obavlja manipulaciju bojama po principu a(), b() ili c()?

Pretpostavljam (ispravi me ako grijesim) da tvoje "boje" predstavljaju skup boja nekog drugog objekta. Dakle, ne radi se o objektu, vec o nizu atributa tog drugog objekta, koji iz nekog razloga ne moze sam njima manipulirati (usporedba iz stvarnosti: auto ne moze promijeniti vlastitu boju). Stoga je potrebno napraviti novi objekt -- ili preciznije klasu, koja prema okolnostima moze biti standardna, staticna ili nekakav singleton ili monostate (odnosno kako to Python ekipa lijepo zove, Highlander ili Borg Smile ). Odgovornost tog objekta biti ce manipulacija bojama naseg objekta, pa ju mozemo lijepo nazvati Painter ili u njemu implementirati odgovarajuce metode baratanja bojama.

Jasno, ovo je ovako samo iz glave, bez preciznog poznavanja stvarnih potreba tvoje aplikacije. Ali postojanje problema se vrlo lako moze uociti iz cinjenice da ti je ime klase u mnozini, sto je uvijek znak pogresnog dizajna. Klase predstavljaju objekte; kad stvaras klasu, uvijek joj daj ime kao imenicu u jednini, te se pritom pitaj "predstavlja li ta moja imenica stvaran objekt, koji nesto zna (atributi) i/ili moze (metode)?" Npr. primjeri dobrih klasa su Automobil, Pas, Svjetiljka itd; stvari kao Ljubav, Sloboda, Pijesak bas i nisu.
Evidentirano
Stari.Konj
Novi član
*
Offline Offline

Postova: 7


Profil WWW
« Odgovor #2 : 21.12.2005., 12:51 »

Hvala na detaljnom odgovoru. Ima li gdje kakvih tekstova/knjiga/tutoriala o ovoj tematici?

dobro bi mi doslo jos jedno pojasnjenje/objasnjenje:
Koji je bolji/dozvoljeni nacin:
Kod:
class popis {
var $res;

function printSve($uvjet){
$this->dohvatiPodatke($uvjet);
...prodji $this->res i ispisi sve podatke...
}

function dohvatiPodatke˙(){
$this->res=rezultat queryja...
}
}

iz kôda se poziva
$pop= new popis();
$pop->printSve();


ili je mozda bolje:
Kod:
class popis {

function printSve($uvjet){
$res = $this->dohvatiPodatke($uvjet);
...prodji $res i ispisi sve podatke...
}

function dohvatiPodatke˙(){
return (rezultat queryja...);
}
}


dakle, funkcija dohvatiPodatke stavlja cijeli resource u klasnu varijablu, $res. jel' to dobro?
a u drugom slucaju se pak svakim pozivom funkcije (ili vise njih) ponavlja upit na bazu...
Evidentirano
BerislavLopac
Novi član
*
Offline Offline

Postova: 19


Profil WWW
« Odgovor #3 : 21.12.2005., 20:04 »

Citat: Stari.Konj
Ima li gdje kakvih tekstova/knjiga/tutoriala o ovoj tematici?

Na Googleu.   Very Happy

Citat: Stari.Konj
dobro bi mi doslo jos jedno pojasnjenje/objasnjenje:
Koji je bolji/dozvoljeni nacin:

Nijedan. Opet trpas dvije funkcionalnosti u jednu klasu.

Bolje bi bilo:

Kod:

class Popis
{

    var $popis = array();
    var $popisivac;

    function Popis(&$popisivac)
    {
        $this->popisivac =& $popisivac;
    }

    function setPopis($uvjet)
    {
        $this->popis = $this->popisivac->dohvatiPodatke($uvjet);
    }

    function toArray()
    {
        return $this->popis;
    }

}

class Popisivac
{
    function dohvatiPodatke($uvjet)
    {
        // ... nekakav kod za dohvacanje podataka
    }

}

class Ispisivac
{
    var $onoStoTrebaIspisati;

    function Ispisivac(&$onoStoTrebaIspisati)
    {
        $this->onoStoTrebaIspisati =& $onoStoTrebaIspisati;
    }

    function printSve()
    {
        $array = $this->onoStoTrebaIspisati->toArray();
        // ...prodji $this->popis i ispisi sve podatke...
    }
}

// a u kodu

$popis = new Popis(new Popisivac()); // ovo baca notice u 4.4, ali je ispravno
$uvjet = 'whatever';

$popis->setPopis($uvjet);

$ispisivac = new Ispisivac($popis);
$ispisivac->printSve();

Jasno, to je samo ovako odoka, sve ovisi sto tebi u stvari konkretno treba.
Evidentirano
Stari.Konj
Novi član
*
Offline Offline

Postova: 7


Profil WWW
« Odgovor #4 : 22.12.2005., 07:54 »

Citat: BerislavLopac
Citat: Stari.Konj
Ima li gdje kakvih tekstova/knjiga/tutoriala o ovoj tematici?

Na Googleu.   Very Happy

hehe, jasno...
hvala...
Evidentirano
 Str: [1]
php.hr  |  PHP & MySQL  |  PHP for newbies  |  Klase - koncepcijsko pitanje « natrag naprijed »
    Skoči na: