PROCEDURI
Necesitate
Tipuri
Liste de parametri
Returnarea rezultatelor
Structuri de proceduri
Apelul
Generalitatea procedurilor
Programarea standard
Analiza gradului de reutilizare
Necesitate
Construirea de proceduri este necesara pentru ca:
- permite reutilizarea de secvente destinate solutionarii aceleiasi probleme
- conduce la cresterea productivitatii muncii programatorilor
- conduce la reducerea costurilor
- permite folosirea experientei si generaza constructii foarte performante
- reduce dimensiunea programului prin eliminarea secventelor care fac acelasi lucru si inlocuirea lor pritr-o instructiune de apel procedura
permite elaborarea simultan in echipa a modulelor
- asigura testarea pe bucati a produsului program
- realizarea de constructii omogene faciliteaza testarea
- este mai simplu sa se realizeze partile si sa se asambleze decat sa se efectueze scrierea unui program complex instructiune de instructiune, strict in ordinea care se si fixeaza a instructiunilor.
Trebuie dezvoltata o cultura a scrierii de proceduri.
Nu se scriu proceduri pentru a fi folosite o singura data.
Se scriu proceduri care se apeleaza de foarte multe ori, fie in acelasi program, fie in programe diferite.
Programatorul trebuie sa vada ce secvente se transforma in proceduri si ce secvente raman asa cum sunt.
Ideea este de a pastra un echilibru.
Nu trebuie faramitat programul, chiar daca scrierea de proceduri este un obiectiv si o sursa de eficienta.
revenire

Tipuri
Procedurile se grupeaza dupa mai multe criterii, precum:
- dupa criteriul complexitatii, sunt proceduri: de complexitate redusa, de complexitate medie si trebuie evitate procedurile de mare complexitate ce nu rezulta ca apeluri de alte proceduri;
- dupa criteriul rezultatelor returnate, se identifica proceduri care returneaza rezultat o variabila elementara, o variabila agregata sau nu returneaza rezultat avand tipul void;
- dupa lista de parametri transmisa: exista proceduri cu lista vida de parametri sau proceduri cu lista structurata de parametri;
- dupa functia de prelucrare, exista proceduri de calcul, de comparare, de validare, de lucru cu fisiere, de afisare rezultate, de gestionare liste, stive arbori, de alocare si dealocare, de prelucrare intreruperi, de executie prelucrari grafice;
- nupa nivelul de testare se identifica proceduri complet testate, partial testate sau netestate;
- dupa modul de transmitere parametri: prin adresa, prin valoare, prin referinta;
- dupa nivelul de omogenitate se disting proceduri omogene, iar procedurile neomogene sunt acelea care executa tot felul de prelucrari (calcule, operatii I-E, apeleaza intreruperi);
- dupa structura liste de parametri: cu liste fixa si cu lista variabila de parametri.
Tipul de procedura este dat de:
- contextul in care se dezvolta un program
- tehnicile pe care le utilizeaza deja programatorii
- majoritatea procedurilor reutilizate, fiind necesar sa se asigure omogenitatea programului.
revenire

Liste de parametri
Listele de parametri se construiesc dupa diferite moduri acceptate de mai multi programatori.
Este rezonabil sa se stabileasca niste reguli, pe care toti programatorii sa le respecte daca au fost de acord cu ele.
Daca se lucreaza cu variabile globale, nu vor fi liste de parametri.
Acceptata aceasta tehnica, evident trebuie respectata chiar daca are dezavantaje.
Se prefera procedurile cu liste de parametri formate din sublistele:
- parametrilor ce contin date de intrare cu conventia ca aceste variabile nu fac obiectul atribuirilor, deci NU li se modifica continutul
- parametrilor rezultate care se initializeaza prin subprogram
- parametrilor de stare ce arata prin coduri stabilite, modul in care au decurs prelucrarile; citind intr-o lista de mesaje ceea ce corespunde codului returnat, se va vedea daca au fost efectuate sau nu prelucrarile si mai ales care au fost cauzele intreruperilor.
revenire

Returnarea rezultatelor
Procedurile returneaza:
- continutul unor variabile
- adresele unor variabile
- adresele unor alte proceduri
- adresele unor structuri de date agregate.
Sunt proceduri care trebuie sa returneze mai multe rezultate, situatie care se rezolva prin:
- gruparea rezultatelor omogene intr-un vector si se returneaza pointer spre vector
- construirea unei variabile de tip struct si se initializeaza campurile membru cu acele rezultate; se returneaza variabila de tip articol
- se include in lista de parametri o sublista de pointeri care contin adresele variabilelor ce contin rezultatele ce se doreste a fi returnate.
Este preferabil ca regulile sa fie unitare.
In cazul in care se definesc variabile de stare si se doreste ca procedurile sa returneze coduri asupra modului in care au fost derulate prelucrarile, listele de parametri preiau prin intermediul variabilelor pointer returnarea de rezultate.
Este preferabil ca procedura sa contina o singura instructiune return().
revenire

Structuri de proceduri
Orice procedura contine:
- o linie de definire tip, nume si lista de parametri
- delimitatorul de inceput de bloc
- corpul procedurii
- instructiunea de returnare rezultate
- delimitatorul de final de bloc. Corpul procedurii trebuie sa fie cat mai putin stufos ceea ce arata ca programatorul a realizat o procedura care executa o functie de prelucrare precis definita.
Daca procedura contine switch() sau instructiuni for() si if() imbricate, complexitatea deja este in crestere, ceea ce afecteaza generalitatea prelucrarilor.
Procedurile trebuie astfel construite incat sa asigure obtinerea de rezultate foarte bune.
Se includ teste care garanteaza traversarea exact a streucturilor de date initializate.
revenire

Apelul
Apelulo procedurilor se efectueaza prin instructiunea call sau prin utilizarea numelui procedurii, nume urmat de lista de parametri reali.
Este rezonabil sa se construiasca proceduri care sa fie apelate fara a se isca erori si confuzii.
De aceea inca de la atribuirea numelui si de la construirea listei de parametri se au in vedere riscurile care apar si erorile care se produc.
Inversarea locului unor parametri, inconsecventa definirii de tipuri de parametri genereaza apeluri de proceduri cu grave erori de preluare a datelor.
Cine programeaza in limbajul de asamblare este si cel care da raspunsurile corecte la lantul de efecte pe care il determina:
- utilizarea unei liste de parametri reali mai scurta decat cea care este definita pentru parametri formali
- utilizarea de liste cu parametri reali mai lunga
- nerespectarea concordantei de tip intre elementele corespondente din listele de parametri reali, respectiv, parametri formali
- neincluderea de teste care sa elimine intreruperile de exceptie a prelucrarilor.
cand se specializeaza programatorii in a utiliza proceduri si in a le si apela, se diminueaza riscurile si incepe munca de rutina care duce spre cresterea productivitatii, cu riscul de a elabora programe dintr-o clasa de complexitate, indiferent de complexitatea problemei de rezolvat.
revenire

Generalitatea procedurilor
Generalitatea se obtine gradual.
NU este bine sa se doreasca elaborarea de proceduri cu grad maxim de generalitate.
Problema se abordeaza treptat.
Pentru inversarea unei matrice, mai intai:
- se scrie o procedura care inverseaza matricea cu 10 linii si 10 coloane, considerata din start nesingulara
- se introduce testul de singularitate si procedura returneaza 1 daca s-a efectuat inversarea si 0 in caz contrar
- se cauta implementarea unui algoritm de aproximare dar se mareste si dimensiunea matricei
- se trece la inversarea matricei de 100 linii si 100 coloane
- se trece la rezolvarea matricei rare cu 500 linii si 500 coloane
- se cauta inversarea matricei stocate intr-un fisier, procedura operand cu matrice de 1000 linii si 1000 coloane
- generalitatea se duce spre calculul pseudoinversei.
Trebuie gasit unechilibru si in biblioteca trebuie sa se afle si proceduri mai simple si cele mai generale.
Programatorul trebuie sa aleaga.
Este neeficient sa existe proceduri de maxima generalitate si in final ele sa fie apelate pentru inversarea matricei A de 3 linii si 3 coloane.
Daca exista procedura de calcul a expresiei expn(A) unde A este o matrice, dupa formula:
expn(A)=E+A/1!+A**2/2!+A**3/3!+....+A**n/n!
unde:
n! - factorialul lui n
** - ridicare la putere
E - matrice unitate.
Este dramatic daca procedura pentru calculul expresiei expn(A) se utilizeaza in locul lui exp(x) pentru calculul unei exponential.
Este ca si cum, pentru productia oalelor de lut se intrebuinteaza roboti cibernetici.
Pentru prelucrari simple, trebuie proceduri simple.
Pentru programe complexe, trebuie proceduri cu grad de generalitate foarte ridicat.
Generalitatea trebuie sa fie dublata de asigurarea corectitudinii subprogramului.
daca se doreste reducerea complexitatii procedurii, se diminueaza simultan si generalitatea.
Anumite elemente de generalitate se obtin prin utilizarea unor structuri de date adecvate.
Calculul pe serii de date creste in generalitate daca se lucreaza cu matrice ce contin pe coloane seriile, iar numarul variabil de termeni ai seriilor se memoreaza intr-un vector.
Provedura:
void calcul_sume(int seriile[][100], int nr_term[], int nr_serii, int rez[])
{
int i,j,k, suma;
for(i=0;i {
k=nr_term[i]; suma=0; for(j=0;j suma+=seriile[j][i];
rez[i]=suma;
} are un nivel de generalitate suficient de mare.
Permite lucru cu cel mult 100 de serii si seriile au numar oarecare de termeni.
Se presupune ca datele sunt complete si corecte.
Daca trebuie facute validari :
- se schimba tipul rezultatului returnat
- se includ secvente de testare a componentelor nr_serii[i] care trebuie sa fie pozitive strict.
revenire

Programarea standard
Programarea standard este un concept al anilor '80 care se bazeaza pe scriere de programe exclusiv prin apel de proceduri.
Este ceea ce impune programarea orientata obiect pe un alt plan, bineanteles.
Exista biblioteci foarte cuprinzatoare.
Programatorul trebuie sa apeleze acele functii din biblioteca.
Programul sau apare strict ca un lant de apeluri de proceduri si nimic altceva.
Se pune problema daca este bine sa se intample astfel.
Raspunsul este afirmativ.
Un foarte bun programator este acela care stie sa asambleze intr-un intreg bucatile dintr-un puzzle foarte complex.
Lucrurile sunt si mai importante prin faptul ca programatorul care face programare standard are multe piese de puzzle.
El este cel care trebuie sa construiasca un desen din acele bucati.
El este constient ca desenul nu retine nici 15% din bucatile disponibile.
Pentru evaluarea unei expresii de forma:
A=(B*C)'+D**(-1)+R*G
unde G este o matrice ce contine:
- un bloc cu m linii si m coloane format din matricea H
- un bloc cu n linii si n coloane format din matricea T
- o matrice cu elemente nule avand n linii si m coloane, sub matricea H
- o matrice cu elemente nule cu m linii si n coloane deasupra matricei T
- A,B,C,D,R,G sunt matrice cu m + n linii si m+n coloane.
Se folosesc subprogramele pentru:
- adunare matrice
- inmultire matrice
- transpunere matrice
- inversare matrice
- construire matrice din blocuri copiate
- copiere matrice.
Daca se procedeaza la supraincarcare de operatori, programarea orientata obiect permite evaluarea expresiei direct.
revenire

Analiza gradului de reutilizare
daca se propune realizarea unui program, mai intai trebuie sa se :
- vada daca exista pe piata un asemenea produs, caz in care se stabileste oportunitatea scrierii unui program pentru care exista o replica pe piata, sau programul scris este replica...
- traseze structura functionala a programului
- vada ce proceduri exista deja in functiune si care trebuie preluate
- in celimbaj se scrie programul
- ce sistem ge gestiune a datelor este adoptat; se va tine seama daca datele exista deja.
Gradul de reutilizare GU, este dat de relatia:
GU=NLR/NLT
unde:
NLR- numar de linii sursa ce provin din proceduri reutilizate
NLT - numar total de linii sursa care alcatuiesc programul.
Exista:
- gradul de utilizare planificat
- gradul de utilizare efectiv
- gradul de utilizare care trebuie.
La planificarea gradului de utilizare exista riscul ca programatorii sa treaca drept proceduri noi si proceduri care exista.
La dezvoltarea de programe, din ignoranta unele proceduri se scriu desi ele doar trebuiau apelate.
Gradul de reutilizare care trebuie este pus in evidenta de programatori care:
- nu sunt interesati sa triseze trecad drept proceduri noi ceea ce deja exista
- cunosc ceea ce exista in bibliotecile de proceduri din firma dar si din literatura.
Daca de exemplu este scris un program de 10.000 linii sursa fara a reutiliza alte proceduri, gradul de breutilizare efectiv este ZERO.
Este posibila o astfel de situatie daca in firma:
- este elaborat un nou limbaj de programare revolutionar
- se scriu primele programe
- exista biblioteci de proceduri secrete si inaccesibile
- nu sunt fonduri pentru a achizitiona biblioteci dar exista prea multi programatori foarte buni.
Daca de exemplu se scrie un program cu 20.000 linii sursa din care 5.000 linii sursa provin din proceduri reutilizate, gradul de reutilizare efectiva GUE, este:
GUE=5.000/20.000 *100=25%
Daca o echipa de auditori extrem de performanti analizeaza textele sursa si:
- vad ca sunt proceduri scrise care puteau fi preluate, insumand 8.000 linii sursa
- stabilesc ca procedurile reutilizate puteau fi altele cu mult mai performante dar care in loc de 5.000 linii sursa totalizau 3.500 linii sursa, liniile sursa elaborate trebuiau altfel distribuite si chiar scrise si in loc de 20.000 - 5.000 liniisursa proprii, programul trebuia sa aiba 12.400 linii sursa, atunci gradul de reutilizare care trebuia GUT, este:
GUT=min{5.000, 3.500}/min{20.000-5.000, 12.400}*100=28,22%
ceea ce inseamna ca programatorii au facut risipa de resurse.
revenire

revenire