Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Nu gasesc un topic, un fel de caf...

Jocuri Android Multiplayer online...

Diferenta consum smart meter - Co...

Recomandare demontare+instalare ...
 CAIET SERVICE PREDEAL II

Internare spital psihiatrie

CM de snooker 2024

Scot penele dupa montajul tamplar...
 Masina de spalat vase si grasimea

Noua lege de acces in paduri

Sunt ouale proaspete?

Aplicatie invatare limba Germana
 Presbiopia - la 43 ani ?

Termen transcriere autovehicul

Cazare Timisoara pe 4-5 zile

Primele zile ale internetului per...
 

concepte si design OOP

- - - - -
  • Please log in to reply
198 replies to this topic

#1
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005
astazi stateam si ma gandeam la ceva inainte de a incepe sa scriu un cod.acel ceva se refera la functii si clase

in timp ce imi storceam creierii mi-am pus urmatoarea intrebare.in ce momente in programare trebuie sa te folosesti de functii si clase ? as putea crea o functie chiar si pentru afisarea unui mesaj doar ca sa scriu mai putin.dar oare merita ? acelasi lucru se intampla si cu clasele.cand e necesara crearea unei clase ?

ps: ideea topicului ar merge trecuta si in "sfaturi de programare"

#2
florindinu

florindinu

    Junior Member

  • Grup: Members
  • Posts: 177
  • Înscris: 22.03.2008
//Ahh.. ati mutat topicul exact cand postam :P, prima data cand vad eroarea aia

Cand e bine sa scrii o functie? Pai daca ai cod care se repeta, daca o bucata de cod se repeta de 2-3 ori atunci e bine sa o pui intr-o functie. Cat despre clase.. aici trebuie sa tinem cont de arhitectura codului, de exemplu daca ai un shopping cart atunci codul lui se preteaza sa fie pus intr-o clasa.

Cand vine vorba de programare OO atunci trebuie sa te gandesti in termeni de obiecte, fiecare obiect e responsabil de actiunile sale si de starea sa. Un obiect poate folosi alte obiecte ca sa isi faca treaba. Poti creea o ierarhie si pleci de la obiecte simple iar prin mecanismul de inheritance poti diversifica acele obiecte simple.

So.. ca sa nu ma lungesc, sfatul meu e cam asa: folositi clase sau functii in functie de arhitectura, si daca aveti cod care se repeta puneti-l intr-o clasa/functie dupa caz (nu are rost sa faceti o clasa cu o singura metoda doar de dragul claselor).
Alta chestie e sa nu folositi variabile globale, e un obicei extrem de prost. Eu tin la o chestie: daca apelezi o functie de mai multe ori cu aceeasi parametrii atunci trebuie sa obtii aceleasi efecte. Cu variabile globale acest principiu nu va fi respectat si codul va fi buggy si greu de intretinut.

E interesant topicul, chiar sunt curios unde se va ajunge cu el :).

#3
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View Postvali38, on Feb 12 2009, 22:37, said:

astazi stateam si ma gandeam la ceva inainte de a incepe sa scriu un cod.acel ceva se refera la functii si clase
O spun preventiv, desi probabil stii deja: "functiile unei clase" se numesc metode.

  

View Postvali38, on Feb 12 2009, 22:37, said:

in  timp ce imi storceam creierii mi-am pus urmatoarea intrebare.in ce  momente in programare trebuie sa te folosesti de functii si clase ? as  putea crea o functie chiar si pentru afisarea unui mesaj doar ca sa  scriu mai putin.dar oare merita ? acelasi lucru se intampla si cu  clasele.cand e necesara crearea unei clase ?
"folosirea de functii si clase" se numeste in general modularizare, de aici modificarea in titlul topicului. Pe langa ce a zis Florin, declararea de functii (nu "folosirea" lor) se face similar cu variabilele (descris in noul paragraf III. 11 din "sfaturi").

Clasele trebuie sa fie cat mai "loosely coupled", cat mai independente. Astfel se ajunge la reutilizabilitate, caci asta e scopul modularizarii.
Cum si cand creezi o noua subrutina (obiecte, clase, metode, etc) depinde de problema. In general, incerci sa imparti problema mare in probleme mai mici. In acest proces (care se intampla doar in imaginatia ta deocamdata [1]), incerci sa cuprinzi cat mai multe subprobleme similare si sa creezi o "subrutina" comuna pentru toate de acelasi fel, ajungand astfel la ... reutilizabilitatea codului!

De unde stii cand trebuie introdusa o noua "subrutina"? Este destul de complicat, dar la nivelul nostru (in PHP) de "dirty throw away scripting language" poti sa te multumesti cu ideea ca doar scriind cod iti vei dezvolta acest "al saselea simt" al programarii.

Nu subestima, dar nici supraestima modularizarea. Este complexa, iar oamenii de stiinta inca nu au o definitie concreta pentru "impartirea unui algoritm in subalgoritmi reutilizabili" (pt ca problema este la fel de mult de natura matematica). Vei incepe sa simti cand si cum trebuie modularizat un algoritm dupa multe rescrieri ale aceluiasi cod complex (numit refactoring) si dupa frustrarea aferenta B) .

Multe proiecte, chiar si concepute de programatori experimentati, au suferit la un moment dat de acest "rewriting from scratch" (care este mai rau decat refactoring), deci nu iti face asa de multe probleme.
Aici intra in joc cel mai complicat factor: imaginatia ta. Pe langa faptul ca trebuie sa imparti algoritmul in subalgoritmi care se pot "apela" unii pe altii astfel incat sa scrii cat mai putin cod, va trebui si sa-ti imaginezi cum ai putea sa doresti in viitor [!] (peste luni sau ani de zile) sa extinzi un anumit algoritm sau subalgoritm.



    

View Postvali38, on Feb 12 2009, 22:37, said:

ps: ideea topicului ar merge trecuta si in "sfaturi de programare"
  Nu ar merge, este o problema de nivel avansat. Si regulamentul e clar in privinta asta:

Quote

Întrebãri de nivelul avansat sunt


  • cele de algoritmicã sau de design în general (luarea de decizii, gãsirea compromiselor, modularizare, fezabilitate)
  • OOP patterns

Later edit: de notat marginal este ca modularizarea in programare este acel "secretul meseriei". Nu se prea explica cum sau de ce, se fura. Contribuie la proiecte open-source (si aici Florin ar fi fericit sa iti spuna cel putin o locatie :D ), stai pe langa programatori, si vei prinde "meserie".

---
[1] este general cunoscut ca designul (in termeni algoritmici) este cel mai complicat proces. Scrierea codului efectiv este o joaca daca ai deja structura bine definita. Tot general cunoscut este si ca programatorul nu are la inceput nimic in fata lui, decat o problema. El isi construieste singur un "univers" de variabile, functii si obiecte pe care le poate (re)folosi pentru rezolvarea problemei.

Edited by OriginalCopy, 13 February 2009 - 00:36.


#4
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005
cred ca mi-ar prinde bine niste exemple puse in paralel (un algoritm modularizat si unul `clasic`).nu am vazut coduri php sau in c in care sunt folosite clase.poate asta e motivul pentur care nu stiu.

Quote

Later edit: de notat marginal este ca modularizarea in programare este acel "secretul meseriei". Nu se prea explica cum sau de ce, se fura. Contribuie la proiecte open-source (si aici Florin ar fi fericit sa iti spuna cel putin o locatie  ), stai pe langa programatori, si vei prinde "meserie".

nu se poate face o exceptie ? nu de alta dar nu e nici un programator pe langa mine de la care sa invat :P tot ce am invatat pana acum am invatat singur

cum spunea originalcopy, modularizarea se invata doar scriind si rescriind codurile.sunt de aceeasi parere si pot sa spun ca fara nici un fel de ajutor am descoperit utilitatea functiilor.peste partea cu functiile sa spunem ca am trecut dar vin clasele.nu am idee la ce sa ma uit si de unde sau cum sa incep (nu ma refer la sintaxa)

dar de ce sa spun ca am trecut si ca sunt ass in functii cand eu nu le folosesc decat pentru a-mi usura munca si pentru algoritmii recursivi.si aici intervine aceeasi problema - exercitiul

Quote

de exemplu daca ai un shopping cart atunci codul lui se preteaza sa fie pus intr-o clasa.

de ce asa ?

forindinu vorbea despre arhitectura codului.la ce se refera termenii astia ? la cum este structurat codul ?

Edited by vali38, 13 February 2009 - 19:11.


#5
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View Postvali38, on Feb 13 2009, 20:10, said:

nu se poate face o exceptie ? nu de alta dar nu e nici un programator pe langa mine de la care sa invat :P tot ce am invatat pana acum am invatat singur
Nu te tine nimeni sa nu vii aici cu codul tau si sa ne dam fiecare cu parerea :)

View Postvali38, on Feb 13 2009, 20:10, said:

de ce asa ?
Pentru ca un "shopping cart" poate fi privit ca un obiect care are proprietati (de exemplu "detinatorul" caruciorului de cumparatori - care la randul lui poate fi o instanta a unei clase "Human") sau metode (actiuni pe care le poate face un "carucior")


  

View Postvali38, on Feb 13 2009, 20:10, said:

forindinu vorbea despre arhitectura codului.la ce se refera termenii astia ? la cum este structurat codul ?
Da, la arhitectura, la modularizare, la structurare. Toate sunt aproximativ sinonime.


Cele mai bune explicatii ale principiului OOP (sau ma rog, POO) pe care le-am vazut au fost in Java. Nu te speria, acest tutorial nu face referire la nimic specific java, insa conceptele sunt universal valabile in orice limbaj OO des folosit.

Cat despre C, in C nu exista clase, dar pot fi simulate cat de cat folosind structuri cu pointeri la functii. In schimb, C++ pune la dispozitie clase.

#6
Saurian

Saurian

    Active Member

  • Grup: Banned
  • Posts: 1,280
  • Înscris: 02.09.2008

View PostOriginalCopy, on Feb 13 2009, 19:29, said:

Cat despre C, in C nu exista clase, dar pot fi simulate cat de cat folosind structuri cu pointeri la functii. In schimb, C++ pune la dispozitie clase.

C... C++... cine mai face diferenþa ? :P :D

#7
florindinu

florindinu

    Junior Member

  • Grup: Members
  • Posts: 177
  • Înscris: 22.03.2008

View Postvali38, on Feb 13 2009, 19:10, said:

de ce asa ?
Am scris si am rescris un reply la intrebarea asta si mi-am dat seama ca nu pot sa iti explic aici toate motivele, OriginalCopy ti-a dat un raspuns foarte bun si nu prea am ce sa mai adaug fara sa transform raspunsul in teoria programarii orientata pe obiecte. Pe langa tutorialul recomandat de OriginalCopy iti recomand cartea Design Patterns Explained: A New Perspective on Object-Oriented Design, are multe exemple care desi nu sunt in PHP sunt destul de bune si de usor de inteles.

#8
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005
am incercat sa fac un mic shopping cart asa cum am stiut :)

am citit si de pe link-ul dat de originalcopy si am inteles cum sta treaba cu obiectele.insa in cazul shopping cartului de ce era nevoie sa scriem asa ? el poate fi considerat SI obiect.dar vreau sa stiu de ce

<?php

$ProduseInCarut=array('mouse'=>100,'monitor'=>500,'telefon'=>600,'multifunctional'=>650);


class Carucior {
	
	function NumaraProduse($produse){
		return count($produse);
	}
	
	function CalculeazaPretulTotal($produse){
		$s=0;
		foreach($produse as $aux => $val){
			$s+=$val;
		}
		return $s;
	}
	
	function AfisazaProduseSiPret($produse){
		$cont=null;
		foreach($produse as $aux => $val){
			$cont.=$aux.' - '.$val.' RON<br/>';
		}
		return $cont;
	}
	
}

if(!isset($_GET['p']))$_GET['p']=1;

switch($_GET['p']){
	
	case 1:
		$carut=new Carucior;
		echo 'Carucior<br/>';
		if($carut->NumaraProduse($ProduseInCarut)>0){
			echo '<a href="index.php?p=2">Ai '.$carut->NumaraProduse($ProduseInCarut).' produse in carut.</a>';
		}
		else {
			echo 'Nu ai cumparat inca nimic.';
		}
	break;
	
	case 2:
		$carut=new Carucior;
		echo 'Produse:<br/>'.$carut->AfisazaProduseSiPret($ProduseInCarut).'<br/>Total: '.$carut->NumaraProduse($ProduseInCarut).' produse in valoare de '.$carut->CalculeazaPretulTotal($ProduseInCarut).'';
	break;
	
}

?>


#9
florindinu

florindinu

    Junior Member

  • Grup: Members
  • Posts: 177
  • Înscris: 22.03.2008
Hehe.. tocmai ai scris o clasa plina de functii :P. Nu ai inteles cum trebuie folosite clasele. O clasa trebuie sa fie un obiect "inteligent" si independent. Nu trebuie sa depinda de variabile externe, au propriile variabile (proprietati) au metode care indeplinesc diverse actiuni.. Sper ca intelegi ideea.

Eu as scrie ceva de genul (am incercat sa merg pe exemplul tau cu produse in array):
class Carucior
{
	protected $produse = array();

	public function numaraProduse()
	{
		return count($this->produse);
	}
	
	public function calculeazaPretulTotal()
	{
		$s=0;
		foreach($this->produse as $aux => $val)
		{
			$s+=$val;
		}
		return $s;
	}
	
   public function afisazaProduseSiPret()
   {
		$cont=null;
		foreach($this->produse as $aux => $val)
		{
			$cont.=$aux.' - '.$val.' RON<br/>';
		}
		return $cont;
	}
	
	public function adaugaProdus($nume, $pret)
	{
		$this->produse[$nume] = $pret;
	}

	public function stergeProdus()
	{
	}
  
	public function adaugaProduse($arrayCuProduse)
	{
	}
}

if(!isset($_GET['p']))$_GET['p']=1;

switch($_GET['p']){
	
	case 1:
		$carut=new Carucior;
		echo 'Carucior<br/>';
		if($carut->numaraProduse()>0){
			echo '<a href="index.php?p=2">Ai '.$carut->numaraProduse().' produse in carut.</a>';
		}
		else {
			echo 'Nu ai cumparat inca nimic.';
		}
	break;
	
	case 2:
		$carut=new Carucior;
		echo 'Produse:<br/>'.$carut->afisazaProduseSiPret().'<br/>Total: '.$carut->numaraProduse().' produse in valoare de '.$carut->calculeazaPretulTotal().'';
	break;
}
Nu te opreste nimeni sa nu faci o metoda __sleep() si o metoda __wakeup() si atunci vei putea serializa obiectul, vei putea tine caruciorul in sesiune sau intr-un cache si asa te scutesti de niste query-uri spre baza de date, dar asta e deja la alt nivel :)

Bafta.

#10
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Yeah, "loosely coupled", doua cuvinte simple, ideea din spate nu prea ...

Mai ales cand vrei sa ai obiecte independente si reutilizabile care totusi sa interactioneze.

LE @florindinu interesanta cartea, si scurta :cheers:

#11
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005
acum imi este destul de clar cum sa modularizez codul insa nu stiu cand sa fac asta.daca as avea de creat ceva asemanator cu oscommerce, ar trebui sa creez cate o clasa pentru shopping cart,email system,contact,o clasa pentru produse (ar deveni foarte complexa si foarte greu de creat, insa daca ma gandesc mai bine as putea sa ma folosesc de extend) si tot asa.nu cumva ajung la un `abuz de clase` ?

si inca ceva legat de vizibilitatea claselor.de ce le folosim ?

#12
florindinu

florindinu

    Junior Member

  • Grup: Members
  • Posts: 177
  • Înscris: 22.03.2008
extend = inheritance, si e chiar recomandat sa o folosesti.

Da, poti ajunge sa ai destule clase, eu am ajuns la 50+ cu Pt, si nu e magazin virtual, nu e site, e doar un toolkit.
Citeste cateva carti, creeaza cateva clase, nu te arunca din prima la site-uri intregi facute cu OOP (POO). Cand ai sa stii cum se folosesc clasele abstracte, interfetele.. cand nu mai stai pe ganduri prea mult pana iti dai seama daca o metoda e private sau protected, atunci treci mai departe.

Cand ai sa ajungi sa vezi totul in termeni de obiecte care "mostenesc" (suna urat tradus) proprietati de la alte obiecte, le extind, implementeaza interfete standardizate si interactioneaza in moduri bine determinate cu mediul in care sunt creeate, atunci ai sa vezi cat de mare e diferenta intre OOP si programarea functionala, atunci o sa iti fie mult mai usor sa creezi sisteme complexe, o sa te gandesti la arhitectura in primul rand si apoi la implementarea diverselor "functii".

Edited by florindinu, 14 February 2009 - 14:07.


#13
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005
mai sus spuneam ca modularizarea trebuie sa fie cat mai independenta...in cazul in care am de prelucrat un input intr-o metoda cum il transmit, ca parametru al functiei sau ca in exemplul lui florindinu ?

as vrea sa fac pentru sistemul de inregistrare o metoda prin care sa introduc in bd.este bine ?

m-am gandit ca pentru toate functiile mysql as putea sa creez o clasa.ce spuneti despre asta ?
<?php

class MYSQL_FUNC {
	
	public function sql_connect($host,$user,$password,$database){
		$connect=mysql_connect($host,$user,$password,$database);
		if(FALSE!=$connect){
			if(TRUE==mysql_select_db($database,$connect)){
				return TRUE;
			}
			else {
				return die(mysql_error());
			}
		}
		else {
			return die(mysql_error());
		}
	}
	
	public function sql_query($query){
		if(FALSE!=mysql_query($query)){
			return $query;
		}
		else {
			return die(mysql_error());
		}
	}
	
}

?>

in cazul de mai sus mai este OOP ?

#14
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Enough is enough :cursing:

View Postvali38, on Feb 14 2009, 19:41, said:

mai sus spuneam ca modularizarea trebuie sa fie cat mai independenta...in cazul in care am de prelucrat un input intr-o metoda cum il transmit, ca parametru al functiei sau ca in exemplul lui florindinu ?

as vrea sa fac pentru sistemul de inregistrare o metoda prin care sa introduc in bd.este bine ?

m-am gandit ca pentru toate functiile mysql as putea sa creez o clasa.ce spuneti despre asta ?
<?php
 
 class MYSQL_FUNC {
	 
	 public function sql_connect($host,$user,$password,$database){
		 $connect=mysql_connect($host,$user,$password,$database);
		 if(FALSE!=$connect){
			 if(TRUE==mysql_select_db($database,$connect)){
				 return TRUE;
			 }
			 else {
				 return die(mysql_error());
			 }
		 }
		 else {
			 return die(mysql_error());
		 }
	 }
	 
	 public function sql_query($query){
		 if(FALSE!=mysql_query($query)){
			 return $query;
		 }
		 else {
			 return die(mysql_error());
		 }
	 }
	 
 }
 
 ?>

in cazul de mai sus mai este OOP ?

Ce ai facut tu aici este gruparea de functii pentru mysql intr-un "namespace" comun.
Deasemenea, clasa Carucior nu ar trebui sa contina nimic legat de prezentare. Ma rog, oi face tu de obicei prezentarea unui carucior in format html, insa codul html nu are nimic de-a face cu un carucior in lumea reala. Aici ai putea folosi "the helper pattern" care din cate am vazut este descrisa in cartea lui florindinu.
Nota: legat de clasa mysql_func, vezi ca exista PDO mai nou.

Nu inteleg de ce die() intr-o metoda oricum. Aici lucrezi OOP, deci arunca o exceptie cand ai o eroare. Daca iti omori() scriptul, cum vei mai putea trata eroarea in mod independent de obiect? - pentru ca obiectul nu trebuie sa aibe cunostinte despre "ce se afla in afara lui" - se numeste "encapsulation".

Pentru lucrul cu bazele de date ar trebui sa creezi modele (acel MODELS din MVC). Nu inseamna ca daca folosesti modele atunci si trebuie sa concepi sistemul tau cu MVC, ci pur si simplu sa creezi o interfata comuna pentru fiecare tabel din baza ta de date.

Gandeste-te asa: un carucior este un carucior == un gratar de metal indoit si format astfel incat sa nu-ti cada produsele din el. Caruciorul tau te ajuta sa transporti produse - si poti transporta produsele de oriunde vrei catre orice destinatie (fie ea masina, direct acasa, sau printre rafturile aceluiasi magazin) si pe orice drum (asfaltat, pietruit, prafuit sau cu gropi :lol:).

Ok, gluma de o parte, ideea este: cand programezi OOP gandesti ca in lumea REALA.

Faci un Carucior care salveaza intern elemente intr-un array $produse, care e capabil sa insereze, sa stearga sau sa modifice cantitatile acestor produse. Faci o clasa View_Helper_Html capabil sa preia un array (orice tip de array, printre care si array-ul cu produse din caruciorul tau, sau chiar mai bine, insusi obiectul $carucior si sa afiseze datele din acest obiect in format html).

Pentru asta, caruciorul tau va implementa o interfata, sa zicem IIsRenderable, iar toti View_Helperii tai, inclusiv cel pentru HTML verifica cu reflection daca obiectul pasat metodei lor de genul render($object) implementeaza aceasta metoda interfata (LE: se intampla si la case mai mari :D). Daca da, atunci e garantat ca obiectul are o metoda de genul getArray() (declarata in IIsRenderable), pe care o apeleaza, si primeste array-ul cu produse. Pe baza indexarii acelui array construieste apoi un tabel html.

Ai mai putea crea de exemplu o clasa Casa care face suma produselor din carucior, eventual care testeaza cu ajutorul unui obiect Stock daca sunt reduceri, si le aplica.


Acum ai inteles? Citeste cartea aia, pare super, si e o lectura scurta de maxim o saptamana.

Edited by OriginalCopy, 14 February 2009 - 20:25.


#15
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005

Quote

Faci un Carucior care salveaza intern elemente intr-un array $produse
cum adica intern ?

Quote

Citeste cartea aia, pare super, si e o lectura scurta de maxim o saptamana.
de unde ai luat-o ?

Quote

Acum ai inteles?
da si nu :|

#16
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View Postvali38, on Feb 14 2009, 20:44, said:

cum adica intern ?

de unde ai luat-o ?

da si nu :|

Intern adica ca proprietate a clasei.

Eu unul nu am citit-o, florindinu probabil. Eu doar i-am citit cuprinsul pe amazon sau unde era linkul de mai sus si pare completa si bine gandita.

Poate ti s-a parut ca am reactionat agresiv, dar e bine ca ai deschis discutia. Intreaba ce nu ai inteles, in mod ideal incearca sa implementezi ce si cum ai inteles si sa vii cu probleme practice de care te lovesti pe parcurs...

:cheers:

#17
florindinu

florindinu

    Junior Member

  • Grup: Members
  • Posts: 177
  • Înscris: 22.03.2008

View PostOriginalCopy, on Feb 14 2009, 20:19, said:

Gandeste-te asa: un carucior este un carucior == un gratar de metal indoit si format astfel incat sa nu-ti cada produsele din el. Caruciorul tau te ajuta sa transporti produse - si poti transporta produsele de oriunde vrei catre orice destinatie (fie ea masina, direct acasa, sau printre rafturile aceluiasi magazin) si pe orice drum (asfaltat, pietruit, prafuit sau cu gropi :lol:).

Cred ca e cea mai haioasa explicatie a unui shopping cart pe care am vazut-o (e si corecta) :lol:

@vali38 Deocamdata scrie codul cum stii mai bine, cu functii sau stiu eu.. si invata sa lucrezi cu clasele intre timp, in timpul liber scrie cod OO si citeste, tu scrii cod functional nu orientat pe obiecte (e ok si codul functional scris bine). Poti incepe cu probleme de genul celor care se dau la scoala.

Eu propun urmatoarea chestie:  se da tema de mai jos, daca vrei sa inveti si sa rezolvi tema atunci postezi aici ce scrii si noi te ajutam (nu cu cod ci cu sfaturi), poate asa transformam topicul asta in Object Oriented Design 101. Un sistem ecommerce e mult prea complex ca sa il discutam aici, mai ales la nivel de incepator.

Tema:
Sa se implementeze o aplicatie care tine evidenta masinilor intr-un garaj. Masinile pot fi de diferite culori si marimi, garajul are dimensiuni fixe si in functie de dimensiunea masinilor deja parcate el are un numar limitat de locuri. Implementeaza o pagina care contine o lista cu masini si in care userul poate parca ce masini doreste.

- suprafata garajului: 100m^2
- o masina ocupa o suprafata intre 3 si 5 m^2
- clasa garaj si clasa masina NU vor genera HTML
- alegi tu tipurile de masini
- tii datele in $_SESSION
- html-ul nu trebuie stilizat e suficient un select cu tipurile de masini disponibile si un tabel cu masinile deja parcate

Rezolva chestia asta cu functii, apoi cu clase. Apoi incearca sa imbunatatesti codul pe masura ce inveti chestii noi.
Daca postezi cod, posteaza doar clasele masina si garaj (eventual clasele care le extind), nu ne intereseaza html-ul

O carte mai avansata si mai "matematizata" e aceasta.

//LE: trebuie sa invat sa postez mai rapid :P.
@OriginalCopy, am citit-o acum un an jumate cred, mi-a placut destul de mult si o recomand oricarui programator :)

Edited by florindinu, 14 February 2009 - 20:59.


#18
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005
SPER ca fac progrese :P o sa postez tot codul pentru ca sunt sigur ca o sa gasiti bube chiar si in partile in care a zis florin sa nu le dau.si inca ceva.de ce ai adus vorba de clasa masina ? aici nu e vorba doar de garaj ?
<?php
session_start();

if(!isset($_GET['p']))$_GET['p']='index';

class Garaj {
	
	public $suprafata=100;
	
	public function VerificaSpatiuDisponibil(){
		$s=0;
		foreach($_SESSION as $aux => $val){
			$s+=$val;
		}
		return $s;
	}
	
	public function AdaugaMasina(){
		if(0<=$this->VerificaSpatiuDisponibil()&&$this->VerificaSpatiuDisponibil()<=$this->suprafata){
			$_SESSION[''.$_POST['masina'].'']=$_POST['dimensiune'];
			return TRUE;
		}
		else{
			return FALSE;
		}
	}
	
}

$ga=new Garaj;

switch($_GET['p']){
	
	case 'index':
		echo '<form action="index.php?p=adauga_masina" method="POST" enctype="multipart/form-data">
		Selecteaza masina: 
		<select size="1" name="masina">
		<option value="AAA">AAA</option>
		<option value="BBB">BBB</option>
		<option value="CCC">CCC</option>
		</select>
		Selecteaza dimensiunea: 
		<select size="1" name="dimensiune">
		<option value="3">3</option>
		<option value="4">4</option>
		<option value="5">5</option>
		</select>
		<input type="submit" value="Adauga">
		</form>';
		if(0<$ga->VerificaSpatiuDisponibil()){
			echo '<br><br>Masini parcate:<br><br>';
		
			foreach($_SESSION as $aux => $val){
				echo $aux.' - '.$val.'<br>';
			}
		}
		else {
			echo 'Nici o masina parcata';
		}
		echo '<br>Spatiu disponibil: '.($ga->suprafata-$ga->VerificaSpatiuDisponibil()).' mp';
	break;
	
	case 'adauga_masina':
		if(TRUE==$ga->AdaugaMasina()){
			echo 'Masina adaugata.';
		}
		else {
			echo 'Nu mai este spatiu in garaj.';
		}
	break;
	
}

?>

daca acele clase sunt independente si nu genereaza html,noi le folosim doar la prelucrarea codului si ne ajutam de rezultatul returnat pentru a afisa diferite lucuri ? asa am facut in codul meu
si app.codul are niste buguri care le pot rezolva dar am stat si m-am gandit mai mult la oop

Anunturi

Bun venit pe Forumul Softpedia!

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate