In Struttura e interpretazione dei linguaggi di programmazione Seconda edizione (SICP) a pagina 182, gli autori introducono il concetto dimessaggio che passa con il seguente esempio in Schema di una funzione complessa costruttore numero.
(Define (make-da-real-imag xy) (define (invio op) (cond ((eq? Op 'real-parte) x) ((eq? Op' imag-parte) y) ((eq? Op ' magnitudo) (sqrt (+ (piazza x) (piazza y)))) (angolo (eq op ') (atan yx)) (altro (errore "Uknown op - MAKE-DA-REAL-IMAG"? op)) )) spedizione)
La cosa importante da notare qui è che il valore restituito dal make-da-real-imag
funzione di costruzione è in realtà una procedura di spedizione che è possibile chiamare con un argomento del messaggio. È possibile inviare messaggi per ottenere la parte reale e la portata dei numeri complessi.
(Definire c (make-da-real-imag 3 4)) (c 'real-parte), 3 (c' imag-parte), 4 (c 'grandezza), 5 (c' angolo); 0,927295218001612 (c ' asdf); ERRORE: Uknown op - MAKE-DA-REAL-IMAG: asdf
Vediamo quello che il codice sopra appare così in JavaScript, la nostralingua franca .
makeFromRealImag funzione (x, y) {funzione spedizione (op) {switch (op) 'realPart' {caso: x ritorno; caso 'imagPart': y ritorno; 'grandezza' caso: return Math.sqrt (x * x + y * y); caso 'angolo': return Math.atan2 (y, x); default: 'op Sconosciuto - makeFromRealImag:' gettare op +;}} spedizione di ritorno;} var c = makeFromRealImag (3, 4); c ('realPart'); / / 3 c ('imagPart'); / / 4 c ('magnitudo'); / / 5 c ('angolo'); / / 0,9272952180016122 c ('asdf'); / / "Sconosciuto op - makeFromRealImag: asdf "
Ora, questo probabilmente non assomiglia a nessun orientato agli oggetti JavaScript che avete visto prima ma illustra un punto importante. In JavaScript, possiamo rappresentare l'idea di un oggetto in funzione dei suoi messaggi. La funzione di costruzione restituisce una funzione di spedizione che hai scritto che può inviare qualsiasi messaggio alcun modo che si desidera. Questo dà immediatamente Spidermonkey di __nosuchmethod__
, Smalltalk è doesNotUnderstand
, e Ruby method_missing
. Roba potente ma purtroppo il codice JavaScript corre sopra molto lentamente.Siamo in grado di muoversi verso uno stile JavaScript più veloce e più familiare.
SICP pagina 223, introduce l'idea di oggetti mutabili, ma il punto più interessante è la variazione della procedura di spedizione.
(Define (make-saldo) (define (prelevare quantità) (if (> = importo equilibrio) (begin (equilibrio set! (- ammontare del bilancio) l'equilibrio)) "fondi insufficienti")) (define (importo del versamento) (set ! saldo (saldo + somma)) equilibrio) (define (invio m) (cond ((eq m? 'recedere) ritirare) ((eq m?' deposito) di deposito) (il resto (errore "Richiesta sconosciuta - MAKE-CONTO "m)))) spedizione) (definire conto (make-conto 10)) ((conto 'deposito) 5), 15 ((conto' recedere) 3), 12
Conversione questo a JavaScript abbiamo le seguenti.
funzione makeAccount (saldo) {funzione ritirare (importo) {if (saldo> = importo) {Bilancia = - importo; equilibrio di ritorno;} return "fondi insufficienti";} deposito funzione (importo) {= saldo + importo; ritorno bilancio;} function spedizione (m) {switch (m) {case 'ritirare': ritorno recesso; 'deposito' caso: cauzione di ritorno; default: buttare "richiesta Sconosciuto - makeAccount:" + m;}} spedizione di ritorno;} var = conto makeAccount (10); conto ('deposito') (5); / / 15 account ('ritirare') (3); / / 12
Il modo in cui la spedizione
funzione funziona per gli account è molto diversa che nel caso dei numeri complessi. Nel caso dei numeri complessi, quando un messaggio è stato inviato alla spedizione
funzione, eseguita l'operazione associata (cioè il metodo) immediatamente. Al contrario, l'account spedizione
funzione restituisce il metodo associato al messaggio e che il metodo può essere chiamato.
Questo è molto simile a come JavaScript reciever.message (arg)
opere sintassi e possiamo passare ad un più familiare stile orientato agli oggetti JavaScript.
funzione makeAccount (saldo) {funzione ritirare (importo) {if (saldo> = importo) {Bilancia = - importo; equilibrio di ritorno;} return "fondi insufficienti";} deposito funzione (importo) {= saldo + importo; ritorno bilancio;} {ritirare ritorno: ritiro, deposito: deposito};} conto var = makeAccount (10); account.deposit (5); / / 15 account.withdraw (3); / / 12
In quest'ultima versione, abbiamo smesso di scrivere la nostra logica spedizione e l'uso di JavaScript proprietà incorporata ricerca. Questo aumenta la velocità in modo significativo. Abbiamo perso la capacità di fare il __noSuchMethod__
tipo di invio quando si utilizzano standard ECMAScript, ma che non sembra essere comunemente utile comunque.
Per il bene leggere i programmatori JavaScript là fuori, si può riconoscere questa ultima versione di oggetti durevoli dal libro di Douglas CrockfordJavaScript: le parti buone .
Trovo interessante che il "eredità" la parola non appare nell'indice SICP è anche se il libro va avanti per attuare programmi complessi come interpreti e compilatori in uno stile di scambio di messaggi. Ciò dimostra questo stile semplice di programmazione orientata agli oggetti si può prendere lontano.
Corso Java - Corsi Java - Corsi programmazione Java
Nessun commento:
Posta un commento
Nota. Solo i membri di questo blog possono postare un commento.