Come si utilizza la digitazione anatra in javascript senza sempre verificare proprietà e metodi?
Semplice: non sempre verificare proprietà e metodi.
In Ruby, quello che stai chiamando si chiama "tipizzazione di pollo". In un linguaggio digitato dinamicamente da papera, ti fidi semplicemente che il chiamante ti passa un oggetto adatto. È compito del chiamante onorare la sua parte del contratto.
So che JavaScript utilizza la tipizzazione duck e all'inizio ho pensato che questo avrebbe reso il polimorfismo facile rispetto a linguaggi fortemente tipizzati come C #.
Qui stai confondendo più assi ortogonali di battitura. Esistono quattro assi ortogonali di battitura:
- Quando : digitazione dinamica (i tipi non sono noti e controllati fino al runtime) rispetto alla digitazione statica (i tipi sono noti e controllati prima del runtime)
- Cosa : digitazione anatra (i tipi si basano sul comportamento ), tipizzazione strutturale (i tipi si basano sulla struttura ) e tipizzazione nominale (i tipi si basano sul nome )
- Li vedi? digitazione esplicita (i tipi devono essere esplicitamente annotati) vs. digitazione implicita (i tipi sono dedotti)
- digitazione forte vs. digitazione debole - potresti aver notato che non ho dato a questo un titolo accattivante né una spiegazione tra parentesi, perché a differenza dei sette termini sopra, che hanno ciascuno una definizione precisa accettata universalmente, questi due termini hanno circa una dozzina di definizioni vaghe semi-ampiamente usate che si contraddicono a vicenda; idealmente dovresti evitare del tutto questi termini e, se devi usarli, definiscili prima
Dal momento che hai citato C #: è tipicamente tipicamente statico, ma supporta la tipizzazione dinamica attraverso il tipo dynamic
, è principalmente tipicamente nominale, ma i tipi anonimi usano la digitazione strutturale e i modelli sintattici (come la sintassi di comprensione delle query LINQ) possono essere argomentati come anatra di tipo o tipicamente strutturato, è per lo più tipizzato in modo esplicito ma supporta la tipizzazione implicita per argomenti di tipo generico e variabili locali (anche se il caso della variabile locale è piuttosto strano rispetto alla maggior parte delle altre lingue, perché non puoi semplicemente lasciare il tipo fuori, invece devi dagli uno pseudo-tipo esplicitovar
, in altre parole, se si desidera un tipo implicito, è necessario dirlo esplicitamente). Il fatto che C # sia tipizzato in modo forte o debole è una questione di quale definizione dei due termini utilizzati, tuttavia, si noti che ci possono essere molti errori di runtime in C #, soprattutto a causa della covarianza di array non sicura.
So che non potrei semplicemente controllare, ma rintracciare gli errori di runtime javascript può essere un incubo poiché non sempre si verificano dove l'errore si sta effettivamente verificando nel codice.
Il debug non è un'abilità facile da imparare. Esistono, tuttavia, tecniche per facilitare il debug, ad esempio Saff Squeeze è una tecnica descritta da Kent Beck che utilizza test e refactoring per il debug:
Test di regressione e Saff Squeeze
Kent Beck, Three Rivers Institute
Riassunto: per isolare efficacemente un difetto, iniziare con un test a livello di sistema e progressivamente in linea e potare fino ad avere il test più piccolo possibile che dimostri il difetto.