In questo paragrafo viene illustrata la struttura delle applicazioni create con Instant Developer Cloud. Nellâimmagine seguente viene mostrata la dashboard di un progetto gestito nella piattaforma.
La dashboard di un progetto nellâIDE di Instant Developer Cloud
Come possiamo vedere nellâimmagine, un progetto Instant Developer Cloud contiene le seguenti definizioni:
- Le App, cioè le varie applicazioni che compongono il sistema. Ogni applicazione potrà essere compilata come applicazione web da installare nel cloud, o come applicazione mobile da inviare ad app store, o infine come PWA.
- I Datamodel, cioè gli schemi dati relazionali che il sistema deve utilizzare. Possono essere collegati sia database nel cloud che on premise. Il codice SQL delle query inserito nellâIDE viene generato automaticamente per i vari tipi di database collegati (Postgres, Oracle, SQLServer, MySQL e Sqlite).
- Le Librerie, cioè insiemi di classi di codice che possono essere riutilizzate fra le varie applicazioni o perfino condivise tra diversi progetti. Solitamente le librerie contengono le definizioni delle classi di accesso ai dati, classi di codice di utilità o videate standard pensate per essere riutilizzate in contesti diversi.
- I Pacchetti, insiemi di componenti importati da altri progetti o definiti in quello attuale per essere esportati.
Lâinsieme di queste parti rappresenta un intero progetto Instant Developer Cloud, che può essere gestito da una sola persona o da un team di lavoro tramite Teamworks, un sistema integrato di gestione del lavoro di gruppo con funzionalitĂ simili a Git (per maggiori informazioni, si legga Instant Developer Team Works). Il flusso del lavoro può essere controllato tramite un sistema di gestione di Issue anch’esso simile a quello presente nel sistema GitHub.
Struttura delle applicazioni #
Come abbiamo visto in precedenza, ogni applicazione presente in un progetto può essere compilata come applicazione web da installare in un server, come applicazione mobile da inviare agli store o infine come PWA.
Per consentire allo stesso codice di funzionare in maniera equivalente in ognuno di questi contesti, Instant Developer Cloud contiene diversi tipi di application container, ognuno dei quali rappresenta un device virtuale equivalente.
Container per applicazioni web #
Il container per applicazioni web è basato su unâarchitettura node.js multiprocesso.
Il processo master si occupa di gestire le connessioni e le sessioni. I processi worker contengono le sessioni di lavoro. Sono previsti i seguenti tipi di sessioni:
- web: normali sessioni web che vengono istanziate tramite browser.
- rest: sessioni che gestiscono un comando in modalitĂ rest, solitamente proveniente da un sistema esterno che deve essere integrato.
- webapi: sessioni che gestiscono una webapi di tipo OData generata con Instant Developer Cloud.
- proxy: sessioni che permettono ai dispositivi mobili di collegarsi con il backend del cloud per condividere dati o sincronizzare database.
- server: sessioni batch che svolgono attivitĂ periodiche in modalitĂ non presieduta.
Questa architettura normalmente viene resa disponibile in un container Docker in esecuzione nella Google Cloud Platform in un data center europeo. In questo contesto:
- Ă possibile installare piĂš applicazioni nello stesso container. Ogni applicazione avrĂ un ambiente operativo separato.
- Ogni applicazione accede ad un proprio file system separato dalle altre applicazioni.
- Nel container è presente anche un database server Postgres che può contenere i database utilizzati dalle varie applicazioni installate nel container.
- Per ogni applicazione è possibile configurare le politiche di gestione dei worker, assegnandoli ad un tipo di sessione o alla quantità delle stesse.
Container per applicazioni mobile #
Il container per applicazioni mobile di Instant Developer Cloud è chiamato Launcher, ed è basato sullâarchitettura Apache Cordova per la creazione di applicazioni mobile ibride.
Un launcher mette a disposizione dellâapplicazione un device virtuale compatibile con quello del contenitore per applicazioni web: lo stesso codice applicativo viene eseguito con la medesima semantica, fatto salvo il diverso ambiente operativo su cui esso avviene, cioè una webview del dispositivo invece che un processo node.js.
Quando lâapplicazione è in esecuzione nel cloud, le query sui database relazionali vengono eseguite rispetto al database Postgres. In questo caso invece le stesse query vengono eseguite sul database SQLite del dispositivo e il codice SQL viene automaticamente tradotto da Instant Developer Cloud, se la query è stata inserita in modo strutturato.
Ă disponibile un file system compatibile con quello del cloud e lâapplicazione può accedere ai vari plugin Cordova tramite delle classi JavaScript di interfaccia. Nelle librerie standard sono giĂ inclusi i plugin piĂš usati, ma è possibile aggiungere i propri plugin e renderli disponibili allâapplicazione sviluppando la relativa interfaccia.
Lâapplicazione vera e propria viene compilata dalla console attraverso unâoperazione di build dellâapplicazione sviluppata con lâIDE cloud. Sempre tramite la console è possibile ottenere il progetto Cordova che unisce lâapplicazione e il launcher, oppure inviare direttamente lâapplicazione compilata agli store.
Lâapplicazione è aggiornabile in tempo reale: dopo la prima installazione è possibile sostituire il codice applicativo in funzione del container senza dover nuovamente sottoporre lâapplicazione agli store. Questa funzionalitĂ viene gestita sempre tramite la console e permette di distribuire fix e piccoli miglioramenti che non richiedono cambiamenti alla struttura del launcher (plugin nativi, splash screen, dati di configurazione).
Per integrare lâapplicazione mobile con il cloud è disponibile un framework di sincronizzazione che consente la remotizzazione delle operazioni sui dati e lâaggiornamento automatico dei dati nel database locale al dispositivo.
Container per Progressive Web App (PWA) #
Il container per applicazioni PWA di Instant Developer Cloud è molto simile a quello per le applicazioni mobile. Tuttavia in questo caso il device virtuale messo a disposizione delle applicazioni è basato solo sulle funzionalità del browser.
In questo senso il database SQLite è disponibile in alcuni contesti, ma non in tutti. La stessa cosa vale per il file system e per i vari plugin, la cui disponibilità può variare caso per caso.
Per maggiori informazioni sulla compatibilitĂ del device virtuale nei vari contesti, si consiglia di leggere il documento: Manuale PWA.
Per ottenere una PWA occorre aggiungere allâapplicazione le risorse necessarie tramite il comando Crea manifest per PWA del menu specifico dellâapplicazione e poi attivare la modalitĂ offline dellâinstallazione web nella console.
Attivazione del manifest per PWA
Gerarchia delle classi di unâapplicazione #
Dopo aver analizzato il contesto in cui lâapplicazione è mantenuta in funzione, cioè i vari tipi di application container disponibili, vediamo la struttura dellâapplicazione stessa, che, sulla base di quanto illustrato in precedenza, sarĂ indipendente dal contesto di esecuzione.
Lâarchitettura delle classi è definita tramite oggetti JavaScript basati su prototype ed ha la seguente struttura.
Lâapplicazione (App) è lâoggetto base della gerarchia e contiene tutte le definizioni delle videate, delle classi, dei database e delle librerie. Nel container per applicazioni web, App è un singleton per ogni worker e gestisce la lista delle sessioni in esecuzione in tale worker. Nei container per applicazioni mobile e PWA, App è un singleton che contiene lâunica sessione di lavoro in esecuzione nel device.
Le videate e le classi inserite come figlie dellâapplicazione vengono definite allâinterno di App. Se quindi si crea un videata di nome MyView allâinterno dellâapplicazione, essa potrĂ essere referenziata nel codice come App.MyView. La stessa cosa avviene per le classi definite allo stesso livello delle videate.
I database contengono gli schemi relazionali di cui lâapplicazione fa uso; a livello di codice per ogni database viene definita una classe figlia di App. Se quindi si crea un database di nome MyDB allâinterno del progetto, esso potrĂ essere referenziato come App.MyDB in ogni applicazione o libreria contenuta nel progetto stesso.
Le librerie contengono i documenti, le videate o le classi utilizzabili in ogni applicazione presente nel progetto. Per ogni libreria viene definita una classe figlia di App. Se quindi si vuole referenziare la classe MyClass contenuta in una libreria di nome MyLib, occorre scrivere App.MyLib.MyClass.
Ogni classe può contenere proprietĂ e metodi. Le proprietĂ sono sempre di istanza, quindi non è possibile definire nellâIDE proprietĂ statiche perchĂŠ verrebbero condivise fra tutte le sessioni in esecuzione nel medesimo worker. I metodi, invece, possono essere sia di istanza che statici.
Una videata è un tipo di classe particolare che deriva da Application.View invece che da Object. Oltre alle proprietĂ e ai metodi, una videata contiene la gerarchia degli elementi visuali che ne costituiscono lâinterfaccia utente. Sia la videata che i vari elementi possono contenere i gestori degli eventi notificati dalle azioni dellâutente o dal ciclo di vita della videata stessa.
Un database è un tipo di classe particolare che deriva da Application.Database invece che da Object. Un database non contiene codice, ma la definizione dello schema delle tabelle e delle relazioni fra di esse. Un database può contenere anche la definizione di liste valori da utilizzare come dominio dei campi. La classe base dei database mette a disposizione le funzioni per la gestione delle transazioni e per lâesecuzione di query in modo indipendente dal tipo di database.
La classe base dei database definiti nellâapplicazione non è direttamente Application. Database, ma una piĂš specifica, in funzione del tipo di database utilizzato. Sono disponibili Application.Postgres, Application.SqlServer, Application.Oracle, Application.MySql oppure Application.Sqlite. Da notare che quando si esegue la build dellâapplicazione per un container mobile o PWA, tutti i database vengono temporaneamente considerati come derivanti da Application.Sqlite.
Un documento è un tipo di classe particolare che deriva da Application.Document invece che da Object. Il documento è lâentitĂ base del framework ORM di Instant Developer e il suo schema può essere collegato ad una tabella definita in un database o ad una API OData importata nel progetto. Se viene collegata ad una tabella del database, la classe rappresenta la modalitĂ standard di interazione con tale tipo di dati e una sua istanza rappresenta un record della tabella. Un documento si comporta in maniera analoga se viene collegato ad una API OData.
Sia lâapplicazione che ogni classe contenuta in un progetto può contenere risorse di vario tipo, principalmente immagini, file di testo, json o css. Anche in questo caso è possibile referenziare le risorse nel codice applicativo indipendentemente dal contesto di esecuzione dellâapplicazione.