Comprendere le ramificazioni del codice scritto a Duck

Comprendere le ramificazioni del codice scritto a Duck

  

Problema Si vuole capire dove digitando anatra miglior utilizzo e problematiche che devono essere consapevoli del momento di usarlo. Teoria non vi è una differenza tra una valore del tipo e un Tipo di riferimento in JavaScript. Anche per un tipo di riferimento, c'è una differenza tra la definizione di riferimento come un valore o un riferimento puro. Ma si dovrebbe anche preoccuparsi la differenza? È qualcosa che è necessario essere a conoscenza? È quando si sta cercando di fare qualcosa di specifico. JavaScript è un linguaggio unico che ha il tipo di anatra, di tipo latente, e le caratteristiche del prototipo. Per creare un tipo in JavaScript, è possibile definire il tipo tramite una definizione di prototipo, oppure è possibile definire i metodi e le proprietà da assegnare un'istanza di classe. In generale, si avrà la possibilità di legare insieme in modo dinamico i tipi a runtime. Ci sono due modi per implementare digitando duck: i tipi di valore e tipi di riferimento. È necessario essere consapevoli di entrambi i tipi, anche se in questo articolo Imostly utilizzare il valore della tipizzazione anatra tipo. Non sto dicendo che uno è migliore dell'altro, solo che ognuno ha vantaggi e svantaggi. Gli sviluppatori tendono a scegliere l'una o l'altra in base alle loro abitudini di programmazione. Ad esempio, io preferisco anatra valore di battitura, perché tendo a serializzare gli oggetti per un utilizzo successivo. Solution Let's go attraverso un esempio di anatra con digitando i valori di riferimento. Si consideri il seguente codice, che viene utilizzato per creare una funzione senza parametri che contiene uno stato.

 Fonte: / client / ajaxrestrecipes / javascript / valuevsreferencetypes.js funzione CallMeReference (toCall, value) (return function () (toCall (value);))

Nel codice precedente, la funzione CallMeReference dispone di due parametri: toCall, che è una funzione, e il valore, che è stato utilizzato per chiamare la funzione toCall. L'idea alla base CallMeReference è quello di creare una funzione che non ha parametri, ma è chiamato con uno stato definito in precedenza. Il seguente codice può essere utilizzato per eseguire un esempio:

var func = CallMeReference (function (param) (info ( "param è (" + param + ")");), "Ciao Mondo"); func ();

In questo esempio, la variabile func viene utilizzato per generare un incapsulato "ciao messaggio" mondo. La variabile funzione può essere chiamato più volte, e lo stesso messaggio viene generato. La variabile potrebbe essere assegnato ad altre variabili e lo stesso messaggio sarebbe generato. Dato che siamo programmatori, potremo creare le funzioni che seguono lo schema Builder e precreate funzioni con certi stati. Le seguenti due funzioni attuare il modello Builder:

Version1Reference function () (return CallMeReference (function (param) (info ( "Ver 1 (" + param + ")");), ➥ "Ciao Mondo");) Version2Reference function () (return CallMeReference (function (param ) (info ( "Ver 2 è (" + param + ")");), ➥ "Ciao Mondo");)

Il Version1Reference e le funzioni Version2Reference generare funzioni con lievi differenze. Le funzioni risultanti generate possono essere assegnati a variabili e che allora si chiamava come nell'esempio precedente. Fino a questo punto, tutto quello che ho mostrato è qualcosa che si potrebbe fare usando linguaggi di programmazione tradizionali come C #, Java e C + +. Qui, comunque, stiamo usando JavaScript, che implementa digitando anatra e prototipi basati su caratteristiche, il che significa che se una funzione è assegnato a una variabile, non sappiamo come tale cessione è accaduto. Questo bisogno di sapere chi ha fatto cosa assegnazione non importa in C + +, C # o Java, in quanto il programmatore definito l'ordine e la disposizione dei tipi prima del tempo, e durante l'esecuzione che l'ordine non può essere cambiato. In JavaScript, che l'ordine non è definito prima del tempo esso è definito in fase di runtime. Ad esempio, il seguente codice è possibile:

if (flag) (func = Version1Reference ();) else (= Version2Reference func ();)

Func quando è stato assegnato, non si sa se è stato assegnato utilizzando il codice da Version1Reference o da Version2Reference. Quando il codice assegnato viene eseguito, si può logicamente da determinare il comportamento se la Version1Reference o funzione Version2Reference è stato utilizzato. Il motivo per cui dico che non si sa quale codice è stato assegnato è perché quando si serializzare la funzione variabile, il seguente codice viene generato:

function () (toCall (value);)

Il codice generato ti dice che le variabili toCall e il valore è stato assegnato, ma non sai a che cosa. Questo può diventare un problema se si tenta di serializzare un oggetto che fa riferimento alla funzione generato. Se si serializzare la funzione e si tenta di eseguire la funzione, un errore sarebbe generato perché le variabili toCall e il valore non verrebbe definito. È possibile serializzare lo stato dei membri di dati, ma serializzare i metodi cause di essere stato lost.For esempio, immaginate di scrivere una domanda di mutuo, e si sta creando un client.

Il cliente ha una certa età, indirizzo, e il profilo. In un ambiente di programmazione tradizionale, che si sarebbe associato con lo stato di un oggetto ogni volta che è stato caricato. Ciò significa che ogni volta che lo Stato è caricato, è necessario eseguire varie implementazioni pattern Builder per creare il tipo di oggetto. Utilizzo di JavaScript, questo non è necessario perché lo stato dell'oggetto, compresi i metodi, potrebbe essere serializzato. Questo rende possibile per serializzare un oggetto completo, memorizzare in un database, o eseguirlo in un altro contesto. Funzioni dinamiche necessità di utilizzare i tipi di valore, il che significa CallMeReference deve essere modificato come segue:

funzione CallMeValue (toCall, valore) (return eval ( "function () (var func =" + ➥ toCall.toString () + "; func ( '" + Value.ToString () + "');)");)

La funzione CallMeValue è come CallMeReference, tranne che serializza la funzione e il valore di buffer di stringa che sono concatenati e giustiziato. Il risultato dell'esecuzione è una funzione che, quando serializzato genera il buffer seguenti:

function () (var func = (function (param) (info ( "param è (" + param + ")");}); ➥ func ( "ciao mondo");)

La funzione serializzato si comporta esattamente come la funzione creata in CallMeReference, ma la funzione valore può essere serializzato ed eseguito su un altro computer o in un altro contesto. Durante la scrittura di codice che il codice in modo dinamico i fili insieme, è necessario pensare a se usare o il valore di riferimento di programmazione tecniche. Durante la scrittura di tale codice, considerare le seguenti regole empiriche:

• tipi di anatre di riferimento devono essere considerati come tipi transitoria che vivono solo per l'entità della esecuzione di JavaScript (ad esempio, una pagina HTML).

• tipi di anatre di riferimento sono creati utilizzando il modello Builder.

• Una volta creati, i tipi di anatre di riferimento hanno un leggero vantaggio di prestazioni, in quanto non hanno bisogno di dover eseguire l'istruzione eval per l'attuazione del modello Builder.

• tipi di anatre di riferimento possono condividere le istanze con le istanze di oggetto di più, perché si stanno assegnando i riferimenti.

• tipi di anatra valore deve essere considerato a lungo termine degli oggetti serializzabili in cui lo stato e il codice può essere serializzato.

• tipi di anatra Rapporto vengono creati utilizzando il modello Builder.

• tipi di anatra Rapporto sono leggermente più lento rispetto a quelle di anatra di riferimento perché il codice è il risultato di serializzazione, la costruzione di un buffer, e quindi la valutazione del buffer.

• tipi di anatra Rapporto non hanno l'effetto collaterale di avere funzioni si comportano in modo irregolare a causa delle istanze di oggetti assegnato. Ogni chiamata a un valore di tipo anatra risultati pattern Builder in un ambiente pulito approccio di ardesia, in cui le variabili sono assegnate lo stato dato al modello Builder.

un articolo presentato da Sonja Lande


Disclaimer:Il nostro sito non è responsabile per il contenuto di questo articolo. Webarticles è una risorsa gratuita di informazioni.
Importante: Questo articolo "Capire le ramificazioni di Duck codice scritto" è stato tradotto da un software automatico. Ci dispiace per eventuali errori di ortografia che possono essersi verificati. Grazie per la vostra comprensione.


Online: 406 users browsing the articles directory