Pemeriksaan koneksi

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:

Blok daftar kosong, terhubung ke blok root kuadrat, yang terhubung ke
blok berhuruf besar

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:

  1. Parameter ini adalah jenis yang kompatibel (misalnya output yang terhubung ke input).
  2. 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.

blok nilai yang menerima satu jenis

Terima beberapa jenis

Untuk membuat blok yang "menerima" beberapa jenis, Anda harus menyertakan setiap jenis yang diterima dalam pemeriksaan koneksi input.

blok nilai yang menerima beberapa jenis

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.

blok nilai yang menerima jenis apa pun

Tampilkan subjenis

Untuk membuat blok yang "menampilkan" subjenis, Anda harus menyertakan jenis dan supertype dalam pemeriksaan koneksi output.

blok nilai yang menampilkan jenis dan supertype-nya

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.

blok nilai yang menampilkan jenis berparameter dan jenis
yang tidak diparameterisasinya

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.

blok pernyataan yang memiliki urutan paksa

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.

blok pernyataan yang memungkinkan 
banyak blok tengah

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.

blok pernyataan yang tidak mengizinkan blok tengah

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:

  1. Anda perlu menyertakan setidaknya satu entri dari kedua pemeriksaan koneksi sebelumnya dalam grup pertama pada pemeriksaan koneksi blok pertama berikutnya.

  2. 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).

yang dapat diikuti oleh beberapa dari satu jenis blok, atau beberapa blok lainnya, tetapi tidak keduanya

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.