Conectare

Mi-am uitat parola

Panou De Control
Profilul tau
Informatii
Preferinte
Semnatura
Avatar
Social
Lista de prieteni si lista userilor ignorati
Membrii forumului
Grupuri de utilizatori
Mesaje private
Mesaje primite
Mesaje trimise
Subiecte monitorizate
Subiecte monitorizate
Parteneri
Steel Arena
Sondaj

Cum vi se pare siteul nostru?

81% 81% [ 13 ]
13% 13% [ 2 ]
0% 0% [ 0 ]
0% 0% [ 0 ]
6% 6% [ 1 ]

Total voturi : 16

Cuvinte-cheie


Intre procedural si obiect

In jos

Intre procedural si obiect

Mesaj Scris de +gZ.Flyking la data de Mier Iun 10, 2009 11:55 am

Ce folositi voi?

Inainte de toate, as vrea sa lansez un apel la discutie: catre ce va indreptati? Stilul procedural poate avea avantajele lui: este mai usor de implementat, este relativ refolosibil si flexibil. Pe de alta parte, obiectele pot face ceva robust cu mai putin cod, insa acel cod nu este mereu la fel de intuitiv. Cititi articolul - si va astept pentru comentarii si opinii pe aceasta pagina.

Este logic ca atunci cand vrem sa ajungem la un rezultat, sa gandim in pasi. Aceasta abordare a dus la dezvoltarea stilului imperativ si apoi procedural, in care secvente de pasi duc la rezultatul dorit.

Cu toate acestea, de cand lumea si pamantul, oamenii au numit lucrurile din jurul lor "obiecte" si le-au atribuit functii. Pe acestea le-au deosebit de animale si de fiintele asemanatoare lor, fiintele cugetatoare. Pe masura ce omul a evoluat, a putut grupa obiecte cu functii asemanatoare sau complementare in sisteme, pentru a executa operatii complexe.

Obiectele

Programarea nu putea scapa de acest model care pare a fi cel mai apropiat de gandirea omului modern. In anii 60 a aparut astfel primul limbaj de programare orientat pe obiecte. Simula 67, proiectat de Centrul Norvegian de Computere (Ole-Johan Dahl si Kristen Nygaard), implementeaza prima data conceptul de clasa-obiect care inglobeaza o serie de variabile si metode. Interesant este faptul ca Simula este un limbaj creat pentru a construi simulari ale lumii reale.

C-ul s-a dezvoltat apoi ca un limbaj puternic orientat pe obiecte. In scripting insa a trebuit sa se astepte pana la aparitia Java, care este in mare parte dezvoltat din C. Pentru a ne apropia si mai mult de subiect, trebuie sa spunem ca Perl nu a implementat obiectele decat in versiunea a 5-a, asa ca PHP-ul nu a avut parte inca de la inceput de suport OOP. Insa lucrurile s-au schimbat o data cu PHP5, care se apropie cel mai mult de o implementare completa a tehnicilor orientate spre obiect.

Limbaje precum Python sau Ruby au fost construite special pentru a inlocui neajunsul PHP-ului sau Perl-ului in legatura cu obiectele. Abia in versiunea 5, PHP reuseste sa ofere un mediu in care pot fi implementate patternuri de programare si in care obiectele pot fi construite si manipulate asa cum ar trebui.

Procedural si imperativ

N-am vorbit insa despre cealalta parte a campului de lupta - caci este intr-adevar o mare batalie intre cei care folosesc obiectele si cei care le reneaga. Programarea procedurala exista de cand cu primul computer. Unii dintre noi o vom recunoaste daca ne gandim la zilele cele de mult trecute in care scriam 10 PRINT sau citeam in cartea de informatica despre Pascal. Cei mai norocosi au invatat direct C, insa tot intr-o abordare procedurala.

Pe forumurile noastre se discuta de procedural versus oop, definind, mai mult sau mai putin, stilul procedural ca tot ce nu foloseste obiecte. Abordarea nu este gresita, si o voi prelua ca atare. Exista insa si alte stiluri de programare care nu folosesc obiecte si nu sunt procedurale.

Ma voi limita la cel mai simplu: programarea imperativa. Este prima forma pe care o invatam la scoala si presupune definirea secventelor de cod necesare pentru a ajunge la un anumit rezultat, bazat pe datele de intrare. In programarea web, exemple sunt destule. Sa ne imaginam un site cu trei pagini in PHP. In fiecare pagina trebuie sa afisam datele dintr-un tabel diferit din baza de date. Imperativ, o pagina ar arata asa:


<?php
$connection = mysql_connect("server", "user", "password") or die(mysql_error());
mysql_select_db("mydb",$connection) or die(mysql_error());
$data = mysql_fetch_assoc(mysql_query("SELECT * FROM tabel"));
array_pop($data);

echo "<h1>Tabel 1</h1>";

foreach($data as $key=>$value){
echo $key."=".$value;
}

?>


Practic, scriptul face pasii normali pentru a se conecta la baza de date si pentru a returna si afisa datele din tabelul "tabel". Sa vedem cum ar fi scris acest cod in alte stiluri.

Programarea procedurala si functiile ei

Pana la a prezenta programarea pe obiecte trebuie sa arat care este varianta de mijloc. Stilul procedural presupune doi pasi:
definirea unor proceduri de lucru care sa execute anumite taskuri
imbinarea procedurilor pentru a ajunge la rezultatul dorit

Sa ne intoarcem la exemplul nostru si sa vedem ce proceduri am putea implementa. Prima ar fi conectarea la baza de date. Dupa ce s-a conectat, scriptul nostru va extrage date din tabel. Pentru aceasta operatie vom mai scrie inca o procedura. Am putea sa avem o a treia pentru afisarea datelor.


http://db.php
function connect(){
$connection = mysql_connect("server", "user", "password") or die(mysql_error());
mysql_select_db("mydb",$connection) or die(mysql_error());
}
function query($q){
$data = mysql_fetch_assoc(mysql_query($q));
array_pop($data);
return $data;
}


Pentru a reconstrui pagina in acest nou stil, nu va trebui decat sa chemam functiile:


include("db.php");
connect();
$data = query("SELECT * FROM tabel");
foreach($data as $key=>$value){
echo $key."=".$value;
}


Avantajele sunt multiple:
putem refolosi functiile in celelalte doua pagini; datele de conectare la baza de date vor fi stocate astfel doar intr-un singur fisier - mai usor de protejat
putem schimba functiile si schimbarile vor fi valabile pentru toate fisierele. Am putea de exemplu sa formatam arrayul intors de query() in alte feluri, dupa un parametru. Am putea sa adaugam o functie care ne va loga queryurile executate impreuna cu erorile lor si timpul de executie. Am chema astfel aceasta functie in cadrul functiei query() - schimbare intr-un singur loc
putem include decat functiile de care avem nevoie, stocandu-le in fisiere separate


Procedural in HTML

O tehnica asemanatoare stilului procedural folosit in PHP poate fi folosita pentru compozitia layoutului unui site dinamic. Pentru aceasta vom avea nevoie de un wrapper, de obicei index.php, care sa includa paginile de care avem nevoie, ghidandu-se dupa parametri primiti in GET. Fisierul va include intai fisierele cu functiile necesare (cele de baze de date, de exemplu), apoi va trece la includerea headerului, footerului si altor elemente comune mai multor pagini. Undeva in sirul de include se va gasi si pagina ceruta de user, denumita in conformitate cu variabilele din GET.

Un alt aspect pe care l-am putea reusi astfel este separarea codului de prezentare, creand asa-numitele templateuri. Vom avea astfel doua fisiere pentru fiecare pagina:

code/home.php defaulttemplate/home.tpl

Daca dorim un alt template, putem schimba un singur fisier. Partea de programare va fi astfel tinuta separat si ne va fi foarte clar ce vom schimba. Sa vedem si cod concret:



/**
* index.php bootstrap file
* includes db functions, connects to db and includes code and template files
*/

include "db.php";
connect();
if(!isset($_GET['page'])){
$page = 'home'; // default (index) page
}
else{
$page = $_GET['page']; // putem sa adaugam si masuri de securitate aici
}

include "defaultskin/header.tpl";
include "defaulttemplate/".$page.".tpl";
include "code/".$page.".tpl";
include "defaultskin/footer.tpl";



Ultima frontiera: clase si obiecte

Partea interesanta a programarii pe obiecte este ca un obiect poate interactiona cu alte obiecte, formand un sistem compact de functii bine determinate. Un obiect este definit dupa un model, care contine variabilele pe care le va folosi obiectul, precum si metodele sale(procedurile), model denumit clasa. O clasa este deci o colectie de medote. Daca am lua toate functiile noastre destinate lucrului cu baze de date, le-am putea grupa intr-o clasa. Am definit o astfel de clasa intr-un articol precedent.
Un obiect se defineste ca facand parte dintr-o clasa, fenomen ce se numeste instantierea clasei:


$dbObject = new DBFrame();


$dbObject este acum o variabila de tip "object" a clasei DBFrame, care contine functiile noastre de manipulare a bazei de date. Pentru a apela o variabila sau o metoda a noului nostru obiect:


$dbObject->query("SELECT * FROM tabel");


Daca veti citi articolul de care vorbeam, veti observa imediat un mic avantaj: functia magica __construct(). Aceasta se declanseaza automat la instantierea clasei. Noua ne permite sa conectam scriptul la baza de date.

Clasele se pastreaza de obicei intr-un fisier separat, cu extensie dubla: ".class.php", pentru a fi recunoscute usor. Aceste fisiere trebuie incluse in script, daca doriti ca parserul sa gaseasca clasa. O alternativa este prezenta doar in PHP5, prin functia magica __autoload(className). Aceasta functie va fi rulata automat la fiecare instantiere. Un exemplu de cum ar putea fi folosita:


function __autoload($className){
$file = 'classes/'.$className.".class.php"; //calea catre fisierul clasei. Trebuie ca toate clasele sa fie in acelasi director. Daca nu se poate, va trebui sa puneti mai multe conditii, pentru a face functia sa caute in mai multe directoare. Fisierele claselor trebuie sa aiba numele identic cu numele clasei din ele, dar asta cred ca era deja evident. Desigur, este la latitudinea voastra cum va denumiti clasele.
if(file_exists($file)) include $file;
}


Intr-un alt articol voi detalia modul in care mai multe obiecte pot alcatui un framework, pe care il vom putea folosi in construirea oricarui site.

_________________
One shot, one opportunity, one kill.
Let there be banned users!
avatar
+gZ.Flyking
Administrator
Administrator

Numarul mesajelor : 237
Data de inscriere : 05/06/2009
Varsta : 24
Localizare : Galati

Vezi profilul utilizatorului

Sus In jos

Sus


 
Permisiunile acestui forum:
Nu puteti raspunde la subiectele acestui forum