Blok Kustom: Paradigma Blok

Ada beberapa paradigma yang dapat dipilih ketika merancang aplikasi yang menggunakan Blockly. Pilihan ini harus dipertimbangkan lebih awal, karena mempengaruhi blok yang dibutuhkan pengguna.

Konfigurasi

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

Ini menciptakan blok yang tidak dapat dihapus dan tidak dipindahkan yang menyimpan semua konfigurasi pengguna. Ruang kerja dapat diserialisasi kapan saja untuk menentukan konfigurasi saat ini.

Aplikasi tersebut dapat secara otomatis menonaktifkan pemblokiran apa pun yang tidak yang terhubung ke blok {i>root<i}. Hal ini dapat dilakukan dengan satu baris:

workspace.addChangeListener(Blockly.Events.disableOrphans);

Program Seri

Mayoritas aplikasi Blockly dirancang untuk membuat program. Pengguna menumpuk blok yang dieksekusi secara berurutan.

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

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

import {javascriptGenerator} from 'blockly/javascript';

var code = javascriptGenerator.workspaceToCode(workspace);

Program Paralel

Beberapa aplikasi Blockly memilih untuk mengeksekusi semua tumpukan blok dalam paralel, bukan serial. Contohnya adalah aplikasi musik di mana loop drum berjalan bersamaan dengan melodi.

Salah satu cara mengimplementasikan eksekusi paralel adalah dengan membuat kode untuk setiap blokir 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 target adalah JavaScript, array allCode mungkin akan membuat beberapa Penerjemah JS untuk eksekusi simultan. Jika bahasa target seperti Python, lalu array allCode dapat dirangkai menjadi satu program yang menggunakan modul threading.

Seperti halnya program paralel lainnya, keputusan cermat harus dibuat mengenai sumber daya bersama seperti variabel dan fungsi.

Program Berbasis Peristiwa

Pengendali peristiwa hanyalah fungsi yang dipanggil oleh sistem, bukan dibandingkan dengan program. Blok-blok ini bisa menampung tumpukan blok untuk dieksekusi, atau mereka mungkin {i>header<i} yang berada di atas tumpukan jumlah blok.

Beberapa pengembang suka menambahkan 'topi' ke bagian atas blok peristiwa sehingga mereka terlihat berbeda dari blok yang lain. Ini bukan tampilan {i>default<i} untuk Secara blok, tetapi dapat ditambahkan dengan mengganti konstanta perender ADD_START_HATS hingga true (Codelab perender kustom - Mengganti konstanta). atau dengan menambahkan tema dan mengatur opsi topi pada gaya blok. Selengkapnya informasi untuk mengatur topi di blok sebagai bagian dari tema dapat ditemukan di sini.

Dalam model berbasis peristiwa, wajar saja untuk membuat pengendali saat program dimulai. Dengan model ini, setiap blok pada ruang kerja tidak yang terhubung ke sebuah pengendali peristiwa akan diabaikan dan tidak akan dijalankan.

Saat mendesain sistem yang menggunakan peristiwa, pertimbangkan apakah sistem dimungkinkan atau diinginkan untuk mendukung beberapa {i>instance <i} peristiwa yang sama sebagai pengendali