Kiểm tra kết nối

Các tuỳ chọn kiểm tra kết nối hạn chế những kết nối (và trong đó có các quy tắc chặn) có thể kết nối với nhau.

Tính năng kiểm tra kết nối rất hữu ích cho các loại lập mô hình. Ví dụ: 3 khối sau đây không có doanh nghiệp nào được kết nối vì chúng đại diện cho mã trả về các loại khác nhau:

Một khối danh sách trống, được kết nối với một khối căn bậc hai, được kết nối với một khối chữ hoa

Bạn có thể sử dụng chế độ kiểm tra kết nối để ngăn các khối này kết nối. Điều này giúp người dùng nhận được phản hồi ngay lập tức và tránh được nhiều lỗi đơn giản.

Cách hoạt động

Mọi kết nối đều có thể được liên kết với một quy trình "kiểm tra kết nối", là một mảng chuỗi có thể có giá trị rỗng.

Hai kết nối có thể kết nối nếu:

  1. Đây là các loại tương thích (ví dụ: đầu ra kết nối với đầu vào).
  2. Chúng có ít nhất một chuỗi trong quy trình kiểm tra kết nối chung.

Ví dụ: hai bước kiểm tra sau đây có thể kết nối vì chúng dùng chung chuỗi 'apple':

['apple', 'ball', 'cat']
['apple', 'bear', 'caterpillar']

Nhưng hai bước kiểm tra này không kết nối được vì chúng không chia sẻ chuỗi nào:

['apple', 'ball', 'cat']
['ape', 'bear', 'caterpillar']

Có một trường hợp đặc biệt khác. Nếu một trong hai mảng là null, thì 2 kết nối cũng có thể kết nối. Điều này cho phép bạn xác định các kết nối có thể kết nối với bất cứ thứ gì.

null
['ape', 'bear', 'caterpillar]

Đặt các bước kiểm tra

Theo mặc định, mọi kết nối đều có tính năng kiểm tra kết nối null, nghĩa là có thể kết nối với bất cứ thứ gì. Bạn cần chỉ định hoạt động kiểm tra kết nối theo cách thủ công.

Cách chỉ định lượt kiểm tra kết nối cho các kết nối sẽ khác nhau, tuỳ thuộc vào việc bạn sử dụng định nghĩa khối JSON hay định nghĩa khối JavaScript.

JSON

Đối với các kết nối cấp cao nhất, bạn có thể trực tiếp gán yêu cầu kiểm tra cho thuộc tính xác định kết nối. Giá trị bạn chỉ định có thể là null, một chuỗi (sẽ trở thành mục nhập duy nhất trong quá trình kiểm tra kết nối) hoặc một mảng chuỗi.

{
  'type': 'custom_block',

  'output': null,
  'nextStatement': 'a connection check entry',
  'previousStatement': ['four', 'connection', 'check', 'entries']
}

Đối với dữ liệu đầu vào, bạn có thể gán yêu cầu kiểm tra cho thuộc tính check của định nghĩa đầu vào. Nếu thuộc tính check không tồn tại, bước kiểm tra này sẽ được xem là null. Giá trị bạn chỉ định có thể là một chuỗi hoặc một mảng chuỗi.

{
  'type': 'custom_block',
  'message0': '%1 %2',

  'args0': [
    {
      'type': 'input_value',
      'check': 'a connection check entry'
    },
    {
      'type': 'input_statement',
      'check': ['four', 'connection', 'check', 'entries']
    }
  ]
}

JavaScript

Đối với các kết nối cấp cao nhất, bạn có thể chuyển trực tiếp việc kiểm tra đến phương thức xác định kết nối. Nếu bạn không truyền một giá trị, thì lượt kiểm tra đó sẽ được xem là null. Giá trị bạn chuyển có thể là một chuỗi (sẽ trở thành mục nhập duy nhất trong quá trình kiểm tra kết nối) hoặc một mảng chuỗi.

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']);
  }
}

Đối với dữ liệu đầu vào, bạn có thể chuyển bước kiểm tra đến phương thức setCheck sau khi xác định dữ liệu đầu vào. Nếu phương thức setCheck không được gọi, thì bước kiểm tra này sẽ được coi là null. Giá trị bạn chuyển có thể là một chuỗi hoặc một mảng chuỗi.

Blockly.Blocks['custom_block'] = {
  init: function() {
    this.appendValueInput('NAME')
        .setCheck('a connection check entry');
    this.appendStatementInput('NAME')
        .setCheck(['four', 'connection', 'check', 'entries']);
  }
}

Chuỗi kiểm tra được tích hợp sẵn

Các khối tích hợp sẵn có các bước kiểm tra kết nối với các giá trị 'Array', 'Boolean', 'Colour', 'Number''String'. Nếu muốn các khối của mình tương tác với các khối tích hợp sẵn, bạn có thể sử dụng các giá trị này để làm cho chúng tương thích.

Ví dụ về giá trị

Khi xác định các lượt kiểm tra kết nối cho đầu vào và đầu ra, thông thường, bạn nên coi các lượt kiểm tra này là loại đại diện.

Quy trình kiểm tra của dữ liệu đầu vào phải bao gồm mọi "loại" mà chúng chấp nhận, còn các lần kiểm tra của dữ liệu đầu ra phải bao gồm chính xác nội dung chúng "trả về".

Chấp nhận một loại

Trong trường hợp cơ bản nhất khi muốn tạo một khối "chấp nhận" hoặc "trả về" một loại, bạn cần thêm loại đó vào quá trình kiểm tra kết nối.

khối giá trị chấp nhận một loại duy nhất

Chấp nhận nhiều loại

Để tạo một khối "chấp nhận" nhiều loại, bạn cần đưa mọi loại được chấp nhận vào phần kiểm tra kết nối của mục nhập.

một khối giá trị chấp nhận nhiều kiểu

Theo quy ước, nếu một đầu ra đôi khi có thể được chấp nhận trong nhiều trường hợp (ví dụ: nếu đôi khi bạn cho phép sử dụng số dưới dạng chuỗi), thì kết quả sẽ bị hạn chế hơn và(các) dữ liệu đầu vào phải được cho phép nhiều hơn. Quy ước này đảm bảo các dữ liệu đầu ra không kết nối với nhau ở nơi không được hỗ trợ.

Chấp nhận mọi loại

Để tạo một khối "chấp nhận" bất kỳ loại nào, bạn cần đặt chế độ kiểm tra kết nối của đầu vào thành null.

một khối giá trị chấp nhận mọi loại

Loại dữ liệu trả về cụ thể

Để tạo một khối "trả về" một loại phụ, bạn cần đưa cả loại và siêu loại vào quá trình kiểm tra kết nối của đầu ra.

một khối giá trị trả về kiểu dữ liệu và siêu kiểu

Trong trường hợp của các loại phụ, bạn có thể có nhiều lượt kiểm tra trong một lượt kiểm tra đầu ra, vì khối này luôn "trả về" cả hai kiểu.

Trả về các loại có tham số

Để tạo một khối "trả về" loại có tham số, bạn cần bao gồm cả phiên bản có tham số và phiên bản không có tham số trong quá trình kiểm tra kết nối của đầu ra.

Tuỳ thuộc vào mức độ nghiêm ngặt mà bạn muốn ngôn ngữ chặn, bạn cũng có thể muốn thêm (các) biến thể của loại.

một khối giá trị trả về loại có tham số và loại không có tham số

Cũng giống như với các loại phụ, bạn có thể có nhiều lượt kiểm tra trong một lượt kiểm tra đầu ra trong trường hợp này, vì khối này luôn "trả về" cả hai kiểu.

Ví dụ về ngăn xếp hoặc câu lệnh

Có một số cách phổ biến để nhà phát triển xác định các quy trình kiểm tra cho kết nối trước đó và tiếp theo. Thường thì bạn coi những việc này là hạn chế thứ tự của các khối.

Kết nối tiếp theo nên bao gồm khối nào nên theo sau khối hiện tại và các kết nối trước đó bao gồm khối hiện tại "là".

Sắp xếp các khối theo thứ tự

Để tạo một tập hợp các khối kết nối theo thứ tự xác định, bạn cần đưa vào những khối nào sẽ theo sau khối hiện tại trong lần kiểm tra kết nối tiếp theo và "là" khối hiện tại trong lần kiểm tra kết nối trước đó.

khối câu lệnh có thứ tự bắt buộc

Cho phép nhiều khối ở giữa

Để tạo một tập hợp các khối theo thứ tự cho phép nhiều khối ở giữa, bạn cần thêm ít nhất một mục nhập từ lần kiểm tra kết nối trước đó của khối ở giữa trong lần kiểm tra kết nối tiếp theo của khối ở giữa. Điều này cho phép nhiều nội dung khác theo dõi khối.

khối câu lệnh cho phép nhiều khối ở giữa

Không cho phép khối ở giữa

Để tạo một tập hợp các khối theo thứ tự trong đó các khối ở giữa là không bắt buộc, bạn cần bao gồm ít nhất một mục nhập từ lần kiểm tra kết nối trước đó của khối ở giữa và lần kiểm tra kết nối trước đó của khối cuối cùng trong lần kiểm tra kết nối tiếp theo của khối đầu tiên. Điều này cho phép theo sau khối đầu tiên là khối ở giữa hoặc khối cuối cùng.

khối câu lệnh không cho phép khối ở giữa

Một trong hai hoặc ngăn xếp

Để tạo một khối chỉ có thể theo sau là các khối từ một nhóm hoặc khối từ một nhóm khác (chứ không phải cả hai), bạn cần thực hiện 2 việc:

  1. Bạn cần thêm ít nhất một mục nhập từ cả hai lần kiểm tra kết nối trước đó của nhóm trong lần kiểm tra kết nối tiếp theo của khối đầu tiên.

  2. Bạn cần xác định các lần kiểm tra kết nối tiếp theo của các nhóm để chỉ bao gồm các giá trị có trong lần kiểm tra kết nối trước đó (vì vậy, bạn chỉ có thể theo dõi các giá trị đó bằng các khối của cùng một nhóm).

các khối câu lệnh có thể theo sau là nhiều khối của một loại hoặc nhiều khối khác, nhưng không phải cả hai

Các điểm hạn chế

Hệ thống này khá mạnh mẽ và có thể giải quyết nhiều trường hợp sử dụng, nhưng cũng có một số hạn chế.

Hạn chế ngữ cảnh rộng hơn

Bản thân hệ thống này không hỗ trợ hạn chế "ngữ cảnh lớn hơn" trong đó kết nối được phép kết nối. Ví dụ: bạn không thể nói rằng khối break chỉ được phép tồn tại bên trong khối loop. Hệ thống kiểm tra kết nối chỉ xem xét 2 kết nối tức thì đang được kết nối.

Bạn có thể hỗ trợ việc này bằng cách sử dụng hệ thống sự kiện để theo dõi các sự kiện di chuyển khối và kiểm tra xem khối có vị trí không chính xác hay không.

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;
  },
}

Kiểu chung

Hệ thống này không hỗ trợ xác định các loại chung. Ví dụ: bạn không thể tạo khối "Identity" (Nhận dạng) để "trả về" bất kỳ dữ liệu đầu vào nào.

Bạn có thể hỗ trợ phần nào về việc này bằng cách chủ động thay đổi hoạt động kiểm tra kết nối trên đầu ra của khối cho khớp với đầu vào của khối. Bạn có thể sử dụng hệ thống sự kiện để theo dõi nhằm chặn các sự kiện di chuyển.

Blockly.Blocks['custom_block'] = {
  init: function() { }

  onchange: function(e) {
    if (e.type !== Blockly.Events.BlockMove) return;
    this.setOutput(
        true, this.getInputTargetBlock()?.outputConnection.getCheck());
  }
}

Tuy nhiên, nếu khối được kết nối cũng chung, thì khối này không hoạt động chính xác. Không có cách giải quyết tốt cho trường hợp này.

Trình kiểm tra kết nối

Nếu hệ thống này không phù hợp với trường hợp sử dụng của bạn, bạn cũng có thể thay đổi cách so sánh các bước kiểm tra kết nối bằng cách tạo một trình kiểm tra kết nối tuỳ chỉnh.

Ví dụ: nếu muốn tạo một hệ thống nâng cao hơn để xử lý một số giới hạn của hệ thống này, bạn có thể tạo trình kiểm tra kết nối tuỳ chỉnh.