Ce este Dynamic Binding?

În informatică, legarea de nume este asocierea unui identificator, cum ar fi o funcție sau un nume de variabilă, la o secțiune de cod sau date. În cel mai comun scenariu, legarea statică, această mapare este cunoscută la momentul compilării. În legarea dinamică, obiectul mapat de o funcție nu este cunoscut în timpul compilării și poate fi determinat numai în timpul rulării programului. Din acest motiv, se mai numește și legarea tardivă. Deși oferă flexibilitate care nu este disponibilă cu legarea statică, implică și costuri de performanță mai mari decât legarea statică.

Legarea dinamică este strâns legată de polimorfism, care face parte din programarea orientată pe obiecte. Polimorfismul permite ca același nume de metodă să fie implementat în moduri diferite. Dacă codul nu este scris în așa fel încât metoda precisă să nu poată fi determinată în timpul compilării, atunci trebuie utilizată legarea dinamică.

De exemplu, o clasă „Shape” poate avea o metodă numită „GetArea”, deoarece fiecare formă are o zonă. Cu toate acestea, o subclasă „Circle” a „Shape” ar implementa „GetArea” diferit de modul în care ar face o subclasă „Square”. Prin urmare, dacă un obiect nou este creat de tipul „Shape” și dacă codul apelează metoda „GetArea” pe acea formă, compilatorul nu va avea de unde să știe dacă forma va ajunge să fie un cerc sau un pătrat și, prin urmare, nu va ști ce metodă GetArea să apeleze. Acesta este un exemplu de legare dinamică, deoarece metoda GetArea corectă va fi mapată numai în timpul rulării, după ce programul știe ce fel de formă are obiectul.

Legarea dinamică permite flexibilitatea utilizării metodelor abstracte fără a ști care implementare specifică va fi utilizată. În exemplul „Formă”, codul ar putea fi scris pentru a evita legarea dinamică, folosind în mod explicit această logică: Dacă forma este un cerc, atunci apelați metoda GetArea a cercului; altfel, dacă forma este un pătrat, apelați metoda specifică GetArea pentru pătrate. Avantajul legării dinamice este că codul este mai curat și mai ușor de întreținut decât alternativa. În exemplul de legare statică, există duplicarea codului, iar codul trebuie actualizat oricând se adaugă un nou tip de formă.

Dezavantajele sunt performanța și siguranța. În legarea statică, compilatorul știe exact ce cod să apeleze și poate optimiza codul pentru a rula mai eficient. Siguranța tipului poate fi o problemă deoarece, în unele implementări de legare dinamică, o metodă poate fi apelată pe un obiect care nu acceptă metoda. De exemplu, metoda „GetArea” ar putea fi apelată pe un obiect care nu este o formă și, prin urmare, nu are metoda „GetArea”, ceea ce ar putea duce la o eroare de rulare. Legarea statică ar preveni acest scenariu prin ridicarea unei erori de compilare.