Pemeriksaan koneksi membatasi koneksi mana (dan untuk itu pemblokiran) yang dapat terhubung satu sama lain.
Pemeriksaan koneksi berguna untuk jenis pemodelan. Misalnya, tiga blok tidak memiliki hubungan bisnis, karena mereka mewakili kode yang menampilkan jenis yang berbeda:
Pemeriksaan koneksi dapat digunakan untuk mencegah blok ini terhubung. Ini memberi pengguna masukan seketika dan mencegah banyak kesalahan sederhana.
Cara kerjanya
Setiap koneksi dapat dikaitkan dengan "pemeriksaan koneksi" yang merupakan nullable array {i>string<i}.
Dua koneksi dapat terhubung jika:
- Keduanya merupakan jenis yang kompatibel (misalnya output yang terhubung ke input).
- Mereka memiliki setidaknya satu string dalam pemeriksaan koneksi bersama.
Misalnya, dua pemeriksaan berikut dapat terhubung, karena keduanya berbagi
String 'apple'
:
['apple', 'ball', 'cat']
['apple', 'bear', 'caterpillar']
Namun, kedua pemeriksaan ini tidak dapat terhubung karena tidak berbagi string apa pun:
['apple', 'ball', 'cat']
['ape', 'bear', 'caterpillar']
Ada satu kasus khusus lainnya. Jika salah satu array adalah null
, maka kedua
koneksi jarak jauh juga dapat terhubung. Hal ini memungkinkan Anda menentukan
koneksi yang dapat menghubungkan
menjadi apa saja.
null
['ape', 'bear', 'caterpillar]
Menetapkan pemeriksaan
Secara default, semua koneksi memiliki pemeriksaan koneksi null
, yang berarti koneksi tersebut dapat
terhubung ke apa saja. Pemeriksaan koneksi harus ditetapkan secara manual.
Cara Anda menetapkan pemeriksaan koneksi ke koneksi berbeda-beda bergantung pada baik Anda menggunakan definisi blok JSON maupun definisi blok JavaScript.
JSON
Untuk koneksi tingkat atas, Anda menetapkan pemeriksaan langsung ke properti yang
mendefinisikan koneksi. Nilai yang Anda tetapkan dapat berupa null
, string (yang
menjadi satu-satunya entri dalam pemeriksaan koneksi), atau array {i>string<i}.
{
'type': 'custom_block',
'output': null,
'nextStatement': 'a connection check entry',
'previousStatement': ['four', 'connection', 'check', 'entries']
}
Untuk input, Anda dapat menetapkan pemeriksaan ke properti check
input
definisi. Jika properti check
tidak ada, pemeriksaan akan dianggap
null
. Nilai yang Anda tetapkan dapat 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 tingkat atas, Anda dapat meneruskan
pemeriksaan langsung ke metode yang
mendefinisikan koneksi. Jika Anda tidak meneruskan nilai, pemeriksaan akan dianggap
null
. Nilai yang Anda teruskan bisa berupa string (yang menjadi satu-satunya entri di
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 akan
dianggap sebagai 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 Anda ingin blok Anda
memiliki interoperabilitas dengan blok bawaan, Anda dapat
menggunakan nilai ini untuk membuatnya
yang kompatibel.
Contoh nilai
Saat menentukan pemeriksaan koneksi untuk input dan output, biasanya Anda menganggap pemeriksaan sebagai representasi jenis.
Input pemeriksaan harus menyertakan setiap "jenis" yang mereka terima, dan menghasilkan pemeriksaan harus menyertakan persis apa yang "ditampilkan".
Menerima satu jenis
Dalam kasus paling dasar di mana Anda ingin membuat blok yang "menerima" atau "mengembalikan" satu jenis lagi, Anda perlu memasukkan tipe itu dalam pemeriksaan koneksi koneksi.
Menerima beberapa jenis
Untuk membuat blok yang "menerima" beberapa jenis data, Anda harus menyertakan tipe yang diterima dalam pemeriksaan koneksi input.
Berdasarkan konvensi, apakah output terkadang dapat diterima dalam beberapa situasi (misalnya jika Anda mengizinkan angka kadang-kadang digunakan sebagai string) output-nya harus lebih ketat, dan inputnya harus lebih permisif. Konvensi ini memastikan bahwa {i>output<i} tidak terhubung di tempat yang tidak didukung.
Terima jenis apa pun
Untuk membuat blok yang "menerima" tipe apa pun, Anda perlu mengatur
pemeriksaan koneksi ke null
.
Subjenis yang ditampilkan
Untuk membuat blok yang "menampilkan" subjenis, Anda harus menyertakan jenis dan supertype dalam pemeriksaan koneksi output.
Dalam hal subtipe, tidak apa-apa untuk memiliki beberapa pemeriksaan dalam pemeriksaan {i>output<i}, karena blok selalu "kembali" kedua jenis tersebut.
Menampilkan jenis berparameter
Untuk membuat blok yang "menampilkan" tipe berparameter, Anda harus menyertakan versi berparameter dan versi tidak berparameter dalam file pemeriksaan koneksi.
Bergantung pada seberapa ketat bahasa blok yang Anda inginkan, Anda mungkin juga ingin menyertakan varians jenis.
Sama seperti subtipe, Anda dapat memiliki beberapa pemeriksaan dalam pemeriksaan output dalam hal ini, karena blok selalu "kembali" kedua jenis tersebut.
Contoh stack atau pernyataan
Ada beberapa cara umum yang digunakan developer untuk menentukan pemeriksaan koneksi jarak jauh. Biasanya Anda menganggapnya sebagai pembatasan urutan blok.
Koneksi berikutnya harus mencakup blok mana yang harus mengikuti koneksi saat ini, dan koneksi sebelumnya mencakup apa yang dimaksud dengan blok saat ini.
Mengatur blok secara berurutan
Untuk membuat kumpulan blok yang terhubung dalam urutan yang ditentukan, Anda perlu menyertakan blok mana yang harus mengikuti yang sekarang di pemeriksaan koneksi berikutnya, dan "apa yang dimaksud dengan" blok saat ini dalam pemeriksaan koneksi sebelumnya.
Izinkan banyak blok tengah
Untuk membuat satu set blok berurutan yang memungkinkan banyak blok tengah, Anda harus menyertakan setidaknya satu entri dari pemeriksaan koneksi sebelumnya di blok tengah pemeriksaan koneksi berikutnya di blok tengah. Hal ini memungkinkan pemblokiran diikuti dengan sendirinya.
Jangan izinkan blok tengah
Untuk membuat kumpulan blok yang diurutkan dengan blok tengah opsional, Anda perlu untuk menyertakan setidaknya satu entri dari koneksi sebelumnya dari blok tengah untuk blok terakhir, dan pemeriksaan koneksi sebelumnya di blok pertama berikutnya, pemeriksaan koneksi. Ini memungkinkan blok pertama diikuti oleh titik tengah atau blok terakhir.
Salah satu atau stack
Untuk membuat blok yang hanya dapat diikuti oleh blok dari satu grup, atau blok dari yang lain (dan bukan keduanya), Anda perlu melakukan dua hal:
Anda harus menyertakan minimal satu entri dari kedua grup sebelumnya pemeriksaan koneksi pada pemeriksaan koneksi berikutnya blok pertama.
Anda perlu menentukan pemeriksaan koneksi berikutnya untuk hanya menyertakan nilai yang ada dalam pemeriksaan koneksi sebelumnya (jadi mereka hanya dapat oleh blok dari grup yang sama).
Batasan
Sistem ini cukup tangguh dan dapat menyelesaikan banyak kasus penggunaan, tetapi memiliki beberapa keterbatasan praktik.
Membatasi konteks yang lebih besar
Sistem ini tidak mendukung pembatasan "konteks yang lebih besar" inci
di mana sebuah koneksi diizinkan
untuk terhubung. Misalnya, Anda tidak bisa
mengatakan bahwa
Blok break
hanya boleh berada di dalam blok loop
. Koneksi
sistem pemeriksaan hanya mempertimbangkan
dua koneksi langsung yang terhubung.
Anda dapat mendukungnya menggunakan sistem peristiwa untuk memproses peristiwa pemindahan blok dan periksa apakah blok diposisikan dengan benar.
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 mendukung penentuan jenis generik. Misalnya, Anda tidak dapat membuat sebuah "Identitas" blok, yang "mengembalikan" apa pun inputnya.
Anda dapat sedikit mendukung hal ini dengan mengubah secara aktif pemeriksaan koneksi di output blok agar sesuai dengan inputnya. Yang dapat Anda lakukan dengan menggunakan sistem peristiwa untuk untuk memproses peristiwa pemblokiran 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 bersifat generik, hal ini tidak berfungsi dengan benar. Tidak ada solusi yang tepat untuk kasus ini.
Pemeriksa koneksi
Jika sistem ini tidak berfungsi untuk kasus penggunaan Anda, Anda juga dapat mengubah cara pemeriksaan koneksi dibandingkan dengan membuat pemindai koneksi kustom.
Misalnya, jika Anda ingin membuat sistem yang lebih canggih yang menangani beberapa batasan yang satu ini, Anda dapat membuat pemeriksa koneksi.