設計使用 Blockly 的應用程式時,可以選擇多種模式。這些選項會影響使用者需要的區塊,因此應盡早考量這些選項。
設定
許多 Blockly 應用程式都是用來描述設定,而不是可執行的程式。設定應用程式通常會先在工作區初始化一個根層級區塊。一個很好的例子是 Blockly 開發人員工具的 Block Factory 分頁:
Blockly.Blocks['factory_base'] = {
init: function() {
this.setDeletable(false);
this.setMovable(false);
this.setEditable(false);
// etc...
}
}
Blockly.serialization.blocks.append({'type': 'factory_base'}, workspace);
這會建立一個無法刪除、移動的區塊,用於儲存所有使用者的設定。您隨時可以序列化工作區,以便判斷目前的設定。
這類應用程式可能會希望自動停用任何未連結至根區塊的區塊。您可以使用一行程式碼完成這項操作:
workspace.addChangeListener(Blockly.Events.disableOrphans);
連續節目
大多數 Blockly 應用程式都是用來建立序列程式。使用者會將區塊堆疊在一起,並依序執行。
工作區中的每個 (未停用的) 區塊都會成為程式的一部分。如果有多個堆疊區塊,系統會優先執行較高的堆疊區塊。(如果兩個堆疊高度相近,系統會優先顯示左側的堆疊 (在 RTL 模式中為右側)。)
您隨時可以將工作區匯出為可執行的程式碼。這個程式碼可在 JavaScript 中執行用戶端 (使用 eval 或 JS 解譯器),或在任何語言中執行伺服器端。
import {javascriptGenerator} from 'blockly/javascript';
var code = javascriptGenerator.workspaceToCode(workspace);
平行程式
部分 Blockly 應用程式會選擇同時執行所有堆疊的區塊,而非依序執行。舉例來說,音樂應用程式中鼓聲迴圈會與旋律同時播放。
實作並行執行作業的方法之一,是為每個區塊個別產生程式碼:
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;
}
如果目標語言是 JavaScript,則可使用 allCode
陣列建立多個 JS 解譯器,以便同時執行。如果目標語言是 Python 之類的語言,則 allCode
陣列可能會組合為使用執行緒模組的單一程式。
如同任何並行程式一樣,您必須謹慎決定共用資源 (例如變數和函式)。
事件導向程式
事件處理常式只是由系統 (而非程式) 呼叫的函式。這些區塊可以包含要執行的區塊堆疊,也可以是位於區塊堆疊頂端的標頭。
有些開發人員喜歡在事件區塊頂端加上「帽子」,讓事件區塊與其他區塊有所區隔。這不是 Blockly 的預設外觀,但您可以透過以下方式加入:將轉譯器常數 ADD_START_HATS
覆寫為 true
(自訂轉譯器程式碼研究室 - 覆寫常數),或是新增主題並在區塊樣式上設定帽子選項。如要進一步瞭解如何在主題中設定方塊的帽子,請參閱這篇文章。
在事件驅動模型中,也許可以為程式啟動建立處理常式。在這個模型中,如果工作區中的任何區塊未連結至事件處理常式,系統會忽略該區塊,也不會執行。
設計使用事件的系統時,請考量是否可支援相同事件處理常式的多個執行個體,或是否建議採用這種做法。
工作區版面配置
從左到右排版螢幕畫面的方法有兩種。一種方法是從左側的工具列開始,中間是工作區,右側則是輸出視覺化資料。這個版面配置會用於 Scratch 1 版和 Made with Code。
另一種方式是從左側的輸出資料視覺化開始,中間是工具列,右側是工作區。這個版面配置會用於 Scratch 2 版,以及大部分的 Blockly 應用程式。
無論是哪種情況,工作區都應延伸至可用的螢幕大小,因為使用者需要盡可能擁有足夠的編程空間。如上方螢幕截圖所示,第一個版面配置在寬螢幕上運作不佳,因為使用者程式碼和輸出視覺化效果是分開的。而第二個版面配置則可為較大的程式提供額外空間,同時讓所有三個區段保持緊密相連。
使用者也應該先考慮要解決的問題,然後查看提供的工具,然後再開始編寫程式,這也是合乎邏輯的做法。
當然,阿拉伯文和希伯來文的翻譯內容必須反轉整個順序。
在某些情況下,例如使用少量簡單的區塊時,工具箱可能會出現在工作區上方或下方。在這些情況下,Blockly 支援工具箱中的水平捲動功能,但應謹慎使用。
建議:將節目圖表放置在工具列旁邊。