天天看點

blockly -- Custom Blocks: Block ParadigmsCustom Blocks: Block Paradigms

Custom Blocks: Block Paradigms

當設計一個使用塊的應用程式時,有幾個範例可供選擇。應該盡早考慮這些選擇,因為它們會影響使用者需要的塊。

Configuration

許多塊應用程式用于描述配置,而不是可執行程式。配置應用程式通常從初始化工作區上的一個根級别塊開始。一個很好的例子是Blockly開發工具的Block Factory頁籤:

blockly -- Custom Blocks: Block ParadigmsCustom Blocks: Block Paradigms
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(穿行程式)

大多數塊應用程式都是為建立串行程式而設計的。使用者将按順序執行的塊堆疊在一起。

blockly -- Custom Blocks: Block ParadigmsCustom Blocks: Block Paradigms

工作區上的每個(非禁用)塊将構成程式的一部分。如果有多個塊堆棧,則首先執行較高的塊。(如果兩個堆棧的高度大緻相同,則左邊的堆棧(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

事件處理程式隻是系統調用的函數,而不是程式調用的函數。這些塊可以包含要執行的塊堆棧,也可以是位于塊堆棧頂部的頭。

blockly -- Custom Blocks: Block ParadigmsCustom Blocks: Block Paradigms

一些開發人員喜歡在事件塊的頂部添加一個“hat”,以便它們看起來與其他塊不同。這不是Blockly的預設查找,但可以通過設定Blockly.BlockSvg.START_HAT=true;或通過添加主題并在塊樣式上設定HAT選項來添加它。更多關于在塊上設定hats作為主題的一部分的資訊可以在這裡找到。

blockly -- Custom Blocks: Block ParadigmsCustom Blocks: Block Paradigms

在事件驅動模型中,也可以為程式啟動建立一個處理程式。在此模型下,工作區上未連接配接到事件處理程式的任何塊都将被忽略并且不會執行。

在設計使用事件的系統時,請考慮是否可能或需要支援同一事件處理程式的多個執行個體。