Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Boxa membrana tweeter infundata

ajutor

Whisky for Mac

Xiaomi 14 Gpay
 Izolare zid exterior de scandura

Dezinstalare drivere W11 23H3

Recomandare masina de spalat fiab...

BSOD din cauza Intel Audio DSP dr...
 De ce sunt oamenii nostalgici

Cum vand casa fara factura Hidroe...

Scor FICO minim

Tonometru compensat CAS?
 polita RCA ONLINE

Termostat frigider - verificare

Mai au PC-urile vreun viitor?

Centrala termica immergas
 

concepte si design OOP

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

#19
OriginalCopy

OriginalCopy

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

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

 vali38, on Feb 14 2009, 22:21, said:

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
La prima vedere par decuplate de mediu (de html, de web) si bine facute. O sa ma uit data viitoare mai atent, daca nu se uita altcineva intre timp, dar in principiu da: asa arata bine.
Nici nu te crampona prea mult pe afisare, formatare sau cine stie ce securitate. Acum vorbim strict de design (suntem pe Programming, deci design in sensul conceptual, nu culorile alese :D)

 florindinu, on Feb 14 2009, 20:57, said:

Cred ca e cea mai haioasa explicatie a unui shopping cart pe care am vazut-o (e si corecta) :lol:
Am incercat sa fac explicatia pentru encapsulation si loosely coupled cat mai atractiva si usor de inteles :D

 florindinu, on Feb 14 2009, 20:57, said:

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
Frumoasa tema, destul de complexa pentru a evidentia majoritatea conceptelor de baza.

 florindinu, on Feb 14 2009, 20:57, said:

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 :)
P-asta am citit-o si eu acum ceva timp. Deja sunt client fidel, cand intru in librarie stiu oamenii de acolo si doar ma intreaba "ce sa fie de data asta, wesley sau o'reilly?" :lol:

LE

@vali38: fara sa ma uit in mod special, mi-a picat privirea direct pe faptul ca folosesti $_SESSION sau $_POST direct din obiecte. Inca o data: aici concepi obiecte capabile sa functioneze independent de mediu ("asfalt, praf, gropi"  :roflmaofast: ), ori array-urile astea superglobale sunt specifice HTTP.

Incearca o decuplare totala a obiectelor de orice legat de mediul in care acestea "traiesc". Introdu noi metode (setters, getters) unde e necesar. Nu uita de utilitatea constructorilor unei clase (__construct), carora le poti pasa parametri (nu stiu daca va fi "nevoie" de parametri in clasele tale - dar nici nu conteaza, aici iti poti folosi propria creativitate; defapt chiar esti indemnat sa o faci).

#20
florindinu

florindinu

    Junior Member

  • Grup: Members
  • Posts: 177
  • Înscris: 22.03.2008
Se poate si mai bine.

Daca vine clientul si zice: Ok, nu-mi plac masinile verzi, le vreau galbene (le bag pe TAXI),  vreau sa vopsesti toate masinile verzi din garaj.

Hint: 3 clase, Garaj, Masina, Vopsitorie.

Gata, am plecat la examen :( , wish me luck..

#21
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005
Incearca o decuplare totala a obiectelor de orice legat de mediul in care acestea "traiesc". Introdu noi metode (setters, getters) unde e necesar. Nu uita de utilitatea constructorilor unei clase (__construct), carora le poti pasa parametri (nu stiu daca va fi "nevoie" de parametri in clasele tale - dar nici nu conteaza, aici iti poti folosi propria creativitate; defapt chiar esti indemnat sa o faci).
asta e marea problema peste care nu pot sa trec.ca sa faca ceva obiectul trebuie sa primeasca un impuls din exterior.un carut nu se misca pe asfaltul cu gropi daca nu il impingi, nu? asta se intampla si aici.ca sa bag o masina in garaj am nevoie de informatii despre masina.cum le pasez eu functiilor ? m-am uitat la niste functii pentru setter si in toate se foloseste un parametru pentru fiecare input.daca as sti cum sa indes datele trimise in clasa volumul de probleme la implementare ar scadea dramatic :P
<?php
	class Staff {
	  private $name;
	  public function getName() {return $this->name;}
	  public function setName($name) {$this->name = $name;}
   }
?>
<?php
class Employee {
	public $title;
	public $lastName;
	public $firstName;
	public $price;
	
	function __construct( $title, $firstName, $mainName, $price ) { 
		$this->title	 = $title;
		$this->firstName = $firstName;
		$this->lastName  = $mainName;
		$this->price	 = $price;
	}

	function getFullName() {
		return "{$this->firstName}" . " {$this->lastName}";
	}
}

$product1 = new Employee("B", "B1", "B2", 5.99 );
$product2 = new Employee("A", "A1", "A2", 10.99 );
print "author: ".$product1->getFullName()."\n";
print "artist: ".$product2->getFullName()."\n";
?>
<?php
   class Staff
   {
	  var $name;
	  var $city;
	  protected $wage;

	  function __get($propName)
	  {
		 echo "__get called!<br />";
		 $vars = array("name","city");
		 if (in_array($propName, $vars))
		 {
			return $this->$propName;
		 } else {
			return "No such variable!";
		 }
	  }
   }

   $employee = new Staff();
   $employee->name = "Joe";
   echo $employee->name."<br/>";
   echo $employee->age;
?>

Quote

Nu uita de utilitatea constructorilor unei clase (__construct), carora le poti pasa parametri
imi poti da mai multe detalii ? nu cred ca este ceea ce am dat eu intr-una din functiile de mai sus si parca am intalnit prin manual ceva asemanator dar nu mai stiu le ce

Quote

Daca vine clientul si zice: Ok, nu-mi plac masinile verzi, le vreau galbene (le bag pe TAXI), vreau sa vopsesti toate masinile verzi din garaj.
tare ciudat clientul asta :roflmaofast: nu vrea decat masini verzi ca sa le vopsesti tu :roflmaofast:

Edited by vali38, 15 February 2009 - 11:42.


#22
florindinu

florindinu

    Junior Member

  • Grup: Members
  • Posts: 177
  • Înscris: 22.03.2008
Asa e, un carut nu se misca daca nu il impingi, dar cum tu implementezi caruciorul telepatic, se misca doar daca te gandesti sa se miste, problema e ca se misca si daca se gandesc altii sa se miste si asa te trezesti ca se misca fara sa vrei. Va trebuii sa implementezi un carut normal pe care trebuie sa il impingi, asa ca ii dai un maner, in cazul nostru o metoda (Carut::push()).

Cat despre constructori.. e destul de simplu, clasa din exemplul tau implementeaza unul (__construct). Constructorii sunt apelati automat cand instantiezi o clasa (creezi obiectul).

Hehe.. cat despre clientul taximetrist.. e un client normal, asa sunt toti. Clientii nostri vin mereu cu modificari pe care nu le inteleg si nu vor sa le inteleaga si nu prea poti sa le zici nu, le zici doar cat o sa ii coste. Aici apare problema cu care ne luptam toti, cum sa faci sa ai profit si in cazul asta. Sa zicem ca implementezi o aplicatie pentru un client, la jumatatea proiectului el o sa ceara o functie noua, daca tu trebuie sa rescrii jumatate din aplicatie ca sa implementezi functia.. deja ai pierdut profitul fiindca nu prea poti sa il taxezi prea mult, o sa fie nemultumit, o sa uite de toate functiile pe care deja le-ai implementat si o sa se planga peste tot ca tu nu esti in stare sa implementezi o chestie simpla. Asa ca solutia e sa scrii codul modular si sa nu fii nevoit sa rescrii toata aplicatia pentru o functie noua, doar adaugi un modul si eventual faci cateva modificari mici.

PS: ideea era sa modifici aplicatia si sa implementezi si functia asta care se ocupa de vopsire. Vreau sa iti arat greselile, sa le simti pe propria piele nu sa le povestesc :) .

Edited by florindinu, 15 February 2009 - 12:13.


#23
OriginalCopy

OriginalCopy

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

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

 florindinu, on Feb 15 2009, 12:10, said:

Asa e, un carut nu se misca daca nu il impingi, dar cum tu implementezi caruciorul telepatic, se misca doar daca te gandesti sa se miste, problema e ca se misca si daca se gandesc altii sa se miste si asa te trezesti ca se misca fara sa vrei. Va trebuii sa implementezi un carut normal pe care trebuie sa il impingi, asa ca ii dai un maner, in cazul nostru o metoda (Carut::push()).

Carucior telepatic :lol:

Quote

m-am uitat la niste functii pentru setter si in toate se foloseste un parametru pentru fiecare input.daca as sti cum sa indes datele trimise in clasa volumul de probleme la implementare ar scadea dramatic
Pai ti-ai dat deja exemplu. Asa vei folosi tu setteri pentru a prelua (din perspectiva obiectului) date din $_POST sau pentru a trimite date catre $_SESSION. Lucrurile astea le vei face din exteriorul clasei. Vei manipula obiectul din exterior.

Gandeste-te asa: dupa ce ai facut cumparaturile, nu te urci si tu in carucior ca sa-l duci unde trebuie sa-l duci, ci stai pe langa el si "il mani" ca pe caruta :lol:

PS: altfel spus, te folosesti de ce stie obiectul sa faca, fara sa te intereseze cum o face (encapsulation). Tot ce te mai intereseaza (dupa ce ai implementat clasa) este interfata de comunicare (numele metodelor, parametri acestora, proprietatile publice).

Edited by OriginalCopy, 15 February 2009 - 12:17.


#24
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005
am intampinat o problema si nu stiu de unde provine
public $masini_parcate=array();
	
	public function getValues($car,$space,$color){
		$this->masina=$car;
		$this->spatiu=$space;
		$this->culoare=$color; 
	}
	
	public function SpatiuDisponibil(){
		$s=0;
		for($i=1;$i<=count($this->masini_parcate);$i++){
			if(array_key_exists($i,$this->masini_parcate)){
				$s+=$this->masini_parcate[$i]['dimensiune'];
			}
		}
		if(3>$this->suprafata-$s||$this->suprafata<$this->suprafata-$s){
			return 0;
		}
		else {
			return 1;
		}
	}
	
	public function AdaugaMasina(){
		$aux=count($this->masini_parcate)+1;
		$this->masini_parcate[$aux]['masina']=$this->masina;
		$this->masini_parcate[$aux]['dimensiune']=$this->spatiu;
		$this->masini_parcate[$aux]['culoare']=$this->culoare;
	}
	
	public function CreazaSesiuni($array){
		$aux=count($this->masini_parcate);
		$array[$aux]['masina']=$this->masini_parcate[$aux]['masina'];
		$array[$aux]['culoare']=$this->masini_parcate[$aux]['culoare'];
		$array[$aux]['dimensiune']=$this->masini_parcate[$aux]['dimensiune'];
	}


$ga->getValues($_POST['masina'],$_POST['dimensiune'],$_POST['culoare']);
		if($ga->SpatiuDisponibil()==1){
			$ga->AdaugaMasina();
			$ga->CreazaSesiuni($_SESSION);
			echo 'Masina adaugata';
		}
		else {
			echo 'Nu mai este spatiu in garaj';
		}
nu imi adauga sesiunile sub nici o forma

intampin destule probleme si asta pentru ca lucrez cu sesiuni.unele sunt de la browser,altele de algoritmica.nu e prea confortabil lucrul cu sesiuni :P

Edited by vali38, 15 February 2009 - 14:58.


#25
florindinu

florindinu

    Junior Member

  • Grup: Members
  • Posts: 177
  • Înscris: 22.03.2008
Pai nu merge fiindca CreazaSesiuni($array) primeste o copie a array-ului $_SESSION, daca vrei sa trimiti array-ul va trebuii sa trimiti prin referinta, adica sa declari CreazaSesiuni(&$array)

Dar e cam ciudata metoda, de ce nu pui toata clasa in sesiune? E mai simplu $_SESSION['garaj'] = $ga;

Edited by florindinu, 15 February 2009 - 15:20.


#26
vali38

vali38

    Active Member

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

Quote

Dar e cam ciudata metoda, de ce nu pui toata clasa in sesiune? E mai simplu $_SESSION['garaj'] = $ga;
e pentru prima oara cand vad asa ceva.imi poti explica ce se intampla cu clasa daca o pun in sesiune ?

#27
florindinu

florindinu

    Junior Member

  • Grup: Members
  • Posts: 177
  • Înscris: 22.03.2008
Va fi serializata si salvata in sesiune la sfarsitul scriptului.
Poti face ceva de genul:
if(!isset($_SESSION['garaj'])) $_SESSION['garaj'] = new Garaj();

//accesezi $_SESSION['garaj'] ca pe o instanta normala a clasei cat timp vei avea sesiunea activa.

Poti sa controlezi procesul cu metodele "magice" __sleep() si __wakeup(): http://www.php.net/m....oop5.magic.php

#28
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005
nu voi putea duce la bun sfarsit modularizarea folosindu-ma de sesiuni pentru stocare.chiar daca folosesc tablouri bidimensionale sau tridimensionale fiecare cu avantajele si dezavantajele lui, dupa serializare nu mai am cum se pun datele in acelasi array (masini_parcate).cred ca o sa innebunesc.de 4 ore ma chinui pe acelasi cod incercand sa gasesc o solutie si nici un rezultat

#29
OriginalCopy

OriginalCopy

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

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Ia posteaza tot codul

#30
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005
<?php
session_start();

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


class Garaj {
	
	public $suprafata=100;
	private $masina;
	private $spatiu;
	private $culoare;
	public $masini_parcate=array();
	
	public function getValues($car,$space,$color){
		$this->masina=$car;
		$this->spatiu=$space;
		$this->culoare=$color; 
	}
	
	public function SpatiuDisponibil(){
		$s=0;
		for($i=1;$i<=count($this->masini_parcate);$i++){
			if(array_key_exists($i,$this->masini_parcate)){
				$s+=$this->masini_parcate[$i]['dimensiune'];
			}
		}
		if(3>$this->suprafata-$s||$this->suprafata<$this->suprafata-$s){
			return 0;
		}
		else {
			return 1;
		}
	}
	
	public function AdaugaMasina(){
		$this->getArray();
		$aux=count($this->masini_parcate)+1;
		$this->masini_parcate[$aux]['masina']=$this->masina;
		$this->masini_parcate[$aux]['dimensiune']=$this->spatiu;
		$this->masini_parcate[$aux]['culoare']=$this->culoare;
		echo $aux;
	}
	
}

$ga=new Garaj;

switch($_GET['p']){
	
	case 'index':
		
	break;
	
	case 'adauga_masina':
		$ga->getValues($_POST['masina'],$_POST['dimensiune'],$_POST['culoare']);
		if($ga->SpatiuDisponibil()==1){
			$ga->AdaugaMasina();
			echo 'Masina adaugata';
		}
		else {
			echo 'Nu mai este spatiu in garaj';
		}
	break;
	
}

$_SESSION['ga']=$ga;

//session_destroy();

?>


#31
OriginalCopy

OriginalCopy

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

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
<?php
  session_start();
  
  if(!isset($_GET['p']))$_GET['p']='index';
Nu scrie in $_GET sau $_POST, ci foloseste variabile intermediare
 
  class Garaj {
	  
	  public $suprafata=100;
Suprafata trebuie sa fie privata, nu vrei ca cineva rauvoitor sa seteze o suprafata de genul -17 m² sau 'error'. Poti creat metodele setSuprafata($new) {
if(is_number($new) && $new > 0) {
$this->suprafata = $new;
}
else {
throw new Exception('suprafata imposibila');
}
}

si getSuprafata() { return $this->suprafata;}
	 private $masina;
	  private $spatiu;
	  private $culoare;
	  public $masini_parcate=array();
La fel cu $masini_parcate, imagineaza-ti ceva similar cu $suprafata
 
	  
	  public function getValues($car,$space,$color){
		  $this->masina=$car;
		  $this->spatiu=$space;
		  $this->culoare=$color; 
	  }
Metoda asta lucreaza ca un setter nu ca getter, redenumeste-o setValues()

La modul in care functioneaza, ar trebui sa se numeasca insertCar() si sa insereze valori noi in proprietatea masini_parcate.
Nu inteleg de ce obiectul $this are proprietati precum "masina", sau "culoare". Un garaj nu are (cel putin nu in tema de mai sus) "o (singura) masina" si o culoare. Are un array de masini, dar pe astea deja le salvezi in $masini_parcate.

Deasemenea, ar trebui sa faci o clasa "Vehicul", iar functia insertCar sa aibe semnatura de parametri insertCar(Vehicul $newcar), in care sa $this->masini_parcate[] = $newcar; //pushing the $newcar instance on the stack
 
	  
	  public function SpatiuDisponibil(){
		  $s=0;
		  for($i=1;$i<=count($this->masini_parcate);$i++){
			  if(array_key_exists($i,$this->masini_parcate)){
				  $s+=$this->masini_parcate[$i]['dimensiune'];
			  }
		  }
		  if(3>$this->suprafata-$s||$this->suprafata<$this->suprafata-$s){
			  return 0;
		  }
		  else {
			  return 1;
		  }
	  }
Din cate vad eu problema, pur practic, sa zicem ca ai un garaj. Si vine un prieten la tine si te intreaba daca-si poate parca masina ($checkVehicle). Sa zicem ca e admisibil sa-i spui ca n-ai loc pentru ca nu mai ai decat 3 m². Dar daca vine un alt prieten si iti cere sa-i parchezi motoscuterul, tot de 3m² ii spui? Sigur nu ai face asa, ci te-ai uita la vehiculul ($checkVehicle) pe care vrei sa-l parchezi inauntru (sa zicem $checkVehicle), si ai compara suprafata pe care o ocupa($checkVehicle->getArea()) cu suprafata libera in garaj, deci metoda ta ar trebui sa fie declarata asa: BOOL spatiuDisponibil(Vehicle $checkVehicle)
 
	  
	  public function AdaugaMasina(){
		  $this->getArray();
		  $aux=count($this->masini_parcate)+1;
		  $this->masini_parcate[$aux]['masina']=$this->masina;
		  $this->masini_parcate[$aux]['dimensiune']=$this->spatiu;
		  $this->masini_parcate[$aux]['culoare']=$this->culoare;
		  echo $aux;
	  }
	  
  }
Deja sunt confuz. metoda se numeste adaugaMasina(), dar nu vad ce masina din exterior adaugi. Acum imi dau seama ce faceai tu mai sus. Nu, nu asa. Nu salva lucruri in Garaj despre care nu esti sigur ca le ai parcate in interiorul garajului sau nu.

Nu crea proprietati ale unei clase care defapt nu caracterizeaza instantele acelei clase, ci paseaza "valori temporare" (cum ti-am spus la spatiuDisponibil) prin parametri.
 
  
  $ga=new Garaj;
  
  switch($_GET['p']){
Aici folosesti variabila temporara decizionala introdusa prin primele linii ale scriptului
 
	  case 'index':
		  
	  break;
	  
	  case 'adauga_masina':
		  $ga->getValues($_POST['masina'],$_POST['dimensiune'],$_POST['culoare']);
		  if($ga->SpatiuDisponibil()==1){
if(TRUE == ...), dupa cum am spus, metoda va returna BOOL. In PHP avem tipul asta de date, nu suntem in C :D
 
			  $ga->AdaugaMasina();
$newCar = new Vehicle(<lista-de-proprietati-precum-culoarea,latimea,lungimea>);
if($ga->spatiuDisponibil($newCar)) {
  //$ga->adaugaVehicul($newCar);//sau cum se numea metoda ta
$mesaj = 'vehicul parcat';
}
else {
$mesaj = 'spatiu indisponibil';
 
			  echo 'Masina adaugata';
		  }
		  else {
			  echo 'Nu mai este spatiu in garaj';
		  }
	  break;
	  
  }
  
  $_SESSION['ga']=$ga;
Manualul spune:

Quote

serialize() checks if your class has a function with     the magic name __sleep. If so, that function is     executed prior to any serialization. It can clean up the object     and is supposed to return an array with the names of all variables     of that object that should be serialized.     If the method doesn't return anything then NULL is serialized and     E_NOTICE is issued.    

         The intended use of __sleep is to commit pending     data or perform similar cleanup tasks. Also, the function is     useful if you have very large objects which do not need to be     saved completely.    

         Conversely, unserialize() checks for the     presence of a function with the magic name      __wakeup. If present, this function can     reconstruct any resources that the object may have.    

         The intended use of __wakeup is to     reestablish any database connections that may have been lost     during serialization and perform other reinitialization     tasks.
Deci $_SESSION['garage'] = serialize($ga), iar pe la inceput cand verifici sesiunea, $ga = unserialize($ga).

Va trebui sa implementezi functiile magice cum e descris in manual
 
  
  //session_destroy();
  
  ?>

Clasa Vehicul va avea un constructor cu parametri precum $culoare, $lungime si $latime, toate cu valorile default NULL
public function __construct($color=NULL,$length=NULL,$width=NULL)

Astfel vei putea instantia vehicule chiar si in cazuri cand nu stii din start ce culoare, lungime sau latime va avea, caci dupa cum am spus, aici e ceruta si imaginatia ta. IMAGINEAZA-ti ca nu iti poti imagina orice scenariu posibil si imposibil si concepe-ti clasele astfel incat sa fie utile oricui, in orice situatie, fara sa il limitezi pe acel cineva la conceptul tau - asta inseamna "code reusage"

Vor mai fi metode ca Vehicle::setColor($color),Vehicle::getColor(), Vehicle::resize($newWidth=NULL,$newHeight), etc. IMAGINEAZA-TI!

Think out of the box!

Edited by OriginalCopy, 15 February 2009 - 18:34.


#32
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005
postul lui originalcopy mi-a mai deschis mintea...am vazut in mare cum trebuie lucrat... :)

si o intrebare.cand lucrez cu obiecte, cum imi recomadati sa folosesc exceptiile ? un bloc try la inceputul clasei si il inchid la sfarsit sau doar in metoda sau il las in tot codul.in cazul in care va intampina o problema, ar trebui sa imi opreasca executia scriptului nu numai din blocul try

#33
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005
scuze pentru dublu post dar oarecum am terminat tema :D
<?php
session_start();

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

class Garage {
	
	public $area;
	public $carMinArea;
	public $carMaxArea;
	public $masini_parcate=array();
	
	public function __construct($area,$carMinArea,$carMaxArea){
		$this->setArea($area);
		$this->setMinArea($carMinArea);
		$this->setMaxArea($carMaxArea);
	}
	
	private function setArea($val){
		if(is_numeric($val)&&$val>0){
			$this->area=$val;
		}
	}
	
	private function setMinArea($val){
		if(is_numeric($val)&&$val>0){
			$this->carMinArea=$val;
		}
	}
	
	private function setMaxArea($val){
		if(is_numeric($val)&&$val>0){
			$this->carMaxArea=$val;
		}
	}
	
	public function setMasiniParcate(){
		$this->masini_parcate=$_SESSION['masini'];
	}
	
	public function insertCar(Vehicle $newcar){
		$this->setMasiniParcate();
		$this->masini_parcate[]=$newcar;
		$_SESSION['masini']=$this->masini_parcate;
	}
	
	public function getVehiclesTotalArea(){
		$s=0;
		foreach($_SESSION['masini'] as $aux){
			$s+=$aux->getArea();
		}
		return $s;
	}
	
	public function checkSpace($vehicleArea){
		if($vehicleArea=$this->carMinArea&&$vehicleArea<=$this->carMaxArea&&($this->getVehiclesTotalArea()+$vehicleArea)<=$this->area){
			return TRUE;
		}
		else {
			return FALSE;
		}
	}
	
}

class Vehicle {
	
	public $name;
	public $area;
	public $color;
	
	public function __construct($name=null,$area=null,$color=null){
		$this->setName($name);
		$this->setColor($color);
		$this->setArea($area);
	}
	
	private function setName($nume){
		$this->name=$nume;
	}
	
	public function setColor($culoare){
		$this->color=$culoare;
	}
	
	private function setArea($arie){
		$this->area=$arie;
	}
	
	public function getName(){
		return $this->name;
	}
	
	public function getArea(){
		return $this->area;
	}
	
	public function getColor(){
		return $this->color;
	}

}

class Vopsitorie {
	
	public function vopsesteMasinileVerzi($arrayCuMasini){
		foreach($arrayCuMasini as $aux){
			if($aux->getColor()=='verde'){
				$aux->setColor('galben');
				echo 'Masini vopsite';
			}
		}
	}
	
}

$ga=new Garage(100,3,5);

switch($_GET['p']){
	
	case 'index':
//codul html
	break;
	
	case 'adauga_masina':
		$newvehicle=new Vehicle($_POST['masina'],$_POST['dimensiune'],$_POST['culoare']);
		if(TRUE==$ga->checkSpace($newvehicle->getArea())){
			$ga->insertCar($newvehicle);
			echo 'Masina este in garaj';
		}
		else {
			echo 'Nu mai este sptaiu in garaj';
		}
	break;
	
	case 'vopseste':
		$vo=new Vopsitorie;
		$ga->setMasiniParcate();
		$vo->vopsesteMasinileVerzi($ga->masini_parcate);
	break;
	
}

//session_destroy();

?>
LE: am folosit prin unele metode sesiuni cu toate ca stiam ca nu am voie si nu le-am mai modificat.trebuia sa le trimit ca parametru

originalcopy mi-a dat niste explicatii in post intr-un fel in care nu am mai vazut niciodata.a trebuit sa interpretez in incercarea de a-mi da seama ce sa va intampla daca scriu asa.pana la urma am reusit

ce urmeaza acum ? ah ce-mi place :))

am plecat la operatie.wish me less pain :D

Edited by vali38, 16 February 2009 - 12:04.


#34
OriginalCopy

OriginalCopy

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

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

 vali38, on Feb 16 2009, 11:43, said:

postul lui originalcopy mi-a mai deschis mintea...am vazut in mare cum trebuie lucrat... :)

si o intrebare.cand lucrez cu obiecte, cum imi recomadati sa folosesc exceptiile ? un bloc try la inceputul clasei si il inchid la sfarsit sau doar in metoda sau il las in tot codul.in cazul in care va intampina o problema, ar trebui sa imi opreasca executia scriptului nu numai din blocul try
Nu am incercat niciodata ceva de genul
class Foo {
try {
public function one() {}
public function two() {}
}
catch(Exception $e) {
//$e->...
}
}//end of class definition Foo, dar din cate stiu din parser, nu ar trebui sa fie posibil.

Oricum, in obiectele tale nu tratezi exceptiile. Tot ce poti face este sa "eviti" erori de exemplu convertind parametrii dintr-un tip de date in altul, cel bun de prelucrat, sau cazuri similare. Uite de exemplu bugul Filtering messages which are not strings in zend framework, ca tot am avut curand de-a face cu el.

In clasa ta doar arunci exceptii. De ce? Inca o data: obiectele tale trebuie sa fie independente de mediul in care vor fi instantiate de user (user==programatorul care-ti foloseste clasele, inclusiv vali38 la 40 de ani :D ), insa pentru ea, instanta unei clase ca "Garaj" care este complet izolata de orice nu are legatura cu propriile proprietati, nu este posibil sa reactioneze in functie de mediu.
Arunci exceptia, facandu-ti utilizatorul constient ca a avut loc o eroare, si il lasi sa o trateze el in functie de "mediu". In interiorul clasei nu tratezi decat erorile legate de propriile proprietati. Atat.


 vali38, on Feb 16 2009, 12:56, said:

am folosit prin unele metode sesiuni cu toate ca stiam ca nu am voie si nu le-am mai modificat.trebuia sa le trimit ca parametru
Ca sa scapi de sesiuni va trebui sa-ti initializezi/salvezi clasa Garaj prin deserializare/serializare. Poti face multe lucruri, in diferite combinatii defapt, dar aici nu vreau sa-ti ingradesc imaginatia. Obisnuieste-te sa ti-o folosesti, caci dupa cum am zis:

 OriginalCopy, on Feb 13 2009, 01:36, said:

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!

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.
---
[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.

 vali38, on Feb 16 2009, 12:56, said:

originalcopy mi-a dat niste explicatii in post intr-un fel in care nu am mai vazut niciodata.a trebuit sa interpretez in incercarea de a-mi da seama ce sa va intampla daca scriu asa.pana la urma am reusit
... Deci e ceva normal sa incerci sa "cuprinzi" cat mai multe aspecte ale (sub)algoritmilor implementati. Asta a fost un exercitiu introductiv, cu timpul vei ajuge la 10-20 de clase lejer.

:cheers:

Edited by OriginalCopy, 16 February 2009 - 13:05.


#35
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005
ce ar trebui sa fac in continuare ?

#36
OriginalCopy

OriginalCopy

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

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

Quote

public $area;
    public $carMinArea;
    public $carMaxArea;
    public $masini_parcate=array();

    public $name;
    public $area;
    public $color;

Quote

Suprafata trebuie sa fie privata, nu vrei ca cineva rauvoitor sa seteze o suprafata de genul -17 m² sau 'error'.
Valabil pentru toate proprietatile.

 vali38, on Feb 16 2009, 14:11, said:

ce ar trebui sa fac in continuare ?

Nu stiu, ori acel shopping cart, dar de data asta ca-n viata reala, cu autentificare, modele pentru baza de date, helperi pt html sau json, etc. sau poate are florindinu vr-o idee mai putin complexa care sa te ajute sa exersezi.

LE. Idee: un sistem mai dinamic in care sa interactioneze obiectele tale. Vei mosteni (florindinu ai dreptate, suna nasol :D) "inherita" (ce cool suntem :lol:) clasa abstracta Vehicle in clase precum Car sau Truck, inca o clasa abstracta precum "Human" care sunt mostenite de GarageLender sau Client.

Suna prea tehnic, stiu. Imagineaza-ti un sistem in care oamenii vin la tine ca GarageLender si tu trebuie sa le parchezi masinile, si sa le returnezi dupa cum iti cere clientul.
Trebuie sa inapoiezi masinile mereu detinatorilor ;) si in functie de criterii. Joe poate veni la tine sa-ti ceara "the old green chevy" de exemplu :D

Imagineaza-ti singur si extinde acest scenariu dupa propria placere :P

PS: sa nu uiti de amantul/amanta fiecarei persoane, si de cadourile oferite acestora :D
</insider_joke> :lol:

Anunturi

Neurochirurgie minim invazivă Neurochirurgie minim invazivă

"Primum non nocere" este ideea ce a deschis drumul medicinei spre minim invaziv.

Avansul tehnologic extraordinar din ultimele decenii a permis dezvoltarea tuturor domeniilor medicinei. Microscopul operator, neuronavigația, tehnicile anestezice avansate permit intervenții chirurgicale tot mai precise, tot mai sigure. Neurochirurgia minim invazivă, sau prin "gaura cheii", oferă pacienților posibilitatea de a se opera cu riscuri minime, fie ele neurologice, infecțioase, medicale sau estetice.

www.neurohope.ro

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