Sunteți pe pagina 1din 8

1

CAPITOLUL 1
Trecere n revist a tehnicilor de programare

Acest capitol este o scurt trecere n revist a tehnicilor de programare. Pentru a ilustra
proprietile particulare i pentru a pune n eviden principalele idei i probleme vom utiliza
exemple simple.
Pentru cineva care ncearc s nvee programarea, se poate observa urmtoarea cale
de urmat:
- programare nestructurat,
- programare procedural,
- programare modular
- programare orientat pe obiect.

1.1. Programarea nestructurat

Uzual, cel care ncepe sa nvee programarea, va ncepe prin scrierea unui program
mic i simplu, constnd numai dintr-un program principal. Programul principal va conine
numai o secven de comenzi sau instruciuni care modific date care sunt globale pentru
ntreg programul. Programul principal (main) va opera direct asupra datelor globale. Acest
mod de programare poate fi ilustrat ca n figura 1.1.






Figura 1.1. Programare nestructurat

Aa cum este bine tiut, aceste tehnici de programare provoac o serie de dezvantaje
pe msur ce dimensiunea programului crete. De exemplu, dac o secven de instruciuni
este necesar n diferite zone ale programului, aceast secven trebuie copiat. Acest fapt a
condus la ideea de a extrage aceste secvene dndu-le un nume i punnd la dispoziie o
tehnic de apelare i de ntoarcere din aceste proceduri.

1.2. Programarea procedural

Cu ajutorul programrii procedurale, programatorul are posibilitatea de a plasa
secvene de instruciuni (proceduri) ntr-un singur loc din program. Pentru a invoca procedura
se va utiliza un apel de procedur. Dup ce secvena de instruciuni este procesat, execuia
programului continu cu instruciunea urmtoare locului n care a fost fcut apelul de
procedur. Modul n care are loc apelul procedurii, preluarea controlului de ctre aceasta,
precum i revenirea n programul principal, pot fi ilustrate ca n figura 1.2.

program
program principal
date
2























Figura 1.2. Execuia unei proceduri

Prin introducerea unor parametri, care pot fi chiar proceduri (numite uneori
subproceduri), programele pot fi scrise mult mai structurat i fr erori. De exemplu, dac o
procedur este scris corect, de cte ori va fi utilizat ea va oferi rspunsuri corecte. Prin
urmare, n cazul n care apar erori la execuie, atenia va fi concentrat asupra zonelor de
program care nu s-a demonstrat c sunt corecte.
n aceast etap, un program poate fi vzut ca o secven de apeluri de proceduri.
Programul principal este responsabil de a oferi datele apelurilor individuale, datele sunt
procesate de ctre proceduri i odat programul finalizat el trebuie s prezinte datele rezultate.
Astfel, fluxul de date poate fi ilustrat ca fiind un graf ierarhizat, un arbore, pentru un program
care nu are i subproceduri (Figura 1.3.).











Figura 1.3. Programare procedural
Programul principal coordoneaz apelurile de proceduri i ofer datele ca paramatri.
Recapitulnd, acum avem un singur program care este divizat n fragmente mici
numite proceduri. Pentru a permite utilizarea general a procedurilor sau grupurilor de
Apel procedur
Apel procedur


Pocedur
Program
principal
program
program principal
date
procedura 1 procedura 2 procedura 3
3

proceduri chiar i n alte programe, ele trebuie s permit separarea. Acest lucru va fi realizat
n cadrul programrii modulare, care permite gruparea procedurilor n module.

1.3. Programarea modular

Cu programarea modular, procedurile cu o funcionalitate comun sunt grupate
mpreun n cadrul unor module separate. n aceast situaie, un program nu va mai conine
numai o singur parte. Acum el va fi divizat n cteva pri mai mici care vor interaciona prin
intermediul apelurilor de proceduri i care vor forma ntregul program (figura 1.4.).




















Figura 1.4. Programarea modular


Programul prioncipal coordoneaz apelurile de proceduri n module separate i
administreaz datele sub form de parametri.
Fiecare modul poate avea propriile date. Acest fapt permite fiecrui modul s i
administreze o stare intern care poate fi modificat prin apeluri de proceduri din interiorul
su. Totui, exist numai o singur stare pentru fiecare modul i fiecare modul este prezent o
singur dat n ntregul program.



1.4. Un exemplu cu structuri de date

Programele utilizeaz structuri de date pentru a memora datele. Exist cteva structuri
de date foarte cunoscute, cum ar fi listele, arborii, vectorii, seturile, stivele, cozile, pentru a
numi numai unele dintre ele. Fiecare dintre aceste structuri de date poate fi caracterizat prin
structura ei i prin metodele de acces.

1.4.1. Manevrarea listelor simplu nlnuite

program
program principal
date
modul 1
procedura 2 procedura 3
date + date1
procedura 1
modul 2
date + date2
4

Listele simplu nlnuite sunt bine cunoscute ca utiliznd structuri foarte simple,
constnd din elemente care sunt legate mpreun ca n figura 1.5.




Figura 1.5. Sructura unei liste simplu nlnuite

Ca operaii foarte simple, s presupunem c listele simplu nlnuite ofer ca metode
de acces adugarea unui element la sfritul listei sau tergerea elementului din capul listei.
Structurile de date mai comlexe vor face uz de cele deja existente. De exemplu, o coad poate
fi structurat ca fiind o list simplu nlnuit. Ea va oferi ca metode de acces punerea (put)
unui element la sfrit i scoaterea (get) primului element (comportare first-in first-out
(FIFO)).
n continuare este prezentat un exemplu simplu care ne va ajuta s nelegem cteva
concepte de proiectare. ntruct acest exemplu este utilizat numai pentru a elustra aceste
concepte i probleme, el nu este nici complet, nici optimizat.
S presupunem c dorim realizarea unei liste n limbajul de programare C. ntruct
considerm c listele sunt structuri de date comune, vom decide implementarea lor ntr-un
modul separat. Tipic, acest lucru va necesita scrierea a dou fiiere: definirea interfeei i
implementarea propriu-zis. Folosind un pseudocod simplu i convenind c ntre simbolurile
/* */ vom nscrie comentariile, definirea interfeei poate avea urmtoarea form:

/*Definirea interfeei pentru un modul care implementeaz o list simplu nlnuit
pentru a memora date de orice tip*/

MODUL lista_simlu_nlnuit_1

BOOL iniializare_list ();
BOOL apelare_list(ANY data);
BOOL tergere_list();
sfrit_list();
ANY primul_din_list();
ANY urmtorul_din_list();
BOOL list_vid();
END

Definirea interfeei ne va descrie numai ceea ce este disponibil, nu i cum ne este
acceseibil. Vom ascunde aceste informaii n fiierul de implementare. Acesta este un
principiu fundamental n ingineria software: ascunderea informaiei privind implementarea
(information hiding). Acest lucru ne permite s modificm implementarea, de exemplu
pentru a utiliza un algoritm care s stocheze elementele mult mai rapid, dar mai mare
consumator de memorie, fr a fi nevoie s modificm alte module din program: apelurile
ctre procedurile furnizate fiind aceleai.
Ideea acestei interfee este urmtoarea: nainte de utilizarea listei se va apela funcia
iniializare_list() pentru a iniializa variabilele locale ale modulului. Urmtoarele dou
proceduri implementeaz metodele de acces apelare i tergere. Procedura apelare necesit o
discuie mai detaliat. Funcia apelare_list are ca argument data de un tip oarecare. Acest
lucru este necesar dac se dorete utilizarea funciei n mai multe medii diferite, astfel nct
tipul de date al elementelor care vor fi memorate n list nu este cunoscut apriori. n
5

consecin, trebuie utilizat un tip special ANY care permite asocierea cu el a datelor de orice
tip. A treia procedur sfrit_list() este necesar s fie apelat atunci cnd programul se
termin pentru a permite modulului s tearg variabilele interne utilizate. De exemplu se
dorete eliberarea memoriei utilizate.
Cu urmtoarele dou proceduri extrage_Primul() i extrage_Urmtorul() se creeaz
un mecanism simplu de traversare a listei. Traversarea se poate realiza utiliznd urmtoarea
bucl:

ANY data;
data extrage_Primul();
WHILE data ESTE VALID DO
Prelucreaz(data)
data extrage_Urmtorul();
END

Acum avem un modul list care permite utilizarea unei liste avnd elemente de orice
tip. Dar ce se ntml dac avem nevoie de mai mult de o singur list n program?

1.4.2. Manevrarea listelor multiple

Decizi s modifici modulul pentru a fi capabil s manipuleze mai multe liste. De aceea
trebuie s creezi o nou descriere de interfa care s includ i o definiie pentru manevrarea
listei. Aceast manevrare este utilizat n orice procedur furnizat pentru a identifica n mod
unic lista n chestiune. Fiierul de definire a interfeei pentru noul modul lista va arta stfel:

/* Un modul lista pentru mai mult de o list */

MODUL lista_simlu_nlnuit_2
DECLAR TIP manevrare_lista;
manevrare_lista creare_lista();
distrugere_lista(manevrare_lista aceasta);

BOOL apelare_list(manevrare_lista aceasta, ANY data);
ANY primul_din_list(manevrare_lista aceasta);
ANY urmtorul_din_list(manevrare_lista aceasta);
BOOL list_vid(manevrare_lista aceasta);
END

Se utilizeaz DECLAR TIP pentru a introduce un nou tip manevrare_lista care
reprezint metoda de manevrare a listei. Nu se specific cum este reprezentat aceast
manevrare sau cum este implementat. Se vor ascunde detaliile de implementare ale acestui
tip n fiierul de implementare. n modulul anterior au fost ascunse funcii i proceduri. Acum
se ascund i informaii pentru un tip de date definit de ctre utilizator, manevrare_lista.
Se utilizeaz creare_lista() pentru a obine o manevrare a unei liste vide. Orice alt
procedur va conine acum ca parametru aceasta care va identifica lista n discuie. Toate
procedurile vor opera cu aceast manevrare care este vzut ca o metod global.
Acum se poate spune c pot fi create obiecte list. Fiecare astfel de obiect poate fi
identificat prin manevrarea sa i numai acele metode vor fi aplicate care sunmt definite s
opereze n acea manevrare.

6

1.5. Probleme ale programrii modulare

1.5.1. Crearea i distrugerea explicit

n exemplu, de fiecare dat cnd se dorete utilizarea unei liste, va trebui
declarat explicit o manevrare i realizat un apel al unei proceduri creare_lista() pentru a
obine o list valid. Dup utilizarea listei, trebuie explicit apelat procedura distrugere_lista()
cu parametru lista care se dorete distrus. Dac se dorete urilizarea unei liste ntr-o
procedur, se va utiliza un cod de genul:
PROCEDURE foo ()
BEGIN
manevrare_lista lista_mea;
lista_mea creare_lista();

/* Prelucrri asupra listei */

distrugere_lista(lista_mea);

END

S comparm lista cu alte tipuri de date, de exemplu tipul ntreg. ntregii sunt declarai
cu un scop particular (de exemplu n interiorul unei proceduri). Odat definii, ei pot fi
utilizai. Cnd s-a ndeplinit scopul n care au fost creai (de exemplu se iese din procedura n
care au fost declarai) ntregii sunt pierdui. Ei sunt creai i distrui automat. Unele
compilatoare chiar iniializeaz ntregii creai cu o valoare specifica, de regul 0.
Unde este diferena la obiectele liste? Timpul de via al unei liste este de asemenea
definit prin scopul su, deci ea trebuie creat odat aprut scopul respectiv i distrus odat ce
acesta dispare. La momentul crerii lista trebuie sa fie iniializat ca fiind vid. De aceea este
de dorit s putem face o definire a listei similar cu definirea unui ntreg. O secven de cod
avnd acest scop poate arta de felul:

PROCEDURE foo ()
BEGIN
manevrare_lista lista_mea; /* Lista este creat i iniializat */

/* Prelucrri asupra listei */

END /* lista_mea este distrus */

Avantajul este acela c compilatorul va avea grij s apeleze procedurile de iniializare
i de terminare. Aceasta va asigura o tergere corect a listei, returnnd programului resursele
libere.

1.5.2. Decuplarea datelor i operaiilor

Decuparea datelor i operaiilor duce n mod uzual la o structur bazat mai mult pe
operaii dect pe date: se creeaz un modul comun care grupeaz toate operaiile (de tipul
..._lista()). Se pot utiliza aceste operaii furniznd n mod explicit datele asupra crora s
opereze. Rezult o structur a modulului orientat mai mult pe operaii dect pe date actuale.
Se poate spune c operaiile definite specific datele care pot fi utilizate.
7

n orientarea pe obiecte structura este organizat pe date. Se alege reprezentarea
datelor care acoper cel mai bine cerinele utilizatorului. n consecin, programele vor fi
structurate mai mult pe date dect pe operaii. Astfel, avem de-a face exact cu opusul cii
anterioare: datele vor specifica oparaiile posibile. Modulele vor grupa reprezentrile datelor.

1.5.3. Lipsa siguranei tipului

n exemplele prezentate a fost utilizat un tip special ANY care permite listei s
cuprind orice dat dorete. Aceasta implic faptul c compilatorul nu va putea garanta
sigurana tipului. Considernd urmtorul exemplu n care compilatorul nu poate s verifice
corectitudinea:
PROCEDURE foo()
BEGIN
SomeDataType data1;
SomeOtherType data2;
manevrare_lista lista_mea;
lista_mea creare_lista();
apelare_list(lista_mea, data1);
apelare_list(lista_mea, data2); /* Oops */

...

distrugere_lista(lista_mea);
END
Va cdea n responsabilitatea programatorului faptul c lista este utilzat corect. O
variant posibil este aceea a introducerii unor informaii suplimentare privind tipul fiecrui
element al listei. Aceasta implic ns o ncrcare suplimentar i nu ferete programatorul de
cerina de a stii ceea ce se manevreaz.
Ceea ce ne dorim este un mecanism care s ne permit s specificm pe ce tip de dat
s fie lista definit. Funciile listei trebuie s rmna aceleai indiferent dac n lista sunt
nregistrate numere, caractere, sau chiar alte liste. De aceea este de dorit ca o declarare de lista
s fie de genul:

manevrare_lista <numr> lista1; /* o lista de numere */
manevrare_lista <caracter> lista2; /* o lista de caractere */

Rutina lista corespunztoare va putea astfel s returneze tipul corect de date.
Compilatorul va fi capabil s verifice consistena tipului de date.

1.5.4. Strategii i reprezentri

Exemplul lista implic operaii de traversare a acesteia. Tipic, este utilizat n
acest scop un cursor care va puncta elementul curent. Aceasta implic o strategie de treversare
care s definesac ordinea n care sunt vizitate elementele structurii de date.
Pentru o structur de date simpl cum este o list simplu nlnuit, poate fi
luat n calcul numai o singur strategie de traversare. Pornind cu elementul cel mai din
stnga se viziteaz succesiv vecinii din dreapta pn cnd se atinge elementul din extrema
dreapt. Pentru structuri mai complexe, cum ar fi cazul arborilor, acestea pot fi traversate
utiliznd mai multe strategii. Mai ru, uneori strategiile de traversare depind de un context
particular n care sunt utilizate structurile de date. n consecin, capt sens separarea
reprezentrii actuale a structurii de date de strategia de traversare.


1.6. Pro

P
Spre de
urmnd


V
aceea c
trebuie u

loc de
transmit
iniializ
termina
program
spre obi
program


ogramarea
Programare
eosebire de
du-i propria
Figura 1.6
Vom consi
c trebuie c
utilizate ace
n program
apelarea u
te un mes
ri i distru
are explicite
Se poate pu
mare modula
iecte. Mai d
marea orient
orientat p
ea orientat
alte tehnic
a stare (figu
6. Programa
t
dera din no
create i dis
este procedu
marea orienta
unei proced
saj obiectul
ugeri corect
.
une ntrebar
ar? Se poa
departe vom
tat pe obiec
pe obiect
pe obiect
ci, n aces
ura 1.6.).
area orienta
transmind
ou exemplu
struse expli
uri ale modu
at pe obiec
duri care tr
lui list do
te. Nu mai
rea: i ce? N
ate spune c
m vedea i a
ct s devin
8
rezolv une
caz vom a
t pe obiect
du-i mesaje
ul cu liste.
icit acele
ulului pentr
ct vom avea
rebuie s r
orit. Fiecar
este nevoi
Nu este ace
a aa este d
alte facilit
o nou teh
ele dintre p
avea obiecte
t. Obiectele
e unul altuia
Problema
proceduri d
ru a face ori
a attea obi
ealizeze m
re obiect e
ie de creare
est lucru nu
dac acest fa
i ale orient
hnic de pro
problemele
e care inter
din program
a.
n cazul pro
de manevra
ice modifica
iecte liste c
manevrarea l
este respon
ea unor pro
umai o dezv
apt ar fi totu
trii pe obie
ogramare.
enumerate
racioneaz

m interacio
ogramrii m
are a listelo
are.
cte va fi ne
listei dorite
nsabil de p
oceduri de c
voltare a teh
ul despre or
ect, ceea ce
anterior.
, fiecare
oneaz
modulare
or. Apoi
evoie. n
e, se va
propriile
creare i
hnicii de
rientarea
e face ca

S-ar putea să vă placă și