Vad är dynamisk bindning?

Inom datavetenskap är namnbindning associeringen av en identifierare, till exempel ett funktions- eller variabelnamn, till ett avsnitt av kod eller data. I det vanligaste scenariot, statisk bindning, är denna mappning känd vid kompilering. Vid dynamisk bindning är objektet som mappas av en funktion inte känt vid kompilering och kan endast bestämmas under programkörningstid. Av denna anledning kallas det även sen bindning. Även om det erbjuder flexibilitet som inte är tillgängligt med statisk bindning, medför det också mer prestandakostnader än statisk bindning.

Dynamisk bindning är nära relaterad till polymorfism, som är en del av objektorienterad programmering. Polymorfism gör att samma metodnamn kan implementeras på olika sätt. Om koden inte är skriven på ett sådant sätt att den exakta metoden inte kan bestämmas vid kompilering, måste dynamisk bindning användas.

Till exempel kan en ”Shape”-klass ha en metod som heter ”GetArea”, eftersom varje form har ett område. En ”Circle”-underklass av ”Shape” skulle emellertid implementera ”GetArea” på ett annat sätt än en ”Square”-underklass skulle. Därför, om ett nytt objekt skapas av typen ”Shape”, och om koden anropar metoden ”GetArea” på den formen, har kompilatorn inget sätt att veta om formen kommer att bli en cirkel eller en kvadrat, och därför den kommer inte att veta vilken GetArea-metod som ska anropas. Detta är ett exempel på dynamisk bindning, eftersom den korrekta GetArea-metoden kommer att mappas endast vid körning, efter att programmet vet vilken typ av form objektet är.

Dynamisk bindning tillåter flexibiliteten att använda abstrakta metoder utan att veta vilken specifik implementering som kommer att användas. I exemplet ”Shape” kan koden skrivas för att undvika dynamisk bindning genom att uttryckligen använda denna logik: Om formen är en cirkel, anropa cirkelns GetArea-metod; annars, om formen är en kvadrat, anropa den specifika GetArea-metoden för rutor. Fördelen med dynamisk bindning är att koden är renare och mer underhållbar än alternativet. I exemplet med statisk bindning finns kodduplicering, och koden måste uppdateras varje gång en ny typ av form läggs till.

Nackdelarna är prestanda och säkerhet. Vid statisk bindning vet kompilatorn exakt vilken kod som ska anropas och kan optimera koden för att köras mer effektivt. Typsäkerhet kan vara ett problem eftersom, i vissa implementeringar av dynamisk bindning, kan en metod anropas på ett objekt som inte stöder metoden. Till exempel kan ”GetArea”-metoden anropas på ett objekt som inte är en form och därför inte har någon ”GetArea”-metod, vilket kan resultera i ett körtidsfel. Statisk bindning skulle förhindra detta scenario genom att skapa ett kompileringsfel.