Co to jest wiązanie dynamiczne?

W informatyce wiązanie nazw to powiązanie identyfikatora, takiego jak nazwa funkcji lub zmiennej, z sekcją kodu lub danych. W najczęstszym scenariuszu powiązania statycznego to mapowanie jest znane w czasie kompilacji. W wiązaniu dynamicznym obiekt mapowany przez funkcję nie jest znany w czasie kompilacji i można go określić tylko w czasie wykonywania programu. Z tego powodu nazywane jest również późnym wiązaniem. Chociaż oferuje elastyczność niedostępną w przypadku wiązania statycznego, wiąże się również z większymi kosztami wydajności niż wiązanie statyczne.

Wiązanie dynamiczne jest ściśle związane z polimorfizmem, który jest częścią programowania obiektowego. Polimorfizm pozwala na zaimplementowanie tej samej nazwy metody na różne sposoby. Jeśli kod nie jest napisany w taki sposób, że nie można określić dokładnej metody w czasie kompilacji, należy użyć dynamicznego wiązania.

Na przykład klasa „Shape” może mieć metodę o nazwie „GetArea”, ponieważ każdy kształt ma obszar. Jednak podklasa „Circle” o nazwie „Shape” implementowałaby „GetArea” inaczej niż podklasa „Square”. Dlatego też, jeśli tworzony jest nowy obiekt typu „Kształt” i jeśli kod wywoła metodę „GetArea” na tym kształcie, kompilator nie będzie miał możliwości sprawdzenia, czy dany kształt będzie kołem czy kwadratem, a zatem nie będzie wiedział, którą metodę GetArea wywołać. Jest to przykład dynamicznego wiązania, ponieważ poprawna metoda GetArea zostanie zmapowana dopiero w czasie wykonywania, po tym, jak program wie, jaki jest kształt obiektu.

Wiązanie dynamiczne pozwala na elastyczność korzystania z metod abstrakcyjnych bez wiedzy, która konkretna implementacja zostanie użyta. W przykładzie „Kształt” można napisać kod, aby uniknąć dynamicznego wiązania, używając tej logiki: Jeśli kształt jest kołem, wywołaj metodę GetArea okręgu; w przeciwnym razie, jeśli kształt jest kwadratem, wywołaj określoną metodę GetArea dla kwadratów. Zaletą dynamicznego wiązania jest to, że kod jest czystszy i łatwiejszy w utrzymaniu niż alternatywa. W przykładzie powiązania statycznego występuje duplikacja kodu, a kod musi być aktualizowany za każdym razem, gdy dodawany jest nowy typ kształtu.

Wadami są wydajność i bezpieczeństwo. W wiązaniu statycznym kompilator dokładnie wie, jaki kod wywołać i może go zoptymalizować, aby działał wydajniej. Bezpieczeństwo typów może stanowić problem, ponieważ w niektórych implementacjach wiązania dynamicznego można wywołać metodę na obiekcie, który nie obsługuje tej metody. Na przykład metoda „GetArea” może zostać wywołana na obiekcie, który nie jest kształtem i dlatego nie ma metody „GetArea”, co może spowodować błąd w czasie wykonywania. Powiązanie statyczne zapobiegłoby temu scenariuszowi, zgłaszając błąd kompilacji.