{"id":641,"date":"2014-07-08T22:13:39","date_gmt":"2014-07-08T20:13:39","guid":{"rendered":"http:\/\/www.ilbytecidio.it\/?p=641"},"modified":"2014-07-08T22:26:56","modified_gmt":"2014-07-08T20:26:56","slug":"dichiarazione-implicita-e-tipizzazione-debole-gli-svantaggi","status":"publish","type":"post","link":"https:\/\/www.ilbytecidio.it\/?p=641","title":{"rendered":"Dichiarazione implicita e tipizzazione debole: gli svantaggi"},"content":{"rendered":"<p>Ieri chiacchieravo col mio amico <a href=\"http:\/\/blog.csdn.net\/redcapcoder\" target=\"_blank\">Simon<\/a>\u00a0riguardo ai linguaggi di scripting e gli ho detto che le loro peculiarit\u00e0 che mi piacciono meno sono appunto quelle in oggetto. Ho deciso di descrivere il perch\u00e9 (e di rispondere alla sua domanda) in quest&#8217;articolo per unire l&#8217;utile al dilettevole. Si tratta naturalmente del mio parere personale, condivisibile o meno. Per gli esempi pratici far\u00f2 riferimento a C++ e JavaScript, ma non sar\u00e0 necessario conoscere bene questi linguaggi per capire.<\/p>\n<p><!--more-->Vediamo innanzitutto di chiarire le ambiguit\u00e0. Prima di utilizzare una variabile in C++ dobbiamo scrivere una riga come<\/p>\n<pre lang=\"c++\">int numero;<\/pre>\n<p>e questa riga dice al compilatore che deve riservare al programma lo spazio per un numero intero, al quale ci riferiremo con la parola <em>numero<\/em>. In JavaScript non abbiamo bisogno di fare ci\u00f2: basta utilizzare la parola numero dove ci occorre per salvare degli interi, ad esempio scrivendo<\/p>\n<pre lang=\"javascript\">numero = 5;<\/pre>\n<p>e il gioco \u00e8 fatto. Questo \u00e8 quello che intendo per <strong>dichiarazione implicita<\/strong>. I pi\u00f9 attenti avranno anche notato che in C++ abbiamo detto di volere specificatamente un numero intero. Infatti un&#8217;istruzione come<\/p>\n<pre lang=\"c++\">numero = \"Ciao mondo\";<\/pre>\n<p>non verr\u00e0 accettata dal compilatore, che rifiuter\u00e0 di proseguire il proprio lavoro, se\u00a0<em>numero<\/em>\u00a0\u00e8 dichiarata come int. Tale istruzione, viceversa, \u00e8 perfettamente lecita in JavaScript, qualsiasi sia il precedente valore assegnato alla variabile. Nessuno ci impedisce di assegnarle un valore di diverso tipo. Questo \u00e8 ci\u00f2 che intendo per <strong>tipizzazione debole<\/strong>. Si noti che se tale controllo sui tipi venga fatta a tempo di compilazione (quando applicabile) o di esecuzione ai fini di questo articolo non ha alcuna importanza. Quello che conta \u00e8 che in C++ dobbiamo dire esplicitamente di che tipo \u00e8 la nostra variabile, mentre Javascript lo riconosce in automatico ogni volta che assegnamo un valore.<\/p>\n<p>I vantaggi di queste due qualit\u00e0 sono evidenti: il linguaggio \u00e8 pi\u00f9 semplice ed intuitivo perch\u00e9 si occupa di un sacco di compiti sgraditi, di conseguenza scriveremo meno codice e pi\u00f9 velocemente. Purtroppo per\u00f2 ci sono tanti svantaggi. Tanti, a mio parere, da superare i vantaggi. Vediamoli uno per uno:<\/p>\n<ol>\n<li><span style=\"line-height: 15px;\"><strong>Errori di battitura.<\/strong><br \/>\nSe non dobbiamo dichiarare una variabile, qualsiasi nome utilizziamo durante il codice \u00e8 lecito. Confondere le parole <em>nuemro<\/em> e <em>numero<\/em> \u00e8 molto, molto facile. Javascript a volte ci viene in aiuto dicendoci che una variabile \u00e8 <em>undefined<\/em>, ma se commettiamo un errore in un assegnamento gli effetti possono essere imprevedibili. Potremmo perdere molto tempo su un bug di questo genere, mentre con altri linguaggi semplicemente non ne abbiamo la possibilit\u00e0.<\/span><\/li>\n<li><strong>Cosa succede quando il codice cresce?<\/strong><br \/>\nIl codice non dovrebbe crescere tanto, dovremmo dividerlo in tanti moduli, \u00e8 vero. Ma immaginiamo di aggiungere un blocco di codice nel mezzo di un file esistente. Se non siamo costretti a dichiarare le variabili pu\u00f2 capitare di sovrascrivere un valore che serve al codice sottostante. Anche qui possono crearsi bug difficili da risolvere.<\/li>\n<li><strong>Confronti<\/strong><br \/>\nConsideriamo il seguente frammento di codice<\/p>\n<pre lang=\"c++\">numero = fetchValue('SELECT numero FROM tabella');\r\nif (numero == 2.5)\r\n  print('Ho letto 2,5!');<\/pre>\n<p>Se la tipizzazione \u00e8 debole, diventa difficile sapere se la nostra funzione fetchValue restituir\u00e0 un numero o una stringa. Ok, tanti linguaggi sono abbastanza intelligenti da restituire true se confrontiamo &#8220;2.5&#8221; con 2.5, ma questo vale sempre? Cosa succede se confrontiamo 5 con &#8220;5.0&#8221;, ecc? Difficile ricordare tutte queste regole, facile sbagliarsi! Cosa succede se la nuova versione della nostra libreria all&#8217;improvviso restituisce stringhe e non pi\u00f9 interi? Stampando a video il valore ci sembrer\u00e0 che tutto va bene, ma il nostro confronto potrebbe fallire e, tanto per cambiare, generare bug difficili da scovare!<\/li>\n<li><strong>Spreco di spazio<\/strong><br \/>\nNiente \u00e8 gratis! Perch\u00e9 il tipo di una variabile possa cambiare a tempo di esecuzione, devono essere tenuti pi\u00f9 dati in memoria. Per esempio potrebbero essere necessari byte extra che dicano se la variabile \u00e8 un intero, un carattere, ecc. Direte: non \u00e8 grave, c&#8217;\u00e8 tanta memoria ed \u00e8 lo stesso con gli oggetti per permettere ereditariet\u00e0, polimorfismo e molto altro. Per cominciare, la memoria non \u00e8 MAI abbastanza e poi il totale fa presto a crescere, se per esempio abbiamo un array di oggetti con diversi campi!<\/li>\n<li><strong>Spreco di tempo<\/strong><br \/>\nPerch\u00e9 il linguaggio sia cos\u00ec comodo, deve esserci un sacco di codice che effettua controlli a tempo di esecuzione. Se confrontiamo 2.5 con &#8220;2.5&#8221; entrambi i valori devono essere controllati ed eventualmente convertiti nel tipo giusto prima che il controllo vero e proprio sia effettuato. Questo, anche se spesso non si nota, spreca cicli di CPU e rallenta l&#8217;esecuzione. In C++ ed altri linguaggi siamo costretti a scrivere il codice in modo pi\u00f9 rigoroso. Questo sar\u00e0 seccante, ma la qualit\u00e0 alla fine \u00e8 migliore e il programma pi\u00f9 veloce.<\/li>\n<li><strong>Meno attenzione<\/strong><br \/>\nPer finire, prestare attenzione alla scelta dei tipi di dato giusti ci aiuta a ragionare meglio sul problema da risolvere, oltre che a scrivere un software di qualit\u00e0 superiore, ottimizzato nella complessit\u00e0 spaziale e computazionale. Non a caso, Pascal fu concepito proprio per questo e la dichiarazione delle variabili \u00e8 la primissima cosa da fare quando si scrive qualsiasi (sotto)programma. Qualche maligno obietter\u00e0 che pochi usano Pascal oggigiorno, ma a parte che personalmente non capisco l&#8217;astio che molti hanno nei suoi confronti, \u00e8 in effetti ancora utilizzato e non solo a scopo didattico!<\/li>\n<\/ol>\n<p>Ecco qui, il mio parere ve lo dato. Fatemi sapere se siete d&#8217;accordo!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ieri chiacchieravo col mio amico Simon\u00a0riguardo ai linguaggi di scripting e gli ho detto che le loro peculiarit\u00e0 che mi piacciono meno sono appunto quelle in oggetto. Ho deciso di descrivere il perch\u00e9 (e di rispondere alla sua domanda) in &hellip; <a href=\"https:\/\/www.ilbytecidio.it\/?p=641\">Continua a leggere<span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[],"class_list":["post-641","post","type-post","status-publish","format-standard","hentry","category-programmazione"],"views":307,"_links":{"self":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/641","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=641"}],"version-history":[{"count":6,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/641\/revisions"}],"predecessor-version":[{"id":646,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/641\/revisions\/646"}],"wp:attachment":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=641"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=641"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=641"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}