Bloques personalizados: paradigmas de bloques

Hay varios paradigmas para elegir cuando se diseña una aplicación. que utiliza Blockly. Se deben considerar estas elecciones. ya que afectan los bloqueos que necesitará el usuario.

Configuración

Muchas aplicaciones de Blockly se usan para describir configuraciones, en lugar que los programas ejecutables. Por lo general, las aplicaciones de configuración comienzan inicializando un bloque de nivel raíz en el lugar de trabajo. Un buen ejemplo la pestaña Block Factory de 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);

Esto crea un bloque que no se puede borrar ni mover que contiene todos los la configuración del usuario. El lugar de trabajo se puede serializar en cualquier momento para determinar la configuración actual.

Estas aplicaciones pueden querer inhabilitar automáticamente cualquier bloqueo que no conectadas al bloque raíz. Esto se puede lograr con una sola línea:

workspace.addChangeListener(Blockly.Events.disableOrphans);

Programa en serie

La mayoría de las aplicaciones de Blockly están diseñadas para crear aplicaciones programas. Los usuarios apilan bloques que se ejecutan en orden.

Cada bloque (no inhabilitado) del espacio de trabajo formará parte del . Si hay varias pilas de bloques, los superiores ejecutar primero. (Si dos pilas tienen aproximadamente la misma altura, las pilas a la izquierda (derecha en el modo RTL) tienen prioridad).

El espacio de trabajo se puede exportar a un código ejecutable en cualquier momento. Este código puede ejecutarse del lado del cliente en JavaScript (mediante eval o JS (Intérprete) o del servidor en cualquier idioma.

import {javascriptGenerator} from 'blockly/javascript';

var code = javascriptGenerator.workspaceToCode(workspace);

Programa paralelo

Algunas aplicaciones de Blockly eligen ejecutar todas las pilas de bloques en paralelo, en lugar de hacerlo en serie. Un ejemplo sería una aplicación de música en el que un bucle de batería suena simultáneamente con una melodía.

Una forma de implementar la ejecución paralela es generar el código para cada bloquear individualmente:

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

Si el idioma objetivo es JavaScript, el array allCode puede ser que se usa para crear varios intérpretes de JS para una ejecución simultánea. Si el lenguaje objetivo es Python, luego el array allCode pueden ensamblarse en un solo programa que usa un módulo de subprocesos.

Al igual que con cualquier programa paralelo, se deben tomar decisiones cuidadosas cualquier recurso compartido, como variables y funciones.

Programa basado en eventos

Los controladores de eventos son funciones que el sistema llama, en lugar que por el programa. Estos bloques pueden encerrar la pila de bloques ser ejecutados, o pueden ser encabezados que se ubican en la parte superior de una pila de bloques.

A algunos desarrolladores les gusta agregar un "sombrero" en la parte superior de los bloques de eventos se ven diferentes a otros bloques. Este no es el estilo predeterminado En bloque, pero se puede agregar anulando la constante del renderizador. ADD_START_HATS por true (codelab de procesadores personalizados: anula constantes) o agregando un tema y estableciendo la opción de sombrero en el estilo de bloque. Más encontrarás información para colocar sombreros en bloques como parte de los temas. aquí.

Dentro de un modelo controlado por eventos, tendría sentido crear también un controlador para el inicio del programa. Con este modelo, cualquier bloque del espacio de trabajo conectadas a un controlador de eventos se ignorarán y no se ejecutarían.

Cuando diseñes un sistema que usa eventos, considera si es posible o conveniente para admitir varias instancias del mismo evento controlador.