Ci sono due concetti principali in confusione: associazione e caricamento. È confuso dal concetto di DataBinding, che è da qualche parte nel mezzo che spesso fa entrambe le cose. Dopo averlo considerato, aggiungerò un altro concetto, per completare il trifecta, invio.
Tipi
Late Binding : type è sconosciuto fino a quando la variabile non viene esercitata durante l'esecuzione; di solito attraverso l'incarico ma ci sono altri mezzi per costringere un tipo; le lingue digitate dinamicamente chiamano questa una funzione sottostante, ma molte lingue tipizzate staticamente hanno un metodo per ottenere l'associazione tardiva
Implementati spesso usando [speciali] tipi dinamici, introspection / reflection, flag e opzioni del compilatore, o attraverso metodi virtuali prendendo in prestito ed estendendo il dispatch dinamico
Early Binding : tipo è noto prima che la variabile venga esercitata durante l'esecuzione, solitamente attraverso mezzi statici e dichiarativi
Implementato spesso usando tipi primitivi standard
Funzioni
Invio statico : funzione specifica nota o subroutine in fase di compilazione; non è ambiguo e corrisponde alla firma
Implementati come funzioni statiche; nessun metodo può avere la stessa firma
Dynamic Dispatch : non una funzione specifica o subroutine in fase di compilazione; determinato dal contesto durante l'esecuzione. Esistono due diversi approcci a "dispacciamento dinamico", distinti da quali informazioni contestuali vengono utilizzate per selezionare l'implementazione della funzione appropriata.
In singolo [ dinamico ] dispatch , viene utilizzato solo il tipo di istanza per determinare l'implementazione della funzione appropriata. Nei linguaggi tipizzati staticamente, ciò significa in pratica che il tipo di istanza decide quale implementazione del metodo viene utilizzata indipendentemente dal tipo di riferimento indicato quando la variabile è dichiarata / assegnata. Poiché solo un singolo tipo, il tipo di istanza dell'oggetto, viene utilizzato per dedurre l'implementazione appropriata, questo approccio è chiamato "invio singolo".
C'è anche multiplo [ dinamico ] dispatch , dove i tipi di parametri di input aiutano anche a determinare quale implementazione di funzione chiamare. Poiché più tipi - sia il tipo dell'istanza e il / i tipo / i dei parametri - influenzano l'implementazione del metodo, questo approccio è soprannominato "invio multiplo".
Implementate come funzioni virtuali o astratte; altri indizi includono metodi sottoposti a override, nascosti o ombreggiati.
NB: Indipendentemente dal fatto che l'overloading del metodo implichi l'invio dinamico è specifico della lingua. Ad esempio, in Java, i metodi sovraccaricati vengono inviati staticamente .
Valori
Caricamento lento : strategia di inizializzazione dell'oggetto che rimuove l'assegnazione del valore fino al necessario ; consente ad un oggetto di essere in uno stato essenzialmente valido ma consapevolmente incompleto e di attendere che i dati siano necessari prima di caricarlo; spesso trovato particolarmente utile per caricare dataset di grandi dimensioni o in attesa di risorse esterne
Spesso implementato non caricando intenzionalmente una raccolta o un elenco in un oggetto composito durante le chiamate di inizializzazione o di costruzione fino a quando un chiamante downstream chiede di vedere il contenuto di tale raccolta (ad esempio get_value_at, get_all_as, ecc.). Le varianti includono il caricamento delle meta informazioni sulla collezione (come le dimensioni o le chiavi), ma omettendo i dati reali; fornisce anche un meccanismo per alcuni runtime per fornire agli sviluppatori uno schema di implementazione singleton abbastanza sicuro ed efficiente
Caricamento Eager : strategia di inizializzazione dell'oggetto che esegue immediatamente tutte le assegnazioni di valori per avere tutti i dati necessari per essere completo prima di considerarsi in uno stato valido.
Implementato spesso fornendo un oggetto composito con tutti i dati noti il prima possibile, come durante una chiamata del costruttore o l'inizializzazione
Associazione dati : spesso comporta la creazione di un collegamento attivo o di una mappa tra due flussi di informazioni compatibili in modo che le modifiche a una siano riflesse nell'altra e viceversa; per essere compatibili, spesso devono avere un tipo di base comune, o un'interfaccia
Implementato spesso come tentativo di fornire una sincronizzazione più chiara e coerente tra i diversi aspetti applicativi (es. view-model to view, model to controller, ecc.) e parla di concetti come source e target, endpoint, binding / unbind, update, ed eventi come on_bind, on_property_change, on_explicit, on_out_of_scope
MODIFICA NOTA: Ultima modifica principale per fornire una descrizione degli esempi di come si verificano spesso. Esempi di codice particolari dipendono interamente dall'implementazione / runtime / piattaforma