PHP.EE FOORUM   
Nimi:   Pass:   Mäleta mind! 
   Teemad | php.ee esilehele | registreeri | Märgi kõik teemad loetuks | #php.ee Skype vestlus | RSS
UUS TEEMA  OTSI  Lehekülgi: 1
Klass versus funktsioon
Postitaja: joker 2007-06-30 22:13:33
Ehk oskab keegi mõne näitega mulle selgeks teha, mis on funktsiooni ja klassi vahe. Lugesin ka PHP.ee leheküljel olevat artiklit objektorienteeritust, kuid asi jäi mõistmatuks. Mitte ei saa aru!

Kirjutada:
class munad
{
function kanad{...}
}


või kirjutada lihtsalt:

function kanad{...}


Kas siis situatsioonis kus 2 kasutajat tulevad ühele lehele, ning käivitavad ühel ajal programmi erivalt, siis funktsiooniga võib tekkida situatsioon kus ühele kasutajale antakse teise kasutaja parameetrid?! Mis situatsioonis tuleks kasutada klassi, mis situatsioonis aga funktsiooni?



Viimati muudetud: 30-06-2007 22:14:41
Muutja: joker
Põhjus:

RE: Klass versus funktsioon
Postitaja: asdasdfa 2007-06-30 22:21:46
http://www.rubycentral.com/book/tut_classes.html
loe paar lehte läbi. Mis siis, et ruby aga väga hästi seletatud.
RE: Klass versus funktsioon
Postitaja: zeratul 2007-07-01 01:18:05
Mina kasutan funktsioone juhtudel, kui on vaja teha mingi lihtsam operatsioon, mis on alati ühesugune. Hea näide on siinkohal näiteks e-maili aadressi või isikukoodi valideerimine:


PHP kood:
 
function on_isikukood($string)
{
  
mingi regulaaravaldise kontroll muutujale $string;
}


ja kasutus siis selline

PHP kood:
 
if(on_isikukood($string))
{
  
tee_midagi;
}


Aga klasse kasutan juhul, kui tuleb sarnaste objektidega erinevaid tegevusi korda saata näiteks mysql päringute tegemine.

Näiteks mysql

PHP kood:
 
class mysql
{
  function 
__constructor()
  {
     
mysql_connect... jne;
  }

  function 
mysql_selecti_midagi($päring)
  {
    
$result = ...jne;
    return 
$result;
  }

  function 
mysql_kustuta_midagi($päring)
  {
    
siin on kustutamine...;
  }
}

ja kasutamine siis selline:

PHP kood:
 
$tee_midagi 
= new mysql;

ja selectimise puhul jätkame asja nii:

PHP kood:
 
$tulemus 
$tee_midagi->mysql_selecti_midagi($päring);

aga kustutamise puhul jätkame asja nii:

PHP kood:
 
$tee_midagi
->mysql_kustuta_midagi($päring);
RE: Klass versus funktsioon
Postitaja: . 2007-07-01 02:12:51
Mina näiteks vahepealseid variante ei kirjuta - kui on classid, siis globaalseid funktsioone ei kasuta. Ehk siis OOP jääb 100% OOP-ks, mõne väiksema projekti võib ka ilma objektideta kirjutada aga see rohkem minevik.
RE: Klass versus funktsioon
Postitaja: zeratul 2007-07-01 10:27:15
Lihtsamate stringi valideerimiste jms. puhul, kus klass koosneb ühest ainsast funktsioonist, ei ole ju mõtet iga kord pikalt välja kirjutada: Teeb asja ainult kirjumaks ja lõppkokkuvõttes on efekt vastupidine.


PHP kood:
 
$string_b 
mingi_klass::mingi_funktsioon($string_a);

kui saab lihtsamalt kirjutada:

PHP kood:
 
$string_b 
mingi_funktsioon($string_a);
RE: Klass versus funktsioon
Postitaja: joker 2007-07-01 12:00:17
Päris head artiklid OOP süntaksist arusaamiseks:
http://www.phpdeveloper.org/news/5719
http://www.devarticles.com/c/a/PHP/Object-Oriented-Programmi
http://www.tonymarston.net/php-mysql/databaseobjects.html

Samas OOP eksistensipoint versus funktsioon ikka segane. Otsin mõistust edasi...

Viimati muudetud: 01-07-2007 12:08:48
Muutja: joker
Põhjus: Täpsustus

RE: Klass versus funktsioon
Postitaja: . 2007-07-01 14:21:16
TSITEERITUD:
Lihtsamate stringi valideerimiste jms. puhul, kus klass koosneb ühest ainsast funktsioonist, ei ole ju mõtet iga kord pikalt välja kirjutada: Teeb asja ainult kirjumaks ja lõppkokkuvõttes on efekt vastupidine.


PHP kood:
 
$string_b 
mingi_klass::mingi_funktsioon($string_a);

kui saab lihtsamalt kirjutada:

PHP kood:
 
$string_b 
mingi_funktsioon($string_a);


Sellise 100% OOP korral tuleb väheke laiemalt mõelda, üks class ühe meetodiga on tõenäoliselt ülesande vale püstitamine. Mõned võimalused:

1) võib olla class Isikukood, kus on meetodid: Set, Get, Validate, GetDateOfBirth, GetSex :) ... jne

2) võib olla class Validation, kus hoiad kõiki meetodeid valideerimiseks (pikkuse, olemasolu jne kontroll). Isikukoodi valideerimine võib olla ka muidugi hoopis alamklassi meetod.

Võimalusi on ju veelgi, kõik sõltub ju projektist ja OOP mudel tuleks ikka süsteemianalüüsi käigus paika panna.
RE: Klass versus funktsioon
Postitaja: joker 2007-07-01 17:34:48
Ok, vaatleme asja nüüd natuke teise külje pealt.
Mis on objektorienteeritus - objektid on eelnevalt valmis tehtud, ning programmeerija põhiülesanne on nn. mängida erinevate objektidega.

Näide A. (traditsiooniline classi näide)

<?php
class myHappyBox {

var $box_height = 100;
var $box_width = 100;
var $box_color = '#EC0000';

function myHappyBox(){
}

function setHeight($value){
$this->box_height=$value;
}
function setWidth($value){
$this->box_width=$value;
}
function setColor($value){
$this->box_color=$value;
}

function displayBox(){
echo sprintf('
<div style="height:%spx;width:%spx;background-color:%s"> </div>
',$this->box_height,$this->box_width,$this->box_color);
}
}
$box=new myHappyBox();
$box->displayBox();
?>


Näide B. (funktsiooni näide)
<?php
function myHappyBox() {

var $box_height = 100;
var $box_width = 100;
var $box_color = '#EC0000';

echo sprintf('
<div style="height:%spx;width:%spx;background-color:%s"> </div>
',$box_height,$box_width,$box_color);
}
}
myHappyBox();
?>


Kas saame nentida, et mõlema variandi puhul on objektid eelnevalt valmis defineeritud, ning vastavalt vajadusele käivitatakse kas klass või funktsioon. Minupoolne järeldus: mõlema variandi puhul on tegemist objektorienteeritusega. Kui mõttega edasi liikuda, siis klassi puhul saame rääkida funktsioonide kogumist, funktsiooni puhul aga üksikindiviidist. Klass on seega lihtsalt võimalus ringi käia funktsioonidega.

Kui nüüd vaadata otsa kahtele varianti, siis mulle endale tundub küll teine variant mõistlikumana (teine variant on lühem ja arusaadavam).

Viimati muudetud: 01-07-2007 18:00:49
Muutja: joker
Põhjus: Täpsustus

RE: Klass versus funktsioon
Postitaja: hmz 2007-07-01 18:32:49
OK, ma olen kah alles algaja OOP alal, kuid minu nägemus on hetkel selline:

PHP kood:
 
class kuupaev {
  var 
paev=date("d");
  var 
kuu=date("m");
  var 
aasta=date("Y");
  
  function 
väljasta  
     echo 
$this->paev". " .$this->kuu" " $this->aasta;
  }
}

//ja nüüd sama asja tegev funktsioon
function kuupaev(paev,kuu,aasta) {
  echo 
$paev". " .$kuu" " $aasta;
}


Näide väga lihtne ja labane - etteantud parameetrite alusel väljastatakse kuupäev. Funktsiooni korral lased ta käima kujul:

PHP kood:
 
kuupaev
(25122007);

AGA mis juhtub siis, kui sul pole meeles, mis järjekorras funktsioon sisendparameetreid ootab? Tuhnid koodist funktsiooni asukoha üles ja vaatad järgi? Aga siin tulebki välja klassi võimsus - sa saad ise valida, mis järjekorras sa talle sisendparameetrid ette annad, sest klass hoolitseb nende kasutamise eest ise:

PHP kood:
 
$k
=new kuupaev();
$k->aasta=2007;
$k->paev=25;
$k->kuu=12;
$k->väljasta;


Noh klassile annaks muidugi igasugu meetodeid juurde keevitada, kuidas erinevat moodi kuupäeva näidata jne. Funktsiooni korral peaksid kasutama lisaparameetreid ja if-else... Klassi kasuks räägib ka see, et PHP5 korral saad objekti jaoks vajaliku klassi __autoload abil sisse lugeda alles siis kui sul seda kood reaalselt kasutab, mitte ei loe vaikimisi kõiki klasse sisse. Need olid argumendid, mis mind OOP uurima panid.
RE: Klass versus funktsioon
Postitaja: joker 2007-07-01 19:03:56
Jah, hmz'i poolt lisatud kommentaar näitab, et klassiga on lihtsam erinevaid funktsioone juhtida, ning hallata, kuid süntaksi class kasutamine programmis ei tee sellest OOPi.

Funktsioon on programmilõik mida saab käivitada, klass on aga meetod funktsioonide haldamiseks - see oleks siis minu arust vastus minu küsimusele (ise küsin, ise vastan ,o)))))

OOP ise on aga mõttelaad programmide loomisel - ideoloogia on selles, et kõigepelt defineeritakse objektid, ning seejärel tegeletakse erinevate objektide vaheliste seoste loomisega lähtuvalt lähteülesandest.

Siit tuleneb ka vist vastus ühe teise foorumi diskussiooni kohta - mis on vahe amatööri ja professionaali vahe - amatöör kulutab palju aega objektide loomise peale, seejärel saab ta hakata tegelema äriloogikaga ja objektide vaheliste seostega. Proffil on aga objektid olemas (vajadusel kirjutab ainult üksikud juurde), ning põhipanus läheb äriloogika mõistmisele ja objektide vahelistele seoste kirjutamisele lähtuvalt äriloogikast.

Viimati muudetud: 01-07-2007 19:19:29
Muutja: joker
Põhjus:

RE: Klass versus funktsioon
Postitaja: antsuke 2007-07-01 21:53:57
Samas võiks ka veel öelda, et PHP puhul on OOP suht raske harrastada. PHP pole puhas OOP keel.

Mulle meeldib kui iga asi on objekt. "string" on string ja ma võin alati küsida talt näiteks pikkust, classi jms.
RE: Klass versus funktsioon
Postitaja: zeratul 2007-07-01 22:29:54
TSITEERITUD:


Sellise 100% OOP korral tuleb väheke laiemalt mõelda, üks class ühe meetodiga on tõenäoliselt ülesande vale püstitamine. Mõned võimalused:

1) võib olla class Isikukood, kus on meetodid: Set, Get, Validate, GetDateOfBirth, GetSex :) ... jne

2) võib olla class Validation, kus hoiad kõiki meetodeid valideerimiseks (pikkuse, olemasolu jne kontroll). Isikukoodi valideerimine võib olla ka muidugi hoopis alamklassi meetod.

Võimalusi on ju veelgi, kõik sõltub ju projektist ja OOP mudel tuleks ikka süsteemianalüüsi käigus paika panna.


See näide oligi laest võetud. Pealegi funktsiooni klassiks laiendamine ei ole samuti teab mis suur ümberehitus. Seega kõik vastavalt vajadusele, ühtset valemit polegi olemas.
RE: Klass versus funktsioon
Postitaja: propagandapanda 2007-07-02 02:36:11
Hoi!

Funktsiooni ja klassi ei saa päris 1:1 omavahel võrrelda. Kui funktsiooni võib pidada miskitpidi kokku tõstetud algoritmiks (koos oma sisend-väljundiga), siis klassi võiks primitiivsel lähenemisel vaadata kui mõne kindla omaduse järgi kokkugrupeeritud funktsioonide/andmete grupiks.

Eelkõnelejad pole välja toonud ühte olulist filosoofilist erinevust funktsioonprogrammeerimise ja objektorienteeritud programmeerimise vahel, mis mõjutab olulilselt kummaski võttes väljakukkuvat tarkvara.

Funktsioonprogrammeerimises üritatakse koostada algoritm ühes kohas, vajaduse korral taaskasutatavaid algoritmi osi eraldi "alamfunktsioonideks" lõhkudes ja funktsioone moodulitesse või muudesse konteineritesse grupeerides (siia alla käib ka selline stiil, kus klassi meetodeid saab kutsuda selliselt, et klassi-instantsi pole olemas, ehk Javas ja C# static meetodid). Vaatepunkt on funktsioonikeskne - on mingid sisendandmestruktuurid ja väljundandmestruktuurid ja nende töötlus käib ühes kindla algoritmiga jorus.

Objektorienteeritud mõtlemine on veidi teine. Ühte klassi paigutatud meetodid (ehk omamoodi funktsioonid) toimetavad ainult oma klassi andmetega ja kõik mis oma objekti pädevusest välja jääb, delegeeritakse sõnumitega teistele objektidele (see tähendab, et teistest objektidest ei korjata andmeid kokku, et nendega mingeid arvutusi teha). Samuti ei ole eesmärgiks kontrollida kogu algoritmijoru, eesmärgiks on pigem panna muidu iseseisvad ja ainult oma asjadest teadvad objektid omavahel mõnusalt sõnumeid saatma.

Samuti pole siin foorumis tähele pannud, et keegi oleks seletanud, et miks see OOP rakendamine hea on :) Tihti tundub, et seda tehakse lihtsalt asja enda pärast, et asi näeks välja advanced-keerukas või et progejal oleks "väljakutset" :)

OOP pakub võimalusi (kapseldamine, pärimine, polümorfismi, abstrahheermine, mustrid jne) kontrollimaks KEERUKUST, millesse satutakse üsna kiiresti lineaarse funktsioon-programmeerimise stiiliga. Samas alati ei piisa lihtsalt huupi klasside kasutamisest, et loodava tarkvara keerukus kontrolli alla saada. OOP tuleb rakendada selliselt, et see tõesti elu lihtsamaks teeks, väga lihtne on saavutada ka vastupidiseid tulemusi vale rakendamisega, kasvõi vale klasside valiku või valede mustrite kasutamisega vales kohas. OOP-ga on lihtne vähese järelemõtlemisega oma kood ülikeeruliseks teha ja päris tõsine pingutus õigete võtete rakendamise tulemusel kood ja edasine programmeerimine lihtsaks teha. Ja see pingutus on keerulise ülesande lahendamiseks sageli hädavajalik.

siiralt teie,
p.

Leheküljed: 1

©2002-2013 Martin Rebane & PHP.ee kaasautorid
  0.0918140411377