blockly -- Custom Blocks: Block Paradigms

本文探讨了使用块(如Blockly)进行应用程序设计的几种主要范例,包括配置、串行程序、并行程序和事件驱动程序。每种范例都有其特定的场景和实现方式,如配置应用程序通常从一个根级别块开始,而并行程序则可能涉及多个独立执行的代码段。

Custom Blocks: Block Paradigms

当设计一个使用块的应用程序时,有几个范例可供选择。应该尽早考虑这些选择,因为它们会影响用户需要的块。

Configuration

许多块应用程序用于描述配置,而不是可执行程序。配置应用程序通常从初始化工作区上的一个根级别块开始。一个很好的例子是Blockly开发工具的Block Factory选项卡:

var xml = '<xml><block type="factory_base" deletable="false" movable="false"></block></xml>';
Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom(xml), workspace);

这将创建一个不可删除、不可移动的块,该块保存所有用户的配置。可以随时将工作区导出为XML以确定当前配置。

此类应用程序可能希望自动禁用未连接到根块的任何块。这可以在Blockly的web版本上用一行代码实现:

workspace.addChangeListener(Blockly.Events.disableOrphans);

Serial Program(穿行程序)

大多数块应用程序都是为创建串行程序而设计的。用户将按顺序执行的块堆叠在一起。

工作区上的每个(非禁用)块将构成程序的一部分。如果有多个块堆栈,则首先执行较高的块。(如果两个堆栈的高度大致相同,则左边的堆栈(RTL模式中的右侧)优先。)

工作区可以随时导出为可执行代码。这段代码可以用JavaScript在客户端执行(使用eval或JS解释器),也可以用任何语言在服务器端执行。

var code = Blockly.JavaScript.workspaceToCode(workspace);

Parallel Program(并行程序)

一些块应用程序选择并行执行所有块堆栈,而不是串行执行。一个例子是一个音乐应用程序,其中一个鼓循环与一个旋律同时运行。

实现并行执行的一种方法是使用无头工作区生成多个代码段:

var xml = Blockly.Xml.workspaceToDom(workspace);
// Find and remove all top blocks.
var topBlocks = [];
for (var i = xml.childNodes.length - 1, node; block = xml.childNodes[i]; i--) {
  if (block.tagName == 'BLOCK') {
    xml.removeChild(block);
    topBlocks.unshift(block);
  }
}
// Add each top block one by one and generate code.
var allCode = [];
for (var i = 0, block; block = topBlocks[i]; i++) {
  var headless = new Blockly.Workspace();
  xml.appendChild(block);
  Blockly.Xml.domToWorkspace(xml, headless);
  allCode.push(Blockly.JavaScript.workspaceToCode(headless));
  headless.dispose();
  xml.removeChild(block);
}

如果目标语言是JavaScript,那么可以使用allCode数组创建多个JS解释器来同时执行。如果目标语言类似于Python,那么allCode数组可以组装成使用线程模块的单个程序。

与任何并行程序一样,必须对任何共享资源(如变量和函数)做出谨慎的决定。

Event Driven Program

事件处理程序只是系统调用的函数,而不是程序调用的函数。这些块可以包含要执行的块堆栈,也可以是位于块堆栈顶部的头。

一些开发人员喜欢在事件块的顶部添加一个“hat”,以便它们看起来与其他块不同。这不是Blockly的默认查找,但可以通过设置Blockly.BlockSvg.START_HAT=true;或通过添加主题并在块样式上设置HAT选项来添加它。更多关于在块上设置hats作为主题的一部分的信息可以在这里找到。

在事件驱动模型中,也可以为程序启动创建一个处理程序。在此模型下,工作区上未连接到事件处理程序的任何块都将被忽略并且不会执行。

在设计使用事件的系统时,请考虑是否可能或需要支持同一事件处理程序的多个实例。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值