Benutzerdefinierte Blöcke: Blockparadigmen

Beim Entwerfen einer Anwendung können Sie aus verschiedenen Paradigmen wählen. das Blockly nutzt. Diese Entscheidungen sollten da sie sich auf die Blockierungen auswirken, die Nutzende benötigen.

Konfiguration

Viele Blockly-Anwendungen werden zum Beschreiben von Konfigurationen verwendet, als ausführbare Programme. Konfigurationsanwendungen starten in der Regel Initialisieren eines Blocks auf Stammebene im Arbeitsbereich. Ein gutes Beispiel ist Tab „Block Factory“ der Blockly Developer Tools:

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

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

Dadurch entsteht ein nicht löschbarer, nicht beweglicher Block, der alle Konfiguration des Nutzers. Der Arbeitsbereich kann jederzeit serialisiert werden um die aktuelle Konfiguration zu ermitteln.

Für diese Anwendungen ist es sinnvoll, Sperren automatisch zu deaktivieren, die mit dem Stammblock verbunden sind. Dies kann in einer Zeile erreicht werden:

workspace.addChangeListener(Blockly.Events.disableOrphans);

Serienprogramm

Die meisten Blockly-Anwendungen erstellen serielle Anwendungen, Programmen. Nutzer stapeln Blöcke, die der Reihe nach ausgeführt werden.

Jeder (nicht deaktivierte) Block im Arbeitsbereich ist Teil des . Wenn es mehrere Stapel von Blöcken gibt, sind höhere die die zuerst ausgeführt werden. Wenn zwei Stacks ungefähr die gleiche Höhe haben, Stapel auf der linken Seite (im RTL-Modus rechts) haben Priorität.)

Der Arbeitsbereich kann jederzeit in ausführbaren Code exportiert werden. Dieser Code kann clientseitig in JavaScript ausgeführt werden (mithilfe von eval oder JS Dolmetscher) oder serverseitig in einer beliebigen Sprache.

import {javascriptGenerator} from 'blockly/javascript';

var code = javascriptGenerator.workspaceToCode(workspace);

Paralleles Programm

Einige Blockly-Anwendungen führen alle Stapel von Blöcken in parallel statt seriell. Ein Beispiel wäre eine Musik-App, Ein Drum Loop läuft zeitgleich mit einer Melodie.

Eine Möglichkeit zur Implementierung der parallelen Ausführung besteht darin, den Code für jede einzeln blockieren:

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;
}

Ist die Zielsprache JavaScript, kann das Array allCode so aussehen: zur gleichzeitigen Ausführung mehrerer JS-Interpreter. Wenn die Zielsprache in etwa Python ist, dann ist das Array allCode zu einem einzigen Programm zusammengestellt werden, das ein Threading-Modul verwendet.

Wie bei jedem parallelen Programm müssen sorgfältige Entscheidungen alle gemeinsam genutzten Ressourcen wie Variablen und Funktionen.

Ereignisgesteuertes Programm

Event-Handler sind nur Funktionen, die vom System aufgerufen werden, als durch das Programm. Diese Blöcke können entweder den Stapel von auszuführende Blöcke oder Header, die sich auf einem Stapel befinden von Blöcken.

Manche Entwickler fügen gern einen „Hut“ hinzu, ganz oben in die Ereignisblöcke ein, unterscheiden sie sich von anderen Blöcken. Dies ist nicht die Standardansicht für Blockiert, kann aber durch Überschreiben der Renderer-Konstante hinzugefügt werden ADD_START_HATS bis true (Codelab für benutzerdefinierte Renderer – Konstanten überschreiben). oder durch Hinzufügen eines Designs und Festlegen der Hutoption auf den Blockstil. Mehr Informationen dazu, wie Sie Blöcken als Teil von Themen Hüte aufsetzen, finden Sie hier.

Innerhalb eines ereignisgesteuerten Modells kann es sinnvoll sein, auch einen Handler für den Programmstart. Bei diesem Modell sind Blöcke im Arbeitsbereich, die nicht die mit einem Ereignis-Handler verbunden sind, ignoriert und nicht ausgeführt werden.

Überlegen Sie beim Entwerfen eines Systems mit Ereignissen, möglich oder wünschenswert, mehrere Instanzen derselben Veranstaltung zu unterstützen -Handler.