Mikä on dynaaminen sitominen?

Tietotekniikassa nimen sitominen on tunnuksen, kuten funktion tai muuttujan nimen, yhdistäminen koodin tai datan osaan. Yleisimmässä skenaariossa, staattisessa sitomisessa, tämä kartoitus tunnetaan käännöshetkellä. Dynaamisessa sidonnassa funktion kuvaama objekti ei ole tiedossa käännöshetkellä ja se voidaan määrittää vain ohjelman ajon aikana. Tästä syystä sitä kutsutaan myös myöhäiseksi sitomiseksi. Vaikka se tarjoaa joustavuutta, joka ei ole käytettävissä staattisella sidonnalla, se aiheuttaa myös enemmän suorituskykykustannuksia kuin staattinen sitominen.

Dynaaminen sidonta liittyy läheisesti polymorfismiin, joka on osa olio-ohjelmointia. Polymorfismi mahdollistaa saman menetelmän nimen toteuttamisen eri tavoilla. Jos koodia ei ole kirjoitettu siten, että tarkkaa menetelmää ei voida määrittää käännöshetkellä, on käytettävä dynaamista sidontaa.

Esimerkiksi Shape -luokassa voi olla menetelmä nimeltä GetArea, koska jokaisella muodolla on alue. “Muoto” “Ympyrä” -alaluokka toteuttaisi kuitenkin GetArean eri tavalla kuin “Neliö” -alaluokka. Jos siis luodaan uusi objekti, jonka tyyppi on “Shape” ja koodi kutsuu kyseiselle muodolle menetelmää “GetArea”, kääntäjä ei voi mitenkään tietää, onko muoto ympyrä vai neliö, ja siksi se ei tiedä, mihin GetArea -menetelmään soittaa. Tämä on esimerkki dynaamisesta sidonnasta, koska oikea GetArea -menetelmä kartoitetaan vain ajon aikana, kun ohjelma tietää, millainen muoto objekti on.

Dynaaminen sidonta mahdollistaa joustavan abstraktien menetelmien käytön tietämättä, mitä erityistä toteutusta käytetään. “Muoto” -esimerkissä koodi voitaisiin kirjoittaa dynaamisen sitomisen välttämiseksi käyttämällä nimenomaisesti tätä logiikkaa: Jos muoto on ympyrä, kutsu ympyrän GetArea -menetelmä; Muussa tapauksessa, jos muoto on neliö, soita neliöille erityinen GetArea -menetelmä. Dynaamisen sidonnan etuna on, että koodi on puhtaampi ja ylläpidettävämpi kuin vaihtoehto. Staattisen sidonnan esimerkissä on koodin päällekkäisyys, ja koodi on päivitettävä aina, kun uuden tyyppinen muoto lisätään.

Huonot puolet ovat suorituskyky ja turvallisuus. Staattisessa sidonnassa kääntäjä tietää tarkalleen, mitä koodia soittaa, ja voi optimoida koodin toimimaan tehokkaammin. Tyyppiturvallisuus voi olla ongelma, koska joissakin dynaamisen sidonnan toteutuksissa menetelmä voidaan kutsua objektiin, joka ei tue menetelmää. Esimerkiksi GetArea-menetelmä voidaan kutsua objektille, joka ei ole muoto ja jolla ei siksi ole GetArea-menetelmää, mikä voi johtaa ajonaikaiseen virheeseen. Staattinen sitominen estäisi tämän skenaarion nostamalla kääntämisvirheen.