Kiểm tra kết nối

Tính năng kiểm tra kết nối hạn chế những kết nối nào (và theo đó là các khối) có thể kết nối cho nhau.

Quy trình kiểm tra kết nối rất hữu ích cho các loại mô hình. Ví dụ: như sau ba khối không có doanh nghiệp nào được kết nối vì chúng biểu thị mã trả về nhiều 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 viết hoa

Bạn có thể sử dụng tính năng kiểm tra kết nối để ngăn các khối này kết nối. Chiến dịch này sẽ cung cấp cho người dùng phản hồi tức thì 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 lượt "kiểm tra kết nối" đây là một biến có thể có giá trị rỗng mảng chuỗi.

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

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

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

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

Nhưng 2 bước kiểm tra sau không kết nối được do không dùng chung bất kỳ 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ì hai mảng các kết nối cũng có thể kết nối. Quyền này cho phép bạn xác định các kết nối có thể kết nối cho bất kỳ thứ gì.

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

Thiết lập bước kiểm tra

Theo mặc định, tất cả các kết nối đều có tuỳ chọn kiểm tra kết nối null, nghĩa là chúng 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 bạn chỉ định hoạt động kiểm tra kết nối sẽ khác nhau tuỳ thuộc vào cho dù bạn đang sử dụng định nghĩa khối JSON hay định nghĩa khối JavaScript.

JSON

Đối với các mối kết nối cấp cao nhất, bạn trực tiếp chỉ định việc kiểm tra cho tài sản xác định kết nối. Giá trị bạn chỉ định có thể là null, một chuỗi ( 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 bước kiểm tra cho thuộc tính check của đầu vào định nghĩa. Nếu thuộc tính check không tồn tại, bước kiểm tra này sẽ được xem xét null Giá trị mà 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 chuyển một giá trị, bước kiểm tra này sẽ được xem là null. Giá trị bạn truyền có thể là một chuỗi (sẽ trở thành mục nhập duy nhất trong phương thức nhập 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 bạn đã xác định đầu vào. Nếu phương thức setCheck không được gọi, quá trình kiểm tra sẽ đã xem xét 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 có tính năng kiểm tra kết nối với giá trị 'Array', 'Boolean', 'Colour', 'Number''String'. Nếu bạn muốn chặn có khả năng tương tác với các khối tích hợp sẵn, nên bạn có thể sử dụng các giá trị này để khiến chúng tương thích.

Ví dụ về giá trị

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

Nguồn đầu vào nên bao gồm mọi "loại" mà chúng chấp nhận và đưa ra' séc phải bao gồm chính xác giá trị mà khách hàng "trả về".

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

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

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

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

Để tạo khối "chấp nhận" Bạn cần đưa vào mọi loại quảng cáo loại được chấp nhận trong bước kiểm tra kết nối của đầu vào.

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

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

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

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

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

Loại phụ của dữ liệu trả về

Để tạo khối "trả về" loại phụ, bạn cần bao gồm cả loại và siêu kiểu trong kiểm tra kết nối của đầu ra.

một khối giá trị trả về loại và siêu kiểu của nó

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

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

Để tạo khối "trả về" là loại có tham số, bạn cần phải đưa cả hai phiên bản có tham số và phiên bản không có tham số trong dữ liệu đầu ra kiểm tra kết nối.

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

một khối giá trị trả về loại có tham số và không có tham số
lượt chuyển đổi

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

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

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

Các kết nối tiếp theo phải bao gồm khối nào sẽ tuân theo 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à gì".

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 khối nào sẽ tuân theo khối hiện tại trong lần kiểm tra kết nối tiếp theo và khối hiện tại "là" gì trong lần kiểm tra kết nối trước đó.

các khối câu lệnh có lệnh 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 xếp theo thứ tự cho phép nhiều khối ở giữa, bạn cần có ít nhất một mục nhập từ lần xác nhận kết nối trước đó của khối giữa 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 theo dõi khối nhiều hơn.

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

Không cho phép chặn giữa

Để tạo một tập hợp các khối xếp 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ừ kết nối trước đó của khối giữa kiểm tra và kiểm tra kết nối trước đó của khối cuối cùng trong khối đầu tiên tiếp theo kiểm tra kết nối. Điều này cho phép khối đầu tiên được theo sau là một giữa hoặc khối cuối cùng.

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

Ngăn xếp hoặc ngăn xếp

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

  1. Bạn cần thêm ít nhất một mục nhập từ cả hai nhóm trước kiểm tra kết nối 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 nhóm kiểm tra kết nối tiếp theo để chỉ bao gồm các giá trị trong các lần kiểm tra kết nối trước đó (nên bạn chỉ có thể theo dõi theo khối của cùng một nhóm).

các khối câu lệnh có thể được theo sau bởi nhiều khối lệnh thuộc một loại, hoặc
là bội số của một giá trị khác, nhưng không thể bao gồm 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 vài trường hợp hạn chế.

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

Hệ thống này tự nó không hỗ trợ hạn chế "bối cảnh lớn hơn" inch kết nối được phép kết nối. Ví dụ: bạn không thể nói rằng một Khối break chỉ được phép tồn tại bên trong một khối loop. Kết nối hệ thống kiểm tra chỉ xem xét hai kết nối ngay lập tức đượ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 để nghe chặn di chuyển các sự kiện và kiểm tra xem khối có được định vị 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ợ việc xác định các kiểu chung. Ví dụ: bạn không thể tạo "Danh tính" khối mà "trả về" bất kể thông tin đầu vào là gì.

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

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 là khối 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.

Công cụ kiểm tra kết nối

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

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