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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

JSON

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

{
  'type': 'custom_block',

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

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

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

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

JavaScript

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

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

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

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

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

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

ตัวอย่างค่า

เมื่อกำหนดการตรวจสอบการเชื่อมต่อสำหรับอินพุตและเอาต์พุต คุณควรคิดว่าการตรวจสอบนั้นเป็นตัวแทนของประเภท

การตรวจสอบข้อมูลที่ป้อนควรมีข้อมูล "ประเภท" ทั้งหมดที่ยอมรับ และการตรวจสอบของเอาต์พุตควรมีสิ่งที่ "ส่งคืน" ตรงตามทุกประการ

ยอมรับประเภทเดียว

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

บล็อกค่าที่ยอมรับประเภทเดียว

ยอมรับหลายประเภท

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

บล็อกค่าที่ยอมรับหลายประเภท

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

ยอมรับทุกประเภท

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

บล็อกค่าที่ยอมรับประเภทใดก็ได้

แสดงผลประเภทย่อย

หากต้องการสร้างการบล็อกที่ "แสดงผล" ประเภทย่อย คุณต้องรวมทั้งประเภทและ Supertype ในการตรวจสอบการเชื่อมต่อของเอาต์พุต

บล็อกค่าที่แสดงผลประเภทและลักษณะพิเศษ

ในกรณีของประเภทย่อย การตรวจสอบเอาต์พุตแต่ละครั้งอาจเป็นการตรวจสอบหลายครั้งได้ เนื่องจากการบล็อกจะ "แสดงผล" ทั้ง 2 ประเภทเสมอ

แสดงประเภทพารามิเตอร์

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

คุณอาจต้องการใส่ความแปรปรวนของประเภทด้วย ทั้งนี้ขึ้นอยู่กับระดับความเข้มงวดที่คุณต้องการภาษาที่ใช้บล็อก

บล็อกค่าที่แสดงผลประเภทพารามิเตอร์และประเภทที่ไม่มีพารามิเตอร์

คุณตรวจสอบเอาต์พุตได้ทั้ง 2 ประเภทเช่นเดียวกับประเภทย่อยนี้ เนื่องจากการบล็อกจะ "แสดงผล" ทั้ง 2 ประเภทเสมอ

ตัวอย่างกลุ่มหรือคำสั่ง

มีวิธีทั่วไป 2-3 วิธีที่นักพัฒนาแอปจะกำหนดการตรวจสอบสำหรับการเชื่อมต่อก่อนหน้าและการเชื่อมต่อถัดไป โดยปกติแล้ว คุณคิดว่าสิ่งนี้เป็นการจำกัดการจัดลำดับบล็อก

การเชื่อมต่อถัดไปควรมีการบล็อกที่เหมาะกับการบล็อกปัจจุบัน และการเชื่อมต่อก่อนหน้ารวมถึงการบล็อกปัจจุบัน "เป็น"

จัดเรียงบล็อกต่างๆ ให้เป็นระเบียบ

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

บล็อกคำสั่งที่มีคำสั่งบังคับ

อนุญาตให้มีบล็อกกลางได้เป็นจำนวนมาก

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

บล็อกข้อความที่อนุญาตให้ใส่บล็อกกลางจำนวนมาก

ไม่อนุญาตให้ใช้บล็อกกลาง

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

บล็อกข้อความที่ไม่อนุญาตให้มีบล็อกตรงกลาง

กลุ่มหรือชุด

หากต้องการสร้างการบล็อกที่สามารถตามด้วยการบล็อกจากกลุ่มหนึ่ง หรือบล็อกจากกลุ่มอื่น (ไม่ใช่ทั้ง 2 กลุ่ม) คุณต้องดำเนินการ 2 อย่างดังนี้

  1. คุณต้องระบุรายการจากการตรวจสอบการเชื่อมต่อก่อนหน้าทั้ง 2 กลุ่มอย่างน้อย 1 รายการในการตรวจสอบการเชื่อมต่อครั้งถัดไปของบล็อกแรก

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

บล็อกคำสั่งที่สามารถตามด้วยบล็อกประเภทเดียวหลายบล็อก หรือหลายรายการ
แต่ไม่ใช่ทั้ง 2 ประเภท

ข้อจำกัด

ระบบนี้ค่อนข้างมีประสิทธิภาพและแก้ไขกรณีการใช้งานได้หลายกรณี แต่ก็มีข้อจำกัดบางประการ

จำกัดบริบทเพิ่มเติม

ระบบนี้ยังไม่รองรับการจำกัด "บริบทที่กว้างมากขึ้น" ซึ่งอนุญาตให้การเชื่อมต่อเชื่อมต่อ ตัวอย่างเช่น คุณไม่สามารถบอกว่าบล็อก 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;
  },
}

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

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

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

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

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

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

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

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

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