Sunteți pe pagina 1din 11

Efecte colaterale

Destinaia unei funcii este s ntoarc ca rezultat o singur valoare. n


mod obinuit, argumentele se transmit funciei prin parametrivaloare, iar rezultatul calculat se returneaz n locul de apel prin
numele funciei. n completare, limbajul PASCAL permite transmiterea
argumentelor prin variabile globale i parametri-variabil.
Prin efect colateral se nelege o atribuire (n corpul funciei) a unei
valori la o variabil global sau la un parametru formal variabil.
Efectele colaterale pot influena n mod neateptat execuia unui
program i complic procesele de depanare.
Prezentm n continuare exemple defectuoase de programare care
folosesc funcii cu efecte colaterale.

Exemple
Program P1;
{ Efect colateral - atribuire la o variabila globala }
var a : integer; { variabila globala }
function F(x : integer) : integer;
begin
F:=a*x;
a:=a+1;
{ atribuire defectuoasa }
end; { F }
begin
a:=1;
writeln(F(1)); { se afiseaza 1 }
writeln(F(1)); { se afiseaza 2 }
writeln(F(1)); { se afiseaza 3 }
readln;
end.

n programul P1 funcia F returneaz valoarea expresiei a*x. Pe


lng asta ns, atribuirea a:=a+1 altereaz valoarea variabilei
globale a. n consecin, pentru una i aceeeai valoare 1 a
argumentului x funcia returneaz rezultate diferite, fapt ce nu se
ncadreaz n conceptul uzual de funcie.

Program P2;
{ Efect colateral - atribuire la un parametru formal }
var a : integer;
function F(var x : integer) : integer;
begin
F:=2*x;
x:=x+1;
{ atribuire defectuoasa }
end; { F }
begin
a:=2;
writeln(F(a));
{ se afiseaza 4 }
writeln(F(a));
{ se afiseaza 6 }
writeln(F(a));
{ se afiseaza 8 }
readln;
end.

n programul P2 funcia F returneaz valoarea expresiei 2*x. ntruct


x este un parametru formal variabil, atribuirea x:=x+1 schimb
valoarea parametrului actual din apel, i anume, a variabilei a din
programul principal. Faptul c apelurile textual identice F(a), F(a)
i F(a) returneaz rezultate ce difer, poate crea confuzii n procesul
depanrii.

n cazul procedurilor, atribuirile asupra variabilelor produc efecte colaterale


similare celor discutate pentru astfel de atribuiri la funcii. ntruct mijloculstandart de ntoarcere de rezultate din procedur este prin parametri formali
variabil, atribuirile asupra unor astfel de parametri nu sunt considerate ca efecte
colaterale.
Efectele colaterale introduc abateri de la procesul-standard de comunicare, prin
care variabilele participante sunt desemnate explicit ca parametri formali n
declaraie i parametri actuali n apel. Consecinele efectelor colaterale se pot
propaga n domeniul de vizibilitate al declaraiilor globale i pot interfera cu cele
similare produse la execuia altor proceduri i funcii. n astfel de condiii,
utilizarea variabilelor globale devine riscant. Prin urmare, la elaborarea
programelor complexe se vor aplica urmtoarele recomandri:

Comunicarea funciilor cu mediul de chemare se va face prin


transmiterea de date spre funcie prin parametri formali valoare i
ntoarcerea unui singur rezultat prin numele ei.
Comunicarea procedurilor cu mediul de chemare se va face prin
transmiterea de date prin parametri formali valoare sau variabil i
ntoarcerea rezultatelor prin parametri formali variabil.
Variabilele globale pot fi folosite pentru transmiterea datelor n
subprograme, ns valorile lor nu trebuie s fie schimbate de acestea.

Pentru acas

Precizai ce vor afia pe ecran programele ce urmeaz.


Program P112;
{ Efecte colaterale }
var a, b : integer;
function F(x : integer) : integer;
begin
F:=a*x;
b:=b+1;
end; { F }
function G(x : integer) : integer;
begin
G:=b+x;
a:=a+1;
end; { G }
begin
a:=1; b:=1;
writeln(F(1));
writeln(G(1));
writeln(F(1));
writeln(G(1));
readln;
end.

Program P113;
{ Efecte colaterale }
var a : integer;
b : real;
function F(var x : integer) : integer;
begin
F:=x;
x:=x+1;
end; { F }
procedure P(x, y : integer; var z : real);
begin
z:=x/y;
end; { P }
begin
a:=1;
P(F(a), a, b);
writeln(a, '
', b);
readln;
end.

Program P114;
{ Efecte colaterale }
var a, b : real;
procedure P(var x, y : real);
{ Interschimbarea valorilor variabilelor x, y }
begin
a:=x;
x:=y;
y:=a;
end; { P }
begin
a:=1; b:=2;
P(a, b);
writeln(a, b);
a:=3; b:=4;
P(a, b);
writeln(a, b);
readln;
end.

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