I linguaggi tipizzati in modo statico come Java offrono il vantaggio del controllo in fase di compilazione dei tipi: si garantisce che un oggetto sia di un determinato tipo, quindi:
- non è necessario spendere tempo e risorse per studiare il TYPE di una variabile o parametro, perché non sappiamo se questo è un
None
,List[string]
, o solo unstring
- non ci sono errori di tipo runtime di questo modulo
- non c'è da preoccuparsi per gli errori nell'uso delle convenzioni (ad esempio
intPhoneNumber
modificato in una stringa, ma ha dimenticato di cambiare il nome instrPhoneNumber
)
Ci sono probabilmente altri punti che non ho menzionato. Ma l'idea generale è che ci sia meno carico cognitivo sul programmatore e se ci sono ipotesi errate, il feedback viene immediatamente fornito sotto forma di una compilazione fallita - e il feedback immediato è esattamente uno dei fattori vincenti del test unitario.
Duck-typing d'altra parte non si preoccupa del tipo esplicito di un oggetto - finché l'oggetto ha gli attributi rilevanti (membri di dati e funzioni), il programma può andare avanti. Se l'oggetto ha una funzione con lo stesso nome di quanto richiesto da una parte di codice, il codice tenterà di utilizzare la funzione, anche se l'implementazione è inaspettatamente diversa. Se l'oggetto non ha gli attributi richiesti, il programma si blocca. Il vantaggio è una riduzione del codice: nessuna definizione di interfaccia è necessaria in un linguaggio di digitazione anatra.
Come descritto sopra, uno scenario così inaspettato può essere rilevato solo in fase di runtime. Ma un linguaggio tipizzato staticamente potrebbe prendere una tale discrepanza in fase di compilazione. A meno che una robusta suite di test delle unità non sia configurata con una copertura del 100% percorso , è possibile che tale errore di base (e non prevenibile) (mancata corrispondenza del tipo) non venga rispettato. E sappiamo che è molto difficile per una serie di motivi raggiungere una percentuale così alta di copertura del codice, per non parlare della copertura del codice di percorso.
Quindi:
- Gli "svantaggi" della tipizzazione statica, ovvero il codice più dettagliato, non sarebbero superati di gran lunga dai vantaggi della sua spinta intrinseca all'affidabilità del software?
- Da un punto di vista dell'affidabilità del software di produzione, c'è un qualsiasi vantaggio nell'uso delle lingue con tali funzioni?
- O è semplicemente che tali linguaggi non dovrebbero essere utilizzati per la produzione (anche se sono in molti, molti casi)?