Blocchi personalizzati: paradigmi di blocco

Ci sono diversi paradigmi tra cui scegliere quando si progetta un'applicazione che utilizza Blockly. È necessario valutare queste scelte per tempo, poiché influiscono sui blocchi di cui l'utente avrà bisogno.

Configurazione

Molte applicazioni Blockly vengono utilizzate per descrivere le configurazioni, rispetto ai programmi eseguibili. Le applicazioni di configurazione in genere iniziano inizializzare un blocco di livello principale nell'area di lavoro. Un buon esempio è scheda Fabbrica di blocchi degli Strumenti per sviluppatori Blockly:

Blockly.Blocks['factory_base'] = {
  init: function() {
    this.setDeletable(false);
    this.setMovable(false);
    this.setEditable(false);
    // etc...
  }
}

Blockly.serialization.blocks.append({'type': 'factory_base'}, workspace);

Viene creato un blocco indelebile e non spostabile che contiene tutti i configurazione utente. L'area di lavoro può essere serializzata in qualsiasi momento per determinare la configurazione attuale.

Tali applicazioni potrebbero voler disattivare automaticamente eventuali blocchi che non collegate al blocco principale. Questo può essere fatto con una sola riga:

workspace.addChangeListener(Blockly.Events.disableOrphans);

Programma seriale

La maggior parte delle applicazioni Blockly sono progettate per creare programmi. Gli utenti raggruppano i blocchi eseguiti in ordine.

Ogni blocco (non disattivato) nell'area di lavoro farà parte della . Se sono presenti più blocchi, quelli più alti sono eseguiti per primi. (Se due pile hanno quasi la stessa altezza, gli stack a sinistra (a destra in modalità RTL) hanno la priorità.

L'area di lavoro può essere esportata in codice eseguibile in qualsiasi momento. Questo codice possono essere eseguiti sul lato client in JavaScript (utilizzando eval o interprete) o lato server in qualsiasi lingua.

import {javascriptGenerator} from 'blockly/javascript';

var code = javascriptGenerator.workspaceToCode(workspace);

Programma parallelo

Alcune applicazioni Blockly scelgono di eseguire tutti gli stack di blocchi in in parallelo, anziché in serie. Un esempio potrebbe essere un'applicazione musicale in cui un loop di batteria viene eseguito contemporaneamente a una melodia.

Un modo per implementare l'esecuzione parallela è generare il codice per ogni Blocca singolarmente:

import {javascriptGenerator} from 'blockly/javascript';

var json = Blockly.serialization.workspaces.save(workspace);

// Store top blocks separately, and remove them from the JSON.
var blocks = json['blocks']['blocks'];
var topBlocks = blocks.slice();  // Create shallow copy.
blocks.length = 0;

// Load each block into the workspace individually and generate code.
var allCode = [];
var headless = new Blockly.Workspace();
for (var i = 0; block < topBlocks.length; i++) {
  var block = topBlocks[i];
  blocks.push(block);
  Blockly.serialization.workspaces.load(json, headless);
  allCode.push(javascriptGenerator.workspaceToCode(headless));
  blocks.length = 0;
}

Se la lingua di destinazione è JavaScript, l'array allCode potrebbe quindi essere utilizzato per creare più interpreti JS per l'esecuzione simultanea. Se la lingua di destinazione è simile a Python, quindi l'array allCode possono essere assemblati in un unico programma che usa un modulo di thread.

Come con qualsiasi programma parallelo, è necessario prendere decisioni attente in merito a risorse condivise, come variabili e funzioni.

Programma basato su eventi

I gestori di eventi sono solo funzioni che vengono chiamate dal sistema, che dal programma. Questi blocchi possono racchiudere lo stack di blocchi da eseguire o possono essere intestazioni che si trovano sopra uno stack di blocchi.

Alcuni sviluppatori aggiungono "cappello" fino in cima ai blocchi di eventi, sono distinti dagli altri blocchi. Non è la ricerca predefinita A blocchi, ma può essere aggiunto sostituendo la costante del renderer Da ADD_START_HATS a true (codelab dei renderer personalizzati - costanti di override). o aggiungendo un tema e impostando l'opzione cappello nello stile del blocco. Altro sono disponibili informazioni per impostare cappelli sui blocchi come parte dei temi qui

All'interno di un modello basato su eventi, potrebbe avere senso anche creare un per l'inizio del programma. In base a questo modello, qualsiasi blocco nell'area di lavoro non collegato a un gestore di eventi verrebbe ignorato e non verrebbe eseguito.

Quando progetti un sistema che utilizza gli eventi, valuta se possibile o auspicabile supportare più istanze dello stesso evento .