Che cos’è l’associazione dinamica?

In informatica, il name binding è l’associazione di un identificatore, come un nome di funzione o variabile, a una sezione di codice o dati. Nello scenario più comune, l’associazione statica, questo mapping è noto in fase di compilazione. Nell’associazione dinamica, l’oggetto mappato da una funzione non è noto in fase di compilazione e può essere determinato solo durante l’esecuzione del programma. Per questo motivo viene anche chiamato rilegatura tardiva. Sebbene offra una flessibilità non disponibile con l’associazione statica, comporta anche maggiori costi in termini di prestazioni rispetto all’associazione statica.

Il legame dinamico è strettamente correlato al polimorfismo, che fa parte della programmazione orientata agli oggetti. Il polimorfismo consente di implementare lo stesso nome di metodo in modi diversi. Se il codice non è scritto in modo tale che non sia possibile determinare il metodo preciso in fase di compilazione, è necessario utilizzare l’associazione dinamica.

Ad esempio, una classe “Shape” potrebbe avere un metodo chiamato “GetArea”, perché ogni forma ha un’area. Una sottoclasse “Circle” di “Shape”, tuttavia, implementerebbe “GetArea” in modo diverso da come farebbe una sottoclasse “Square”. Pertanto, se viene creato un nuovo oggetto di tipo “Shape” e se il codice chiama il metodo “GetArea” su quella forma, il compilatore non avrà modo di sapere se la forma finirà per essere un cerchio o un quadrato, e quindi non saprà quale metodo GetArea chiamare. Questo è un esempio di associazione dinamica, perché il metodo GetArea corretto verrà mappato solo in fase di esecuzione, dopo che il programma conosce il tipo di forma dell’oggetto.

L’associazione dinamica consente la flessibilità di utilizzare metodi astratti senza sapere quale implementazione specifica verrà utilizzata. Nell’esempio “Shape”, il codice potrebbe essere scritto per evitare l’associazione dinamica utilizzando esplicitamente questa logica: se la forma è un cerchio, chiama il metodo GetArea del cerchio; altrimenti, se la forma è un quadrato, chiama il metodo GetArea specifico per i quadrati. Il vantaggio dell’associazione dinamica è che il codice è più pulito e più gestibile rispetto all’alternativa. Nell’esempio di associazione statica, è presente la duplicazione del codice e il codice deve essere aggiornato ogni volta che viene aggiunto un nuovo tipo di forma.

Gli svantaggi sono le prestazioni e la sicurezza. Nell’associazione statica, il compilatore sa esattamente quale codice chiamare e può ottimizzare il codice per un’esecuzione più efficiente. La sicurezza dei tipi può essere un problema perché, in alcune implementazioni dell’associazione dinamica, è possibile chiamare un metodo su un oggetto che non supporta il metodo. Ad esempio, il metodo “GetArea” potrebbe essere chiamato su un oggetto che non è una forma e quindi non ha un metodo “GetArea”, il che potrebbe causare un errore in fase di esecuzione. L’associazione statica impedirebbe questo scenario generando un errore di compilazione.