Ci sono due concetti principali nella confusione: rilegatura e caricamento. È integrato dal concetto di DataBinding, che è spesso da qualche parte nel mezzo e fa entrambe le cose. Dopo averlo considerato, aggiungerò un altro concetto, per completare il trifecta, la spedizione.
tipi
Rilegatura in ritardo : il tipo è sconosciuto fino a quando la variabile non viene esercitata durante il runtime; di solito attraverso l'incarico ma ci sono altri mezzi per forzare un tipo; le lingue tipizzate dinamicamente chiamano questa una caratteristica sottostante, ma molte lingue tipizzate staticamente hanno un metodo per ottenere l'associazione tardiva
Implementato spesso utilizzando [dinamici] tipi dinamici, opzioni di introspezione / riflessione, flag e compilatore o tramite metodi virtuali prendendo in prestito ed estendendo l'invio dinamico
Early Binding : il tipo è noto prima che la variabile venga esercitata durante il runtime, di solito attraverso un mezzo statico e dichiarativo
Implementato spesso utilizzando tipi primitivi standard
funzioni
Invio statico : noto, funzione specifica o subroutine al momento della compilazione; è inequivocabile e abbinato alla firma
Implementato come funzioni statiche; nessun metodo può avere la stessa firma
Invio dinamico : non una funzione o subroutine specifica al momento della compilazione; determinato dal contesto durante l'esecuzione. Esistono due diversi approcci al "dispacciamento dinamico", distinti da quali informazioni contestuali vengono utilizzate per selezionare l'implementazione della funzione appropriata.
Nel singolo invio [ dinamico ] , solo il tipo di istanza viene utilizzato per determinare l'implementazione della funzione appropriata. Nei linguaggi tipicamente statici, ciò che 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 viene dichiarata / assegnata. Poiché viene utilizzato un solo tipo, il tipo dell'istanza dell'oggetto, per dedurre l'implementazione appropriata, questo approccio è chiamato "invio singolo".
Esiste anche un invio multiplo [ dinamico ] , in cui i tipi di parametri di input aiutano anche a determinare quale implementazione di funzione chiamare. Poiché più tipi - sia il tipo dell'istanza sia i tipi dei parametri - influenzano quale implementazione del metodo è selezionata, questo approccio è chiamato "invio multiplo".
Implementato come funzioni virtuali o astratte; altri indizi includono metodi sostituiti, nascosti o ombreggiati.
NB: se il sovraccarico del metodo comporta un invio dinamico è specifico della lingua. Ad esempio, in Java, i metodi sovraccarichi vengono inviati staticamente.
Valori
Lazy Loading : strategia di inizializzazione dell'oggetto che difende l'assegnazione del valore fino a quando necessario ; consente a un oggetto di trovarsi in uno stato sostanzialmente valido ma consapevolmente incompleto e di attendere che i dati siano necessari prima di caricarlo; spesso trovato particolarmente utile per caricare set di dati di grandi dimensioni o attendere risorse esterne
Implementato spesso non caricando intenzionalmente una raccolta o un elenco in un oggetto composito durante il costruttore o le chiamate di inizializzazione fino a quando alcuni chiamanti a valle non chiedono di vedere il contenuto di quella raccolta (es. Get_value_at, get_all_as, ecc.). Le variazioni includono il caricamento di meta informazioni sulla raccolta (come dimensioni o chiavi), ma omettendo i dati effettivi; fornisce inoltre un meccanismo ad alcuni runtime per fornire agli sviluppatori uno schema di implementazione singleton abbastanza sicuro ed efficiente
Caricamento desideroso : strategia di inizializzazione dell'oggetto che esegue immediatamente tutte le assegnazioni di valore per avere tutti i dati necessari per essere completi prima di considerarsi in uno stato valido.
Implementato spesso fornendo agli oggetti compositi tutti i loro dati noti il più presto possibile, come durante una chiamata del costruttore o l'inizializzazione
Data Binding : spesso comporta la creazione di un collegamento o una mappa attivi tra due flussi di informazioni compatibili in modo che le modifiche a uno si riflettano nell'altro e viceversa; per essere compatibili spesso devono avere un tipo di base o un'interfaccia comune
Implementato spesso come tentativo di fornire una sincronizzazione più chiara e coerente tra diversi aspetti dell'applicazione (ad esempio view-model to view, model to controller, ecc.) E parla di concetti come source e target, endpoint, bind / unbind, update ed eventi come on_bind, on_property_change, on_explicit, on_out_of_scope
NOTA EDIT: ultima modifica importante per fornire una descrizione degli esempi di come questi si verificano spesso. Particolari esempi di codice dipendono interamente dall'implementazione / runtime / piattaforma