Domanda

Molti linguaggi e framework di programmazione fanno / consentono / richiedono qualcosa per cui non riesco a trovare il nome, anche se probabilmente ce n'è uno in informatica. Ciò che fondamentalmente fanno è legarsi a una variabile / oggetto / classe / funzione per nome.

Flex esempio (" selectAll () "):

<mx:Button click="selectAll()" label="Select All"/>

Mate esempio (" price "):

<Injectors target="{QuotePanel}">
  <PropertyInjector targetKey="price" source="{QuoteManager}" sourceKey="currentPrice" />
</Injectors>

Esempio Java (" Foo "):

Class.forName("Foo")

Ci sono molti altri esempi. Ti viene l'idea. Ciò che mi preoccupa è che non c'è praticamente alcun modo per verificarlo in fase di compilazione e non molto l'IDE può fare per aiutare in termini di completamento del codice, navigazione e refactoring. Ma questo è oltre il punto.

La mia domanda è: come si chiama? Non credo sia uno di questi: associazione dinamica , nome associato , reflection

Aggiorna : No, questo non è un quiz, scusami se sembra uno di questi. È semplicemente una questione di "nominare quella canzone" per la programmazione.

Aggiorna : risposte che hanno aiutato:

  • Da Tim Lesher: si chiama "associazione in ritardo", "associazione dinamica", o "associazione in fase di esecuzione". Il fatto che si leghi a una stringa è solo un dettaglio di implementazione ...
  • Da Konrad Rudolph: ... è semplicemente un input per un interprete .

Aggiorna : come le persone hanno giustamente sottolineato, alcuni esempi sono in ritardo di associazione, alcuni sono riflessione, altri sono valutazione di runtime (interpretazione), ecc. Tuttavia, concludo che probabilmente non c'è nome che li descrive tutti. Sono solo alcuni esempi che hanno qualcosa in comune, ma non abbastanza per dargli un nome. Mi è piaciuto il " tutto è una stringa " risposta, ma anche se è divertente, non rende nemmeno pienamente giustizia.

È stato utile?

Soluzione

Si chiama "late binding", "binding dinamico", o "binding di runtime". Il fatto che si leghi a una stringa è solo un dettaglio dell'implementazione, anche se implica che la mappatura da stringa a simbolo esiste in fase di esecuzione (che alcuni linguaggi, come c ++, non forniscono).

" introspezione " o "riflesso", d'altra parte, si riferiscono alla capacità di scoprire quali interfacce, metodi o attributi implementano un oggetto in fase di esecuzione.

È vero che i simboli associati in modo dinamico non possono essere verificati prima dell'esecuzione; questo è ciò che li rende diversi dai simboli associati staticamente.

Altri suggerimenti

Rilegatura in ritardo

Cosa ti fa pensare che Class.forName non sia riflessione?

Riflessione

La cosa flessibile può essere definita come associazione tardiva, se funziona come un normale HTML. Finché l'utente non fa clic sul pulsante, il runtime non si preoccupa di scoprire se la funzione esiste o meno. La seconda cosa è l'iniezione di dipendenza, che coinvolge i puntatori di funzione (tramite le interfacce) e la riflessione. Quello java è sicuramente una riflessione.

Penso che potresti non essere stato in grado di esprimere correttamente la tua domanda o di aver scelto cattivi esempi per illustrare il tuo pensiero.

Rilegatura in ritardo?

Il secondo e il terzo esempio sono esempi di riflessione o associazione tardiva, ma il primo non lo è.

<mx:Button click="selectAll()" label="Select All"/>

Viene riscritto come ActionScript prima della compilazione, con la parte selectAll () inserita in una funzione del gestore eventi. Qualcosa del genere (il modo in cui viene fatto esattamente può essere verificato aggiungendo -keep-generated-actionscript ai flag del compilatore):

_button1 = new Button();
_button1.label = "Select All";
_button1.addEventListener("click", function( event : Event ) : void {
    selectAll();
});

Il compilatore determina se gli attributi sono eventi, stili o proprietà, ma poiché ciò viene fatto in fase di compilazione non è riflessione. La riflessione, per definizione, viene eseguita in fase di esecuzione.

Penso che si possa sostenere che il secondo e il terzo esempio sono una riflessione, ma anche che sono esempi di associazione tardiva. Nessuno di loro in realtà determina le capacità degli oggetti su cui lavorano, quindi in questo modo non sono riflessi. Tuttavia, direi che il termine "riflessione" è molto spesso usato in senso lato per indicare qualsiasi cosa che chiama metodi i cui nomi sono determinati in fase di esecuzione o crea oggetti da classi denominate solo in fase di esecuzione. Se vuoi essere preciso "in ritardo di rilegatura" è probabilmente la risposta più corretta, ma penso che "riflesso" è abbastanza buono.

" introspezione " ?

Suppongo che il codice Flex che ci hai mostrato usi semplicemente l'invocazione di ActionScript, nel qual caso l'attributo click sarebbe semplicemente eval 'd dall'interprete del documento Flex. Pertanto, non esiste una magia speciale dietro questo tipo di codice, è semplicemente un input per un interprete.

Penso che l'esempio Flex non sia esattamente lo stesso di quello di Java (non conosco le altre cose). L'esempio Java è chiaramente qualcosa che definirei late binding , poiché il caricatore di classi risolve il nome della classe in fase di esecuzione, il momento più recente possibile per farlo.

Flex MXML è principalmente un'altra sintassi, che alla fine viene compilata in qualcosa che avresti potuto anche scrivere in ActionScript. Per quanto ne so, la funzione mx: Button e la funzione selectAll () sono risolti al momento della compilazione . Almeno mxmlc dà errori se si usa un simbolo indefinito lì.

C'è uno scenario in cui il compilatore può aiutare questo ... Generazione di codice.

Se il tipo di variabile non è noto fino al runtime, allora è in ritardo il binding. Se il tipo di variabile è noto al momento della compilazione, allora è associazione anticipata.

Intellisense, completamento del codice e tutte le altre funzionalità IDE di cui parli sono disponibili solo sulle variabili associate anticipatamente.

Odora come un puntatore a funzione per me.

L'esempio Java che hai fornito si chiama Dynamic Class Loading. Non sono sicuro che gli altri esempi siano la stessa cosa. Ma questo è utile in riflessione. Forse stai cercando il modello di progettazione chiamato Inversion of control.

Nel mondo .NET chiamiamo questo databinding, e ha gestito usando la riflessione.

Mi ricorda fortemente anche l'iniezione di dipendenza.

Il primo esempio è un esempio di come un XML con spaziatura dei nomi può assumere significati nel tempo di compilazione, Il secondo è un'iniezione di database / dipendenza Il terzo esempio è Reflection, se dovessi etichettare tutti questi 3 esempi con un nome penso che andrò per " Sintassi "

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top