Il Dart Editor

Di - 17 November 2012 - in

Riprende, dopo due settimane di stop, la rubrica dedicata a Dart. In questo articolo esploreremo tutte le caratteristiche di Dart Editor, lo straordinario editor ufficiale di Dart, concentrandoci su quelle che si rivelano particolarmente utili all’utente per stendere codice sempre aggiornato e di qualità.

La prima funzione, che forse a primo impatto può sembrare un po’ scontata, è il download automatico degli aggiornamenti.

Attivare questa opzione è estremamente importante in quanto insieme all’Editor vengono aggiornate anche le librerie di Dart, le cui definizioni cambiano in fretta, e il SDK.

Un’importante caratteristica dell’Editor è la possibilità di aggiornare automaticamente il codice di un’applicazione secondo le nuove specifiche del linguaggio: la funzione si chiama Clean Up. Facendo clic col pulsante destro del mouse sul file o sull’intero progetto di cui vogliamo aggiornare il codice si apre un menù dal quale lanciare Clean Up. L’esempio sottostante mostra Clean Up in azione: il nostro codice contiene un metodo con una sintassi ormai deprecata — parseInt() — che deve essere aggiornato a int.parse():

 

Al momento le modifiche che Clean Up può apportare al codice includono:

  • i blocchi catch
  • i getters
  • le stringhe in formato @’rawString’
  • i metodi parseInt() e parseDouble()
  • l’operatore identical
  • i parametri opzionali
  • la struttura library/import/source

Ora spostiamoci verso qualcosa di più concreto, concentriamoci sulla scrittura del codice e sul modo in cui Dart Editor ci viene incontro.

Consideriamo questa gerarchia di classi:

class Utente {
    String nome, email, provenienza;
}

class Moderatore extends Utente {
    var banUtente;
    var cancellaMessaggio;
}

class Amministratore extends Moderatore {
    var banModeratore;
}

class UtentePremium extends Utente {
    String dettaglioAggiuntivo;
    int idContratto;
    Date scadenzaContratto;
}

Il modificatore extends e l’esperienza comune ci suggeriscono che l’amministratore dovrà avere proprietà e metodi aggiuntivi rispetto al moderatore che a sua volta ne avrà rispetto all’utente e così via; dopo aver dichiarato queste classi, creiamo delle istanze e concentriamoci sui suggerimenti che l’Editor ci propone:

Sulla base di quanto dichiarato, se abbiamo istanziato una nuova classe e iniziamo a scrivere (occhio al punto)

identificatore.

l’Editor ci propone determinate proprietà, alle quali se ne aggiungono altre nel caso si tratti di un Moderatore, o un Amministratore o un Utente Premium; è immediata la constatazione di quanto tempo possano farci risparmiare questi suggerimenti.

Oltre a questo tipo di suggerimenti, l’Editor è in grado di sottolineare in tempo reale potenziali errori di sintassi o di struttura del codice; per esempio, se noi dichiarassimo Utente come classe astratta, ovvero una classe non direttamente istanziabile, e provassimo invece ad istanziarla, l’Editor restituirebbe un avviso (sottolineatura in giallo) con il messaggio di popup:

instantiation of an abstract class 'Utente'

Se provassimo invece ad invocare un metodo non esistente, l’Editor non solo restituirebbe un avviso, ma ci proporrebbe anche di creare quel metodo:

Quest’ultima funzione si chiama Quick Fix e si invoca facendo clic sull’icona dell’avviso a margine.

Gli errori (sottolineatura in rosso) vengono trattati come nella maggior parte degli altri editor e IDE disponibili, gli errori più comuni sono quelli del tipo “Unexpected token”, “Expected n / found m” e gli errori legati all’inconsistenza dei dati attesi rispetto a quelli effettivi quando si lavora in checked mode (Vedi articolo precedente).

Nel caso di questi ultimi il comportamento dell’Editor è diverso, non si limita a restituire un messaggio di errore, ma visualizza la definizione dell’elemento che ha causato l’errore. Un errore tipo:

class Utente {
    String nome, email, provenienza;
}

 main(){
    Utente nuovoUtente = new Utente();
    nuovoUtente.nome = 123; // intero assegnato a stringa
}

causa questo comportamento dell’Editor, evidenziando in rosso la definizione di nome:

e restituendo nella parte inferiore del debugger questo messaggio:

type 'int' is not a subtype of type 'String' of 'value'.

È bene notare che gli errori relativi ai tipi di dato in checked mode vengono segnalati solo come avvisi (sottolineatura in giallo) nonostante causino l’interruzione del programma.

Vediamo ora un altro gruppo di funzioni interessanti in Dart Editor dedicate al reperimento delle informazioni sull’elemento selezionato all’interno del progetto: rename, Find References, Find Callers, Open Declaration.

La prima funzione, rename, è estremamente utile quando vogliamo rifattorizzare la nostra applicazione: rename sostituirà tutte le occorrenze, in tutti i file del progetto, dell’elemento selezionato con un nuovo nome; intuitivamente, cliccando Open Declaration, il focus si sposterà sulla dichiarazione dell’elemento selezionato.

Find References e Find Callers svolgono funzioni molto simili fra loro e si rivelano di incredibile utilità quando stiamo lavorando su applicazioni complesse: la prima ci mostra tutte le funzioni e i metodi e relativi file nei quali un determinato elemento è referenziato, mentre la seconda ci restituisce ogni singola occorrenza dell’elemento nel progetto; nello screenshot seguente possiamo vedere Find Callers in azione sull’elemento hand:

Passiamo ora alla seconda fase del lavoro: il debugging. Come negli ambienti di sviluppo più diffusi, anche in Dart Editor è presente un potente debugger ed è possibile impostare i breakpoints.

Questo ci consente di ispezionare ogni singolo threadIsolate, nella convenzione di Dart — dandoci quindi la possibilità di vedere in tempo reale cosa sta effettivamente accadendo nel nostro programma quando viene raggiunto un breakpoint, aiutandoci a capire se c’è e dov’è l’errore e se i valori assunti dalle variabili sono coerenti con quelli attesi. Lo screenshot mostra il debugger in azione sulla demo solar (accessibile dalla sezione Welcome dell’Editor), alla quale è stato impostato un breakpoint alla riga 88:

Un breakpoint viene impostato facendo doppio clic sul numero della riga desiderata

Dopo aver esplorato le caratteristiche dell’Editor possiamo vedere immediatamente come esso stesso rappresenti per gli sviluppatori una importante risorsa non solo per scrivere codice ma anche per perfezionarsi ed essere sempre aggiornati sui cambiamenti del linguaggio.

L’Editor non è un software di terze parti, è sviluppato dallo stesso team che sviluppa Dart: questo rafforza l’idea di Dart Editor come elemento complementare a Dart, e costituisce un grandissimo vantaggio rispetto agli altri linguaggi web oriented.

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: