Blok Kustom: Paradigma Blok

Ada beberapa paradigma yang dapat dipilih saat mendesain aplikasi yang menggunakan Blockly. Pertimbangan atas pilihan ini harus dilakukan lebih awal, karena memengaruhi blok yang akan diperlukan pengguna.

Konfigurasi

Banyak aplikasi Blockly digunakan untuk mendeskripsikan konfigurasi, bukan program yang dapat dieksekusi. Aplikasi konfigurasi biasanya memulai dengan menginisialisasi satu blok tingkat root pada ruang kerja. Contoh yang bagus adalah tab Block Factory di 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);

Tindakan ini akan membuat blok yang tidak dapat dipindahkan dan tidak dapat dipindahkan yang menampung semua konfigurasi pengguna. Ruang kerja dapat diserialisasi kapan saja untuk menentukan konfigurasi saat ini.

Aplikasi tersebut mungkin ingin otomatis menonaktifkan blok apa pun yang tidak terhubung ke blok root. Hal ini dapat dilakukan dengan satu baris:

workspace.addChangeListener(Blockly.Events.disableOrphans);

Program Serial

Sebagian besar aplikasi Blockly dirancang untuk membuat program serial. Pengguna menumpuk blok yang dieksekusi secara berurutan.

Setiap blok (tidak dinonaktifkan) di ruang kerja akan menjadi bagian dari program. Jika ada beberapa stack blok, blok yang lebih tinggi akan dieksekusi terlebih dahulu. (Jika dua tumpukan memiliki tinggi yang kurang lebih sama, tumpukan ke kiri (kanan dalam mode RTL) akan diprioritaskan.)

Ruang kerja dapat diekspor ke kode yang dapat dieksekusi kapan saja. Kode ini dapat dijalankan di sisi klien di JavaScript (menggunakan eval atau Penafsir JS), atau sisi server dalam bahasa apa pun.

import {javascriptGenerator} from 'blockly/javascript';

var code = javascriptGenerator.workspaceToCode(workspace);

Program Paralel

Beberapa aplikasi Blockly memilih untuk menjalankan semua stack blok secara paralel, bukan secara berurutan. Contohnya adalah aplikasi musik dengan drum loop berjalan serentak dengan melodi.

Salah satu cara menerapkan eksekusi paralel adalah dengan membuat kode untuk setiap blok satu per satu:

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

Jika bahasa targetnya adalah JavaScript, array allCode kemudian dapat digunakan untuk membuat beberapa Penafsir JS untuk dieksekusi secara bersamaan. Jika bahasa targetnya seperti Python, array allCode dapat disusun ke dalam satu program yang menggunakan modul threading.

Seperti program paralel lainnya, keputusan yang cermat harus dibuat terkait resource bersama seperti variabel dan fungsi.

Program Berbasis Peristiwa

Pengendali peristiwa hanyalah fungsi yang dipanggil oleh sistem, bukan oleh program. Blok ini dapat menampung tumpukan blok yang akan dieksekusi, atau dapat berupa header yang berada di atas tumpukan blok.

Beberapa developer suka menambahkan 'topi' ke bagian atas blok peristiwa agar terlihat berbeda dari blok lainnya. Ini bukan tampilan default untuk Blockly, tetapi dapat ditambahkan dengan mengganti konstanta perender ADD_START_HATS ke true (Codelab Perender kustom - Ganti konstanta). atau dengan menambahkan tema dan menyetel opsi topi pada gaya blok. Informasi selengkapnya tentang cara menetapkan topi di blok sebagai bagian dari tema dapat ditemukan di sini.

Dalam model berbasis peristiwa, sebaiknya buat pengendali untuk dimulainya program. Pada model ini, setiap blok di ruang kerja yang tidak terhubung ke pengendali peristiwa akan diabaikan dan tidak akan dijalankan.

Saat mendesain sistem yang menggunakan peristiwa, pertimbangkan apakah memungkinkan atau diinginkan untuk mendukung beberapa instance pengendali peristiwa yang sama.