การตรวจสอบการเชื่อมต่อ

การตรวจสอบการเชื่อมต่อจะจำกัดการเชื่อมต่อ (และบล็อก) ที่เชื่อมต่อกันได้

การตรวจสอบการเชื่อมต่อมีประโยชน์สําหรับประเภทการประมาณ ตัวอย่างเช่น บล็อก 3 บล็อกต่อไปนี้ไม่ควรเชื่อมต่อกัน เนื่องจากแสดงโค้ดที่แสดงผลประเภทต่างๆ

บล็อกลิสต์ว่างที่เชื่อมต่อกับบล็อกรากที่สองที่เชื่อมต่อกับบล็อกตัวพิมพ์ใหญ่

คุณสามารถใช้การตรวจสอบการเชื่อมต่อเพื่อป้องกันไม่ให้บล็อกเหล่านี้เชื่อมต่อได้ ซึ่งจะช่วยให้ผู้ใช้ได้รับความคิดเห็นทันทีและป้องกันข้อผิดพลาดง่ายๆ หลายประการ

วิธีการทำงาน

การเชื่อมต่อทุกรายการจะเชื่อมโยงกับ "การตรวจสอบการเชื่อมต่อ" ซึ่งเป็นอาร์เรย์สตริงที่อนุญาตค่า Null ได้

การเชื่อมต่อ 2 รายการจะเชื่อมต่อกันได้ในกรณีต่อไปนี้

  1. อุปกรณ์เป็นประเภทที่เข้ากันได้ (เช่น เอาต์พุตที่เชื่อมต่อกับอินพุต)
  2. รายการเหล่านี้มีสตริงอย่างน้อย 1 รายการในการตรวจสอบการเชื่อมต่อร่วมกัน

ตัวอย่างเช่น การเชื่อมต่อที่มีการตรวจสอบ 2 รายการต่อไปนี้อาจเชื่อมต่อกันได้เนื่องจากใช้สตริง 'apple' เดียวกัน

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

แต่การเชื่อมต่อกับการตรวจสอบ 2 รายการนี้เชื่อมต่อไม่ได้เนื่องจากไม่มีสตริงใดๆ ที่แชร์กัน

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

ยังมีอีกกรณีพิเศษ 1 กรณี หากอาร์เรย์ใดอาร์เรย์หนึ่งเป็น null การเชื่อมต่อ 2 รายการก็จะเชื่อมต่อกันได้เช่นกัน ซึ่งช่วยให้คุณกำหนดการเชื่อมต่อที่เชื่อมต่อกับสิ่งใดก็ได้

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

ตัวอย่าง

ดูรายการตัวอย่างวิธีใช้การตรวจสอบการเชื่อมต่อได้ที่Playbook การตรวจสอบการเชื่อมต่อ

ตั้งค่าการตรวจสอบ

โดยค่าเริ่มต้น การเชื่อมต่อทั้งหมดจะมีnull connection-check ซึ่งหมายความว่าจะเชื่อมต่อกับอะไรก็ได้ คุณต้องกำหนดการตรวจสอบการเชื่อมต่อด้วยตนเอง

วิธีกำหนดการตรวจสอบการเชื่อมต่อให้กับการเชื่อมต่อจะแตกต่างกันไป ขึ้นอยู่กับว่าคุณใช้คําจํากัดความของบล็อก JSON หรือคําจํากัดความของบล็อก JavaScript

JSON

สําหรับการเชื่อมต่อระดับบนสุด คุณจะกําหนดการตรวจสอบให้กับพร็อพเพอร์ตี้ที่กําหนดการเชื่อมต่อโดยตรง ค่าที่คุณกําหนดอาจเป็น null, สตริง (ซึ่งจะกลายเป็นรายการเดียวในการตรวจสอบการเชื่อมต่อ) หรืออาร์เรย์สตริง

{
  'type': 'custom_value_block',

  'output': 'a connection check entry',
},
{
  'type': 'custom_statement_block',

  'nextStatement': null, // null check
  'previousStatement': ['four', 'connection', 'check', 'entries']
}

สําหรับอินพุต คุณสามารถกําหนดการตรวจสอบให้กับพร็อพเพอร์ตี้ check ของคําจํากัดความอินพุต หากไม่มีพร็อพเพอร์ตี้ check ระบบจะถือว่าการตรวจสอบเป็น null ค่าที่คุณกําหนดอาจเป็นสตริงหรืออาร์เรย์ของสตริงก็ได้

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

  'args0': [
    {
      'type': 'input_value',
      'check': 'a connection check entry' // Accepts custom_value_block
    },
    {
      'type': 'input_statement',
      'check': ['two', 'entries'] // Accepts custom_statement_block
    }
  ]
}

JavaScript

สําหรับการเชื่อมต่อระดับบนสุด คุณสามารถส่งการตรวจสอบไปยังเมธอดที่กําหนดการเชื่อมต่อได้โดยตรง หากไม่ได้ส่งค่า ระบบจะถือว่าการตรวจสอบเป็น null ค่าที่คุณส่งอาจเป็นสตริง (ซึ่งจะกลายเป็นรายการเดียวในการตรวจสอบการเชื่อมต่อ) หรืออาร์เรย์สตริงก็ได้

Blockly.Blocks['custom_value_block'] = {
  init: function() {
    this.setOutput(true, 'a connection check entry');
  }
};
Blockly.Blocks['custom_statement_block'] = {
  init: function() {
    this.setNextStatement(true); // null check
    this.setPreviousStatement(true, ['four', 'connection', 'check', 'entries']);
  }
};

สําหรับอินพุต คุณสามารถส่งการตรวจสอบไปยังเมธอด setCheck หลังจากที่ได้กําหนดอินพุตแล้ว หากไม่ได้เรียกใช้เมธอด setCheck ระบบจะถือว่าการตรวจสอบเป็น null ค่าที่คุณส่งอาจเป็นสตริงหรืออาร์เรย์ของสตริงก็ได้

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

สตริงการตรวจสอบในตัว

บล็อกในตัวมีการตรวจสอบการเชื่อมต่อที่มีค่า 'Array', 'Boolean', 'Colour', 'Number' และ 'String' หากต้องการให้บล็อกทำงานร่วมกันกับบล็อกในตัว คุณสามารถใช้ค่าเหล่านี้เพื่อให้บล็อกเข้ากันได้

ข้อจำกัด

ระบบนี้มีความเสถียรมากและแก้ปัญหาได้หลายกรณี แต่มีข้อจํากัดบางอย่าง

จำกัดบริบทที่กว้างขึ้น

ระบบนี้ไม่รองรับการจํากัด "บริบทที่กว้างขึ้น" ซึ่งอนุญาตให้เชื่อมต่อ เช่น คุณไม่สามารถระบุว่าบล็อก break จะต้องอยู่ภายในบล็อก loop เท่านั้น ระบบตรวจสอบการเชื่อมต่อจะพิจารณาเฉพาะการเชื่อมต่อ 2 รายการที่เชื่อมต่ออยู่เท่านั้น

คุณสามารถรองรับการดำเนินการนี้โดยใช้ระบบเหตุการณ์เพื่อฟังเหตุการณ์การย้ายบล็อก และตรวจสอบว่าบล็อกอยู่ในตำแหน่งที่ไม่ถูกต้องหรือไม่

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

ประเภททั่วไป

ระบบนี้ไม่รองรับการกำหนดประเภททั่วไป เช่น คุณไม่สามารถสร้างบล็อก "ข้อมูลประจำตัว" ที่ "แสดงผล" ข้อมูลใดก็ตามที่ป้อน

คุณสามารถรองรับกรณีนี้ได้ในระดับหนึ่งโดยเปลี่ยนการตรวจสอบการเชื่อมต่อในเอาต์พุตของบล็อกให้ตรงกับอินพุต ซึ่งคุณทําได้โดยใช้ระบบเหตุการณ์เพื่อรับฟังเหตุการณ์การย้ายบล็อก

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

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

แต่หากบล็อกที่เชื่อมต่อเป็นบล็อกทั่วไปด้วย การดำเนินการนี้จะทำงานไม่ถูกต้อง ในกรณีนี้ยังไม่มีวิธีแก้ปัญหาที่ได้ผล

ตัวตรวจสอบการเชื่อมต่อ

หากระบบนี้ใช้ไม่ได้กับกรณีการใช้งานของคุณ คุณยังเปลี่ยนวิธีเปรียบเทียบการตรวจสอบการเชื่อมต่อได้ด้วยการสร้างเครื่องมือตรวจสอบการเชื่อมต่อที่กําหนดเอง

เช่น หากต้องการสร้างระบบขั้นสูงขึ้นที่จัดการข้อจํากัดบางอย่างของระบบนี้ คุณสามารถสร้างโปรแกรมตรวจสอบการเชื่อมต่อที่กําหนดเองได้