How do you use duck typing in javascript without always checking for properties and methods?
Semplice: non sempre controlli proprietà e metodi.
In Ruby, ciò che chiamate è chiamato "digitazione di un pollo". In un linguaggio con dattilografia dinamica, ti basta credere che il chiamante ti passi un oggetto adatto. È compito del chiamante onorare la sua parte del contratto.
I know javascript uses duck typing and at first I thought this would make polymorphism easy compared to strongly typed languages like C#.
Stai confondendo più assi ortogonali di digitazione qui. Ci sono quattro assi ortogonali di battitura:
-
Quando : digitazione dinamica (i tipi non sono conosciuti e controllati fino al runtime) rispetto alla tipizzazione statica (i tipi sono conosciuti e controllati prima del runtime)
-
Cosa : digitazione anatra (i tipi sono basati su comportamento ), tipizzazione strutturale (i tipi sono basati su struttura ) e digitazione nominale (i tipi sono basati su nome )
-
Puoi vederli? digitando esplicitamente (i tipi devono essere esplicitamente annotati) rispetto alla tipizzazione implicita (i tipi sono dedotti)
- strong tipizzazione vs. debole digitazione - potreste 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 singola definizione precisa universalmente accettata, questi due termini hanno una dozzina di definizioni vagamente semi-ampiamente usate che si contraddicono a vicenda; idealmente dovresti evitare del tutto questi termini e, se devi usarli, definirli con precisione prima
Dato che hai citato C #: è tipicamente tipizzato in modo statico, ma supporta la digitazione dinamica attraverso il tipo dynamic
, è tipicamente tipizzato nominalmente, ma i tipi anonimi usano la tipizzazione strutturale e i pattern sintattici (come la sintassi di comprensione delle query LINQ) possono essere argomentato o digitato an tipicamente o tipicamente, è tipicamente tipizzato in modo esplicito ma supporta la digitazione implicita per argomenti di tipo generico e variabili locali (sebbene il caso variabile locale sia piuttosto strano rispetto alla maggior parte delle altre lingue, perché non si può semplicemente lasciare il tipo fuori, devi invece dargli un pseudo-tipo% di var
, in altre parole, se vuoi un tipo implicito, devi dirlo esplicitamente). Indipendentemente dal fatto che C # sia strongmente o debolmente tipizzato è una questione di quale definizione dei due termini che si usano, tuttavia, si noti che ci possono essere molti errori di tipo runtime in C #, specialmente a causa della covarianza dell'array non sicuro.
I know I could just not check, but tracking down javascript run time errors can be a nightmare since they don't always happen where the error is actually occurring in the code.
Il debug non è un'abilità facile da imparare. Esistono tuttavia tecniche per facilitare il debugging, ad es. il Saff Squeeze è una tecnica descritta da Kent Beck che utilizza test e refactoring per il debugging:
Regression Testing and the Saff Squeeze
Kent Beck, Three Rivers Institute
Abstract: To effectively isolate a defect, start with a system-level test and progressively inline and prune until you have the smallest possible test that demonstrates the defect.