Co to jest dynamiczne wiązanie?
W informatyce wiązanie nazw to powiązanie identyfikatora, takiego jak nazwa funkcji lub zmiennej, z sekcją kodu lub danych. W najczęstszym scenariuszu wiązania statycznego to mapowanie jest znane w czasie kompilacji. W powiązaniu dynamicznym obiekt odwzorowany przez funkcję nie jest znany w czasie kompilacji i można go określić tylko w czasie wykonywania programu. Z tego powodu wiązanie dynamiczne jest również nazywane wiązaniem późnym. Chociaż wiązanie dynamiczne oferuje elastyczność niedostępną w przypadku wiązania statycznego, pociąga za sobą także wyższe koszty 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 implementację tej samej nazwy metody na różne sposoby. Jeśli kod nie jest napisany w taki sposób, że nie można ustalić dokładnej metody w czasie kompilacji, należy zastosować powiązanie dynamiczne.
Na przykład klasa „Shape” może mieć metodę o nazwie „GetArea”, ponieważ każdy kształt ma obszar. Podklasa „Shape” „Circle” zaimplementowałaby jednak „GetArea” inaczej niż podklasa „Square”. Dlatego jeśli zostanie utworzony nowy obiekt typu „Kształt”, a kod wywoła metodę „GetArea” na tym kształcie, kompilator nie będzie miał możliwości dowiedzieć się, czy kształt będzie kołem, czy kwadratem, a zatem nie będzie wiedział, którą metodę GetArea wywołać. Jest to przykład powiązania dynamicznego, ponieważ poprawna metoda GetArea zostanie odwzorowana tylko w czasie wykonywania, gdy program będzie wiedział, jaki jest kształt obiektu.
Dynamiczne wiązanie umożliwia elastyczność korzystania z metod abstrakcyjnych bez wiedzy, która konkretna implementacja zostanie zastosowana. W przykładzie „Kształt” kod można zapisać, aby uniknąć dynamicznego wiązania, używając jawnie tej logiki: Jeśli kształt jest okręgiem, wywołaj metodę GetArea; 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 wiązania statycznego występuje duplikacja kodu i kod musi być aktualizowany za każdym razem, gdy dodawany jest nowy typ kształtu.
Wady dynamicznego wiązania to wydajność i bezpieczeństwo. W przypadku wiązania statycznego kompilator dokładnie wie, do którego kodu należy wywołać, i może zoptymalizować kod, aby działał wydajniej. Bezpieczeństwo typu może stanowić problem, ponieważ w niektórych implementacjach dynamicznego wiązania można wywołać metodę na obiekcie, który nie obsługuje tej metody. Na przykład metodę „GetArea” można wywołać na obiekcie, który nie jest kształtem, a zatem nie ma metody „GetArea”, co może spowodować błąd w czasie wykonywania. Wiązanie statyczne zapobiegłoby temu scenariuszowi przez zgłoszenie błędu kompilacji.