Typescript- Introduzione

Typescript è un superset di Javascript, ovvero un linguaggio di programmazione che estende javascript “tradizionale” aggiungendone nuove funzionalità e caratteristiche.

Typescript consente di aggiungere a Javascript tipi, classi, interfacce e moduli consentendo di sviluppare applicazioni scalabili e con maggiore facilità nel mantenimento/riuso del codice. Potrebbe essere riassunto come un compilatore (scritto anch’esso in Typescript) sviluppato da Microsoft e reso disponibile alla community open-source.

Numerosi framework javascript hanno deciso di adottare typescript per lo sviluppo nativo delle applicazioni. Basti pensare ad esempio ad Angular ( a partire dalla versione 2) e il framework Ionic.

Compilando” il codice Typescript è possibile ottenere l’equivalente javascript (old-version) permettendone l’utilizzo su qualsiasi browser, dispositivo o sistema operativo. Questo è il link del sito ufficiale dal quale è possibile scaricare il compilatore.

La domanda che mi viene spesso posta è:

Quando utilizzare Typescript e quando Javascript?

Forse sarò di parte, ma io userei sempre Typescript! 🙂

Typescript è consigliato quando:

  • è preferibile il type-control in fase di compilazione: utilizzando Javascript è possibile effettuare controlli sui tipo durante il runtime della nostra applicazione, ma perchè farlo quando il compilatore può effettuare per noi il check ?
  • lavoriamo con framework di terze parti: supponendo di dover utilizzare framework che non conosciamo in maniera approfondita, ma che lavorano con la definizione dei tipi, possiamo utilizzare l’intellisense nell’utilizzo di interfaccee e classi.
  • sviluppiamo applicazioni di medie/grandi dimensioni e multi-sviluppatore: l’utilizzo delle regole di Typescript consente di semplificare l’interoperabilità nel codice, e ovviamente il riuso.

JavaScript è consigliato quando:

  • abbiamo poco tempo per organizzare il codice: Typescript necessita una fase di startup (come per i linguaggi di programmazione tradizionali)) per l’organizzazione del codice. In tutti i casi è sempre consigliabile dedicare un pò di tempo nella fase di definizione del progetto
  • dobbiamo realizzare piccoli progetti: non è molto conveniente utilizzare Typescript nel caso di progetti di modeste dimensioni (introdurrebbe un’ulteriore step nella fase di sviluppo)
  • abbiamo già impostato workflow complessi per i test: in questo caso la migrazione di un progetto a Typescript potrebbe rallentare i flussi per i check (oltre che ad aumentarne la complessità)
  • dobbiamo sviluppare librerie personalizzate:  Typescript fa uso di codice pacchettizzato (scaricabile da npm). L’utilizzo di librerie di terze parti può vincolare scelte future, ad esempio nel caso in cui i pacchetti non siano mantenuti nel tempo. Tipicamente, se la scelta ricade su librerie note, non si dovrebbe incorrere in rischi di abbandono dello sviluppo.
  • stiamo utilizzando un framework che non è supportato: ci sono framework che non supportano la tipizzazione dei dati, quindi non l’utilizzo di Typescript non ci porterebbe a risultati evidenti.

L’utilizzo di Visual Studio Code con Typescript consente di migliorare notevolmente le fasi di sviluppo di applicazioni, evitando errori legati tipicamente ai valori e formati differenti.

Programmazione Asincrona e deadlock

Nel refactoring di applicazioni windows form (ebbene si, esistono ancora!) o comunque in quelle applicazioni con lunghi task di elaborazione, uno dei problemi di maggiore impatto per gli utenti è il freeze dell’interfaccia utente.

A partire dal framework 4.5 (C# 5) sono disponibili  le keyword async e await per la scrittura di codice asincrono.  Una delle funzionalità che può essere sfruttata a partire da questa versione (al momento della scrittura di questo articolo è disponibile la release 7.2, ma per questioni legacy non posso upgradare l’applicazione oltre la versione 5.0) è il TAP (Task Async Pattern) .

Task Async Pattern

Utilizzando TAP con async/await è possibile scrivere codice asincrono in maniera semplice senza perdere in potenza. Il seguente metodo consente di eseguire in forma asincrona un metodo (MyMethod) che non lo è.

Per poter ottenere il risultato dell’elaborazione del metodo MyMethodAsync possiamo utilizzare il seguente codice:

L’utilizzo di questo codice all’interno di una console application funziona correttamente. Nel caso in cui la nostra applicazione sia GUI/ASP il risultato è un deadlock. L’esecuzione dovrà essere terminata utilizzando il task manager. 

I metodi asincroni dovrebbe prevenire il blocco delle applicazioni, ma non è sempre così.

Leggendo un pò di documentazione online, ho risolto il problema utilizzando il metodo ConfigureAwait. Questo metodo consente di effettuare l’await del Task su cui stiamo effettuando la configurazione. L’utilizzo del parametro booleano continueOnCapturedContext e dovrà essere impostato a true nel caso in cui sia necessario attendere il ritorno dal context catturato, oppure false nel caso non sia necessario. L’esempio che generava il deadlock può essere rescritto nel seguente modo:

L’utilizzo del metodo ConfigureAwait con continueOnCapturedContext impostato a false consente di risolvere il problema di deadlock.

Novità in C# 7.2

Dopo il rilascio di C# 7.1, è stato pubblicato l’aggiornamento C# 7.2 che porta con se alcune modifiche abbastanza significative alla major release 7.0. Nel seguito di questo articolo analizzeremo le più importanti.

Digital separator after base specifier

Una delle principali novità introdotte in C# 7.0 è la possibilità di definire il separatore numerico attraverso il simbolo _ (underscore). Questa nuova sintassi consente di rendere più leggibile il codice quando si ha a che fare con numeri e formati. Inoltre consente di rappresentare in modo più semplice numeri di grande dimensione. Ad esempio, il seguente codice

consente di rappresentare rispettivamente un numero decimale, un numero esadecimale e un numero binario. Da notare che il formato è rappresentato dal prefisso del numero, ovvero 1, 0x e 0b.

In C# 7.2 è possibile posizionare il carattere underscore dopo la definizione del tipo. Il codice precedente può essere rappresentato nel modo seguente:

Non-trailing Named Arguments

C# dalla versione 4.0 è stato il primo linguaggio di programmazione a permettere il passaggio di parametri, con nome, ai metodi. Questo tipo di approccio consente di utilizzare parametri opzionali, facendo in modo che il compilatore non generi un errore durante il riconoscimento dei parametri.

Il seguente metodo:

definisce tre parametri, assegnando un nome al secondo e al terzo. Il modo più semplice, ma anche quello meno leggibile, per richiamare il metodo è il seguente:

Per rendere il metodo più comprensibile può essere utilizzata la seguente sintassi:

e scambiando l’ordine dei parametri:

Una limitazione era rappresentata dall’impossibilità di far seguire ad un parametro con nome, un parametro posizionale. In C# 7.2, il problema viene superato, ed è possibile compilare codice del tipo:

Private Protected

Fino alla versione 7.1 di C# erano disponibili i seguenti modificatori di accesso:

  • public : non sono presenti limitazioni nell’accesso;
  • protected: l’accesso è limitato alla classe o ai tipi derivati della classe che li contiene
  • internal: l’accesso è consentito solo nell’assembly corrente
  • private: l’accesso è consentito solo al contenitore
  • protected internal: l’accesso è limitato all’assembly corrente o i tipi derivati dalla classe di appartenenza.

A partire dalla versione 7.2 è stato introdotto un nuovo modificatore: private protected.

L’introduzione di questo nuovo modificare consente di limitare l’accesso a una classe o i tipi derivati dalla classe di appartenenza all’interno dell’assembly corrente.

Un membro dichiarato private protect non è accessibile per la classe derivata se è dichiarata all’esterno dell’assembly corrente.

Con questa nuova funzionalità il numero totale di modificatori di accesso sale a sei.

Un membro dichiarato private protect non è accessibile all’interno dell’assembly per le classi che non ereditano dalla classe in cui è dichiarato.

 Ref readonly

L’introduzione di questa nuova funzionalità può essere considerata come l’opposto delle variabili con la keyword out.  Le variabili utilizzate come parametro di un metodo con la keyword ref sono passate per riferimento. Una modifica all’interno del metodo, viene riportata all’esterno del metodo stesso. Le variabili utilizzate come parametro di un metodo con la keyword out possono essere utilizzate solo per ritornare un valore (output) e non come input.

Dichiarando un parametro di un metodo come readonly ref il parametro viene passato al metodo e cercando di modificarne il valore, il compilatore segnalerà un errore in quanto non modificabile. Allo stesso modo, passando un parametro out ad un metodo dovrà essere valorizzato prima di poter essere ritornato. Utilizzando insieme parametri readonly ref e out possiamo creare metodi che accettano in ingresso variabili non modificabili per riferimento e variabili che devono essere valorizzate prima che il metodo termini il suo normale flusso.

Novità in C# 7.1

A distanza di qualche mese dalla pubblicazione analizziamo alcune delle novità in C# 7.1.

C# 7.1 è stato pubblicato con l’upgrade 15.3 di Visual Studio 2017 (Agosto 2017). A differenza di altri rilasci, non tutte le novità sono disponibili automaticamente dopo l’aggiornamento, ma è necessario modificare manualmente la configurazione di Visual Studio. E’ possibile abilitare le nuove features del linguaggio dalla scheda Avanzate presente nelle proprietà di Compilazione del progetto.Visual Studio Impostazione per C#Per impostazione predefinita Visual studio utilizza l’ultima major version: per poter abilitare le novità degli ultimi rilasci è necessario impostare latest minor version.

Nel seguito di questo articolo vedremo alcune delle novità di C# 7.1.

Continua a leggere Novità in C# 7.1

Novità in C# 7.0 – Semplificazioni nel codice

In C# 7.0 sono presenti alcune funzionalità che consentono di semplificare la scrittura del codice, rendendo molto più semplice la sua lettura.

In particolare sono state introdotti i metodo expression bodied e throw expression.

Possiamo utilizzare le Expression bodied :

  • nei metodi
  • nelle properties
  • nei costruttori
  • nei distruttori
  • nelle throw exception

Le expression bodied utilizzano l’operatore “fat arrow” (=>) per definire il codice da eseguire.

Continua a leggere Novità in C# 7.0 – Semplificazioni nel codice