4 - Efecte colaterale

11
Efecte colaterale

description

informatica 11

Transcript of 4 - Efecte colaterale

Page 1: 4 - Efecte colaterale

Efecte colaterale

Page 2: 4 - Efecte colaterale

• Destinația unei funcții este să întoarcă ca rezultat o singură valoare. În mod obișnuit, argumentele se transmit funcției prin parametri-valoare, iar rezultatul calculat se returnează în locul de apel prinnumele funcției. În completare, limbajul PASCAL permite transmiterea argumentelor prin variabile globale și parametri-variabilă.

• Prin efect colateral se înțelege o atribuire (în corpul funcției) a unei valori la o variabilă globală sau la un parametru formal variabilă. Efectele colaterale pot influența în mod neașteptat execuția unui program și complică procesele de depanare.

• Prezentăm în continuare exemple defectuoase de programare care folosesc funcții cu efecte colaterale.

Page 3: 4 - Efecte colaterale

Exemple

Program P1;{ Efect colateral - atribuire la o variabila globala }

var a : integer; { variabila globala }function F(x : integer) : integer;beginF:=a*x;a:=a+1; { atribuire defectuoasa }

end; { F }begina:=1;writeln(F(1)); { se afiseaza 1 }writeln(F(1)); { se afiseaza 2 }writeln(F(1)); { se afiseaza 3 }readln;

end.

Page 4: 4 - Efecte colaterale

• În programul P1 funcția F returnează valoarea expresiei a*x. Pe lîngă asta însă, atribuirea a:=a+1 alterează valoarea variabilei globale a. În consecință, pentru una și aceeeași valoare 1 a argumentului x funcția returnează rezultate diferite, fapt ce nu se încadrează în conceptul uzual de funcție.

Page 5: 4 - Efecte colaterale

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.

Page 6: 4 - Efecte colaterale

• În programul P2 funcția F returnează valoarea expresiei 2*x. Întrucîtx 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 depanării.

Page 7: 4 - Efecte colaterale

• În cazul procedurilor, atribuirile asupra variabilelor produc efecte colaterale similare celor discutate pentru astfel de atribuiri la funcții. Întrucît mijlocul-standart 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 declarație și parametri actuali în apel. Consecințele efectelor colaterale se pot propaga în domeniul de vizibilitate al declarațiilor globale și pot interfera cu cele similare produse la execuția altor proceduri și funcții. În astfel de condiții, utilizarea variabilelor globale devine riscantă. Prin urmare, la elaborarea programelor complexe se vor aplica următoarele recomandări:

Page 8: 4 - Efecte colaterale

Comunicarea funcțiilor cu mediul de chemare se va face prin transmiterea de date spre funcție 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.

Page 9: 4 - Efecte colaterale

Pentru acasă• Precizați ce vor afișa pe ecran programele ce urmează.Program P112;{ Efecte colaterale }

var a, b : integer;function F(x : integer) : integer;beginF:=a*x;b:=b+1;

end; { F }function G(x : integer) : integer;beginG:=b+x;a:=a+1;

end; { G }begina:=1; b:=1;writeln(F(1));writeln(G(1));writeln(F(1));writeln(G(1));readln;

end.

Page 10: 4 - Efecte colaterale

Program P113;{ Efecte colaterale }var a : integer;

b : real;function F(var x : integer) : integer;beginF:=x;x:=x+1;end; { F }procedure P(x, y : integer; var z : real);beginz:=x/y;end; { P }begina:=1;P(F(a), a, b);writeln(a, ' ', b);readln;end.

Page 11: 4 - Efecte colaterale

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