Dart: checked mode VS production mode

Di - 3 November 2012 - in

Questa settimana inizieremo la presentazione di una serie di feature fondamentali in Dart, che passo a passo vi porteranno a scoprire le novità e le peculiarità introdotte da questo linguaggio.

Partiamo chiarendo  il concetto di “tipi opzionali” accennato negli articoli precedenti introducendo i due metodi di runtime disponibili, ovvero il checked mode e il production mode; il primo, più lento, è consigliato per la fase di debugging del codice, mentre il secondo,  come dice anche il nome, è pensato per la fase di deploy.

In DartEditor si può scegliere il metodo di esecuzione checked o production dalla voce di menù Run -> Manage Launches, selezionando o deselezionando il box Run in checked mode.

Se stiamo usando la riga di comando abbiamo bisogno di aggiungere il flag --enable-checked-mode:

# production mode: $PERCORSO_A_DARTSDK/bin/dart hello.dart
# checked mode: $PERCORSO_A_DARTSDK/bin/dart --enable-checked-mode hello.dart 

Prima di implementare il nostro codice in sistemi più grandi, per assicurarci che tutto stia procedendo bene potremmo aver bisogno di sapere se in un determinato punto dell’esecuzione una determinata variabile abbia un determinato valore; vogliamo controllare, per esempio, se la funzione assegnaNome() restituisca il valore “Paolo”:

main(){ var nome = assegnaNome();
assert(nome=="Paolo");
print(nome);} 

String assegnaNome()
{
 return "Mario";
} 

È ovvio che l’asserto sia falso, quindi se stiamo lavorando in checked mode l’esecuzione si interromperà in quel punto e verrà restituito un messaggio di errore tipo questo:

Unhandled exception: 'file:///private/tmp/googlab.dart': 
Failed assertion: line 3 pos 9: 'nome=="Paolo"' is not true.
#0 AssertionErrorImplementation._throwNew (dart:core-patch:179:3)
#1 main (file:///private/tmp/googlab.dart:3:9) 

Il fatto che assegnaNome() restituisca “Mario” piuttosto che “Paolo” non costituisce di per sè un errore formale perché in effetti la sintassi e la logica del codice sono corrette. Eseguito in production mode, il programma non restituirà alcun errore.

Questo concetto si estende anche ai tipi di dato.

Dart è un linguaggio opzionalmente tipizzato, ovvero ai fini dell’esecuzione non ha importanza se un dato sia stato dichiarato String, bool, int, et cetera: in production mode le dichiarazioni vengono totalmente ignorate mentre in checked mode no.

Eseguendo in production mode questo programma

main(){
 String nome = "Mario"; 
 saluta(nome); 
} 

saluta(int nome){ 
 print('Ciao $nome'); 
} 

l’esecuzione non si interromperà, sebbene la funzione saluta() accetti un dato di tipo int in ingresso.

Possiamo quindi concludere dicendo che in Dart l’esecuzione in checked mode forzi la VM a “controllare” che i valori assunti siano coerenti con i valori attesi e che quindi i tipi di dato siano da considerare come annotazioni utili per la lettura e la manutenzione del codice.

Leave a Reply

Claudio d'Angelis Articolo scritto da

Programmatore e studente di Informatica, appassionato di musica, web e sistemi UNIX. Collabora con Googlab dall’Ottobre 2012.

Contatta l'autore

Previous post:

Next post: