Niestandardowe blokady: paradygmaty blokowe

Podczas projektowania aplikacji wykorzystującej Blockly można wybierać spośród kilku paradygmatów. Decyzje należy rozważyć na wczesnym etapie, ponieważ wpływają one na bloki, których będzie potrzebować użytkownik.

Konfiguracja

Wiele aplikacji Blockly służy do opisywania konfiguracji, a nie wykonywalnych programów. Aplikacje konfiguracyjne zazwyczaj zaczynają od zainicjowania w obszarze roboczym 1 bloku na poziomie głównym. Dobrym przykładem jest karta Block Factory (Block Factory) w narzędziach dla programistów 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);

Spowoduje to utworzenie niemożliwej do przeniesienia bloku, który zawiera całą konfigurację użytkownika. Obszar roboczy może zostać w dowolnym momencie zserializowany, aby można było określić bieżącą konfigurację.

Takie aplikacje mogą chcieć automatycznie wyłączać każdy blok, który nie jest połączony z blokiem głównym. Aby to zrobić, użyj jednego wiersza:

workspace.addChangeListener(Blockly.Events.disableOrphans);

Program seryjny

Większość aplikacji Blockly służy do tworzenia programów szeregowych. Użytkownicy grupują bloki wykonywane w kolejności.

Każda (niewyłączona) blokada w obszarze roboczym będzie częścią programu. Jeśli masz wiele stosów bloków, najpierw wykonywane są wyższe z nich. Jeśli 2 stosy mają mniej więcej tę samą wysokość, priorytet mają zastosowanie stosy po lewej stronie (w trybie RTL).

Obszar roboczy można w każdej chwili wyeksportować do kodu wykonywalnego. Ten kod może być uruchamiany po stronie klienta w języku JavaScript (za pomocą eval lub za pomocą programu interpretującego JS) albo po stronie serwera w dowolnym języku.

import {javascriptGenerator} from 'blockly/javascript';

var code = javascriptGenerator.workspaceToCode(workspace);

Program równoległy

Niektóre aplikacje Blockly uruchamiają wszystkie stosy bloków równolegle, a nie po kolei. Przykładem może być aplikacja muzyczna, w której pętla gra jednocześnie z melodią.

Jednym ze sposobów implementacji wykonywania równoległego jest wygenerowanie kodu dla każdego bloku osobno:

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

Jeśli językiem docelowym jest JavaScript, można użyć tablicy allCode do utworzenia wielu interpreterów JavaScriptu do jednoczesnego wykonywania poleceń. Jeśli język docelowy jest podobny do Pythona, tablica allCode można połączyć w jeden program korzystający z modułu wątków.

Tak jak w przypadku każdego innego programu, w przypadku wszelkich współdzielonych zasobów, takich jak zmienne i funkcje, należy podejmować przemyślane decyzje.

Program oparty na wydarzeniach

Moduły obsługi zdarzeń to funkcje, które są wywoływane przez system, a nie przez program. Bloki te mogą obejmować stos bloków do wykonania lub mogą to być nagłówki znajdujące się na stosie bloków.

Niektórzy deweloperzy dodają „kapelusz” do górnej części bloków zdarzeń, aby wyglądały one inaczej niż inne bloki. Nie jest to domyślny wygląd Blockly, ale można go dodać, zastępując stałą ADD_START_HATS mechanizmu renderowania true (Ćwiczenia z programowania dotyczące niestandardowych mechanizmów renderowania – Zastąp stałe). Możesz też dodać motyw i ustawić opcję kapelusza w stylu bloku. Więcej informacji o ustawianiu kapeluszy na klockach w ramach motywów znajdziesz tutaj.

W modelu opartym na zdarzeniach warto też utworzyć moduł obsługi na potrzeby uruchamiania programu. W tym modelu każdy blok w obszarze roboczym, który nie jest połączony z modułem obsługi zdarzeń, będzie ignorowany i nie zostanie wykonany.

Podczas projektowania systemu, który korzysta ze zdarzeń, zastanów się, czy jest możliwe lub pożądane stosowanie wielu instancji tego samego modułu obsługi zdarzeń.