Pemeriksaan koneksi

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:

Blok daftar kosong, terhubung ke blok akar kuadrat, terhubung ke
blok huruf besar

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:

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

blok nilai yang menerima satu jenis

Menerima beberapa jenis

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

blok nilai yang menerima beberapa jenis

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.

blok nilai yang menerima jenis

Subjenis yang ditampilkan

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

blok nilai yang mengembalikan tipe dan supertype-nya

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.

blok nilai yang menampilkan jenis berparameter dan tidak berparameter
(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.

blok pernyataan yang memiliki urutan paksa

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.

blok pernyataan yang memungkinkan 
banyak blok tengah

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.

blok pernyataan yang tidak mengizinkan blok tengah

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:

  1. Anda harus menyertakan minimal satu entri dari kedua grup sebelumnya pemeriksaan koneksi pada pemeriksaan koneksi berikutnya blok pertama.

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

blok pernyataan yang dapat diikuti oleh 
banyak satu jenis blok, atau
lebih dari satu, tetapi tidak keduanya

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.