Sì, la sicurezza del tipo porta a un codice più robusto. Ma a quale costo?
Non trovi mai tutti i bug nei test. Prima si trova un bug, meno costoso è da risolvere (meno persone coinvolte, meno comunicazioni, ecc.). Il modo più economico per correggere un bug è far sì che la lingua o il compilatore impediscano che accada.
Ho avuto un cliente che aveva una scommessa permanente da oltre un anno, offrendo un hamburger gratuito per trovare un bug reale nel mio codice. La sicurezza del tipo ha contribuito a rendere possibile ciò.
In generale, compilatori o linguaggi che impediscono bug sono una buona cosa, ma può essere portata all'estremo. XSLT non ti consente di aggiornare il valore di una variabile. Di conseguenza, devi ricorrere alla ricorsione per creare un ciclo semplice (sto scrivendo questo in pig-java / pig-C perché XSLT ha una sintassi terribile che non riesco a ricordare):
function sumList(x) {
if (x.length > 1) {
return sumList(x.tail) + x.head;
} else {
return x.head;
}
}
Ci sono vantaggi a questo approccio (pochi effetti collaterali), ma ciò impone anche la frammentazione del codice in cui tutti i tipi di cose sono stati suddivisi in piccole funzioni separate. È stato difficile evitare di fare cose più volte, e questo ha portato a tutti i tipi di altri bug e alle prestazioni lente che erano peggiori di una modifica accidentale del valore di una variabile.
Torna a digitare sicurezza. Di solito, se ho una funzione washFabric (Fabric f) e ho passato una Cat invece che una Fabric, questo è un semplice errore da parte mia. Quando hai questo nascosto in strati di chiamate di funzione, un tale errore è molto facile da fare e difficile da testare. Quando il mio codice viene compilato in un linguaggio sicuro per il tipo, so che non ho fatto questo tipo di errore. Per questo motivo, trovo che la sicurezza del tipo sia un buon compromesso tra la velocità di dare uno schiaffo a qualcosa che funziona e che non si romperà.
La sicurezza del tipo ti rallenta. In Ruby o perl, puoi creare un metodo di lavaggio (f) e gettare un gatto nel lavaggio e il gatto esce pulito, o morto, o ancora sporco. Ma in Java, devi creare un'interfaccia Washable e definire meticolosamente metodi come soak (), addSoap (), agitate (), spin () e risciacquo () e pensare a cosa significa essere lavabile in modo che qualcuno possa creare un gatto la classe può studiare l'interfaccia Washable e decidere se un gatto dovrebbe essere lavabile o meno. Ciò richiede molto tempo e impegno.
Se vuoi un rapporto di utilizzo singolo scritto in un'ora, digita la sicurezza ti rallenterà. Ma se hai un gruppo di programmatori che lavorano su un enorme sistema che durerà per anni e deve essere molto tollerante ai guasti, allora puoi fare leva sulla sicurezza del tipo dalle mie fredde mani. : -)