Pemeriksaan koneksi membatasi koneksi mana (dan oleh karenanya blok) yang dapat terhubung satu sama lain.
Pemeriksaan koneksi berguna untuk jenis pemodelan. Misalnya, tiga blok berikut tidak memiliki bisnis yang terhubung karena blok tersebut mewakili kode yang menampilkan jenis yang berbeda:
Pemeriksaan koneksi dapat digunakan untuk mencegah blok ini terhubung. Hal ini memberi pengguna masukan secara instan dan mencegah berbagai kesalahan sederhana.
Cara kerjanya
Setiap koneksi dapat dikaitkan dengan "pemeriksaan koneksi" yang merupakan array string nullable.
Dua koneksi dapat terhubung jika:
- Parameter ini adalah jenis yang kompatibel (misalnya output yang terhubung ke input).
- Mereka memiliki setidaknya satu string dalam pemeriksaan koneksi yang sama.
Misalnya, dua pemeriksaan berikut dapat terhubung karena menggunakan string 'apple'
yang sama:
['apple', 'ball', 'cat']
['apple', 'bear', 'caterpillar']
Namun, kedua pemeriksaan ini tidak dapat terhubung karena tidak menggunakan string yang sama:
['apple', 'ball', 'cat']
['ape', 'bear', 'caterpillar']
Ada satu kasus khusus lainnya. Jika salah satu array bernilai null
, kedua
koneksi juga dapat terhubung. Hal ini memungkinkan Anda menentukan koneksi yang dapat terhubung
ke apa saja.
null
['ape', 'bear', 'caterpillar]
Menetapkan pemeriksaan
Secara default, semua koneksi memiliki pemeriksaan koneksi null
, yang berarti koneksi dapat
terhubung ke apa pun. Pemeriksaan koneksi harus ditetapkan secara manual.
Cara menetapkan pemeriksaan koneksi ke koneksi berbeda-beda, bergantung pada apakah Anda menggunakan definisi blok JSON atau definisi blok JavaScript.
JSON
Untuk koneksi level teratas, Anda menetapkan pemeriksaan langsung ke properti yang menentukan koneksi. Nilai yang Anda tetapkan bisa berupa null
, string (yang
menjadi satu-satunya entri dalam pemeriksaan koneksi), atau array string.
{
'type': 'custom_block',
'output': null,
'nextStatement': 'a connection check entry',
'previousStatement': ['four', 'connection', 'check', 'entries']
}
Untuk input, Anda dapat menetapkan pemeriksaan ke properti check
definisi
input. Jika properti check
tidak ada, pemeriksaan dianggap
null
. Nilai yang Anda tetapkan bisa berupa string, atau array string.
{
'type': 'custom_block',
'message0': '%1 %2',
'args0': [
{
'type': 'input_value',
'check': 'a connection check entry'
},
{
'type': 'input_statement',
'check': ['four', 'connection', 'check', 'entries']
}
]
}
JavaScript
Untuk koneksi level atas, Anda dapat meneruskan pemeriksaan langsung ke metode yang
menentukan koneksi. Jika Anda tidak meneruskan nilai, pemeriksaan dianggap
null
. Nilai yang Anda teruskan bisa berupa string (yang menjadi satu-satunya entri dalam
pemeriksaan koneksi), atau array string.
Blockly.Blocks['custom_block'] = {
init: function() {
this.setOutput(true); // null check
this.setNextStatement(true, 'a connection check entry');
this.setPreviousStatement(true, ['four', 'connection', 'check', 'entries']);
}
}
Untuk input, Anda dapat meneruskan pemeriksaan ke metode setCheck
, setelah
menentukan input. Jika metode setCheck
tidak dipanggil, pemeriksaan
dianggap null
. Nilai yang Anda teruskan bisa berupa string, atau array string.
Blockly.Blocks['custom_block'] = {
init: function() {
this.appendValueInput('NAME')
.setCheck('a connection check entry');
this.appendStatementInput('NAME')
.setCheck(['four', 'connection', 'check', 'entries']);
}
}
String pemeriksaan bawaan
Blok bawaan memiliki pemeriksaan koneksi dengan nilai 'Array'
, 'Boolean'
, 'Colour'
, 'Number'
, dan 'String'
. Jika ingin blok Anda
beroperasi dengan blok bawaan, Anda dapat menggunakan nilai ini untuk membuatnya
kompatibel.
Contoh nilai
Saat Anda menentukan pemeriksaan koneksi untuk input dan output, biasanya Anda harus menganggap pemeriksaan tersebut sebagai jenis yang mewakili.
Pemeriksaan input harus mencakup setiap "jenis" yang diterima, dan pemeriksaan output harus menyertakan persis apa yang "ditampilkan".
Menerima satu jenis
Pada kasus paling dasar, yaitu Anda ingin membuat blok yang "menerima" atau "mengembalikan" satu jenis, Anda harus menyertakan jenis tersebut dalam pemeriksaan koneksi koneksi.
Terima beberapa jenis
Untuk membuat blok yang "menerima" beberapa jenis, Anda harus menyertakan setiap jenis yang diterima dalam pemeriksaan koneksi input.
Berdasarkan konvensi, jika suatu output terkadang dapat diterima dalam beberapa situasi (misalnya jika Anda mengizinkan angka untuk terkadang digunakan sebagai string), output harus lebih ketat, dan input harus lebih permisif. Konvensi ini memastikan bahwa output tidak akan terhubung di tempat yang tidak didukung.
Terima semua jenis
Untuk membuat blok yang "menerima" jenis apa pun, Anda perlu menyetel pemeriksaan koneksi
input ke null
.
Tampilkan subjenis
Untuk membuat blok yang "menampilkan" subjenis, Anda harus menyertakan jenis dan supertype dalam pemeriksaan koneksi output.
Dalam kasus subjenis, Anda dapat memiliki beberapa pemeriksaan dalam pemeriksaan output, karena blok selalu "menampilkan" kedua jenis.
Menampilkan jenis berparameter
Untuk membuat blok yang "menampilkan" jenis parameter, Anda harus menyertakan versi berparameter dan versi yang tidak diparameterisasi dalam pemeriksaan koneksi output.
Bergantung pada seberapa ketat bahasa blok yang Anda inginkan, Anda juga dapat menyertakan varian jenis.
Sama seperti subjenis, dalam kasus ini Anda dapat memiliki beberapa pemeriksaan dalam pemeriksaan output, karena blok selalu "menampilkan" kedua jenis tersebut.
Contoh stack atau pernyataan
Ada beberapa cara umum developer menentukan pemeriksaan untuk koneksi sebelumnya dan berikutnya. Biasanya Anda menganggap ini sebagai pembatasan urutan blok.
Koneksi berikutnya harus mencakup blok mana yang harus mengikuti koneksi saat ini, dan koneksi sebelumnya menyertakan apa blok saat ini.
Menjaga blok agar berurutan
Untuk membuat kumpulan blok yang terhubung dalam urutan yang ditentukan, Anda harus menyertakan blok mana yang harus mengikuti blok saat ini dalam pemeriksaan koneksi berikutnya, dan blok saat ini dalam pemeriksaan koneksi sebelumnya.
Izinkan banyak blok tengah
Untuk membuat kumpulan blok terurut yang memungkinkan banyak blok tengah, Anda harus menyertakan setidaknya satu entri dari pemeriksaan koneksi blok tengah sebelumnya dalam pemeriksaan koneksi blok tengah berikutnya. Hal ini memungkinkan blok tersebut diikuti oleh blok itu sendiri.
Jangan izinkan blok tengah
Untuk membuat kumpulan blok yang diurutkan yang bersifat opsional, Anda harus menyertakan setidaknya satu entri dari pemeriksaan koneksi blok tengah sebelumnya, dan pemeriksaan koneksi sebelumnya dari blok pertama dalam pemeriksaan koneksi blok pertama. Hal ini memungkinkan blok pertama diikuti oleh blok tengah, atau blok terakhir.
Salah satu atau tumpukan
Untuk membuat blok yang hanya dapat diikuti oleh blok dari satu grup, atau blok dari grup lain (dan bukan keduanya), Anda harus melakukan dua hal:
Anda perlu menyertakan setidaknya satu entri dari kedua pemeriksaan koneksi sebelumnya dalam grup pertama pada pemeriksaan koneksi blok pertama berikutnya.
Anda perlu menentukan pemeriksaan koneksi grup berikutnya agar hanya menyertakan nilai yang ada dalam pemeriksaan koneksi sebelumnya (sehingga hanya dapat diikuti oleh blok dari grup yang sama).
Batasan
Sistem ini cukup tangguh dan dapat menyelesaikan banyak kasus penggunaan, tetapi memiliki beberapa batasan.
Membatasi konteks yang lebih besar
Sistem ini tidak, dengan sendirinya, mendukung pembatasan "konteks yang lebih besar" tempat
koneksi diizinkan untuk terhubung. Misalnya, Anda tidak dapat mengatakan bahwa
blok break
hanya diizinkan ada di dalam blok loop
. Sistem pemeriksaan koneksi hanya mempertimbangkan dua koneksi langsung yang sedang terhubung.
Anda dapat mendukungnya dengan menggunakan sistem peristiwa untuk memproses peristiwa pemindahan blok dan memeriksa apakah blok diposisikan dengan salah.
Blockly.Blocks['custom_block'] = {
init: function() { }
onchange: function(e) {
if (this.workspace.isDragging()) return;
if (e.type !== Blockly.Events.BlockMove) return;
if (!this.getSurroundLoop()) this.outputConnection.disconnect();
}
loopTypes: new Set(); // Your valid *block types* (not connection checks).
getSurroundLoop: function () {
let block = this.getSurroundParent();
do {
if (loopTypes.has(block.type)) return block;
block = block.getSurroundParent();
} while (block);
return null;
},
}
Jenis generik
Sistem ini tidak dengan sendirinya mendukung penentuan jenis generik. Misalnya, Anda tidak dapat membuat blok "Identitas", yang "menampilkan" apa pun inputnya.
Anda dapat sedikit mendukung hal ini dengan mengubah secara aktif pemeriksaan koneksi pada output blok agar cocok dengan input-nya. Yang dapat Anda lakukan dengan menggunakan sistem peristiwa untuk mendeteksi peristiwa pemindahan.
Blockly.Blocks['custom_block'] = {
init: function() { }
onchange: function(e) {
if (e.type !== Blockly.Events.BlockMove) return;
this.setOutput(
true, this.getInputTargetBlock()?.outputConnection.getCheck());
}
}
Namun, jika blok yang terhubung juga generik, ini tidak akan berfungsi dengan benar. Untuk kasus ini, belum ada solusi yang tepat.
Pemeriksa koneksi
Jika sistem ini tidak berfungsi untuk kasus penggunaan Anda, Anda juga dapat mengubah cara pemeriksaan koneksi dibandingkan dengan membuat pemeriksa koneksi kustom.
Misalnya, jika ingin membuat sistem yang lebih canggih yang menangani beberapa batasan sistem ini, Anda dapat membuat pemeriksa koneksi kustom.