Khối tuỳ chỉnh: Mô hình khối

Có một số mô hình để lựa chọn khi thiết kế một ứng dụng có sử dụng Blockly. Bạn nên cân nhắc các lựa chọn này sớm, vì chúng ảnh hưởng đến các khối mà người dùng sẽ cần.

Cấu hình

Nhiều ứng dụng Blockly được dùng để mô tả cấu hình thay vì các chương trình có thể thực thi. Các ứng dụng cấu hình thường bắt đầu bằng cách khởi chạy một khối cấp cơ sở trên không gian làm việc. Một ví dụ điển hình là thẻ Block Factory của Công cụ cho nhà phát triển 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);

Thao tác này sẽ tạo ra một khối không thể di chuyển, không thể di chuyển và chứa toàn bộ cấu hình của người dùng. Không gian làm việc có thể được chuyển đổi tuần tự bất kỳ lúc nào để xác định cấu hình hiện tại.

Các ứng dụng như vậy nên tự động tắt mọi khối không được kết nối với khối gốc. Bạn có thể thực hiện việc này chỉ với một dòng:

workspace.addChangeListener(Blockly.Events.disableOrphans);

Chương trình nối tiếp

Phần lớn các ứng dụng Blockly được thiết kế để tạo các chương trình nối tiếp. Người dùng xếp chồng các khối được thực thi theo thứ tự.

Mỗi khối (không bị tắt) trên không gian làm việc sẽ tạo thành một phần của chương trình. Nếu có nhiều ngăn xếp khối, các ngăn xếp cao hơn sẽ được thực thi trước. (Nếu hai ngăn xếp có cùng chiều cao, thì các ngăn xếp bên trái (bên phải ở chế độ RTL) sẽ được ưu tiên.)

Không gian làm việc có thể được xuất sang mã thực thi bất cứ lúc nào. Mã này có thể được thực thi phía máy khách trong JavaScript (sử dụng eval hoặc Thông dịch viên JS) hoặc phía máy chủ bằng bất kỳ ngôn ngữ nào.

import {javascriptGenerator} from 'blockly/javascript';

var code = javascriptGenerator.workspaceToCode(workspace);

Chương trình song song

Một số ứng dụng Blockly chọn thực thi tất cả các ngăn xếp của khối một cách song song thay vì theo tuần tự. Ví dụ: ứng dụng âm nhạc trong đó vòng lặp trống chạy đồng thời với một giai điệu.

Một cách để triển khai quá trình thực thi song song là tạo mã cho từng khối riêng lẻ:

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

Nếu ngôn ngữ đích là JavaScript, thì hệ thống có thể dùng mảng allCode để tạo nhiều Phiên dịch JS để thực thi đồng thời. Nếu ngôn ngữ đích là ngôn ngữ như Python, thì mảng allCode có thể được tập hợp thành một chương trình duy nhất sử dụng mô-đun phân luồng.

Giống như với bất kỳ chương trình song song nào, bạn phải đưa ra quyết định cẩn thận liên quan đến mọi tài nguyên dùng chung như biến và hàm.

Chương trình dựa trên sự kiện

Trình xử lý sự kiện chỉ là các hàm được hệ thống gọi chứ không phải do chương trình gọi. Các khối này có thể chứa các khối cần thực thi hoặc có thể là tiêu đề nằm phía trên một ngăn xếp khối.

Một số nhà phát triển muốn thêm "mũ" vào đầu khối sự kiện để trông khác biệt với các khối khác. Đây không phải là giao diện mặc định của Blockly, nhưng bạn có thể thêm bằng cách ghi đè hằng số kết xuất ADD_START_HATS vào true (Lớp học lập trình về trình kết xuất tuỳ chỉnh – Ghi đè hằng số) hoặc bằng cách thêm giao diện và đặt tuỳ chọn mũ trên kiểu khối. Bạn có thể xem thêm thông tin về cách đặt mũ trên các khối theo giao diện tại đây.

Trong mô hình dựa trên sự kiện, bạn cũng có thể tạo một trình xử lý để bắt đầu chương trình. Theo mô hình này, mọi khối trên không gian làm việc không được kết nối với trình xử lý sự kiện sẽ bị bỏ qua và không được thực thi.

Khi thiết kế một hệ thống sử dụng các sự kiện, hãy cân nhắc xem có thể hỗ trợ nhiều thực thể của cùng một trình xử lý sự kiện hay không.