عمليات التحقق من الاتصال

تحدّ عمليات التحقّق من الربط من عمليات الربط (وبالتالي الكتل) التي يمكنها الربط ببعضها.

إنّ عمليات التحقّق من الاتصال مفيدة لأنواع وضع النماذج. على سبيل المثال، لا يمكن ربط الثلاث مجموعات التالية، لأنّها تمثّل رمزًا يُعرِض أنواعًا مختلفة:

كتلة قائمة فارغة، متصلة بكتل الجذر التربيعي، متصلة بكتل
الأحرف الكبيرة

يمكن استخدام عمليات التحقّق من الاتصال لمنع ربط هذه الكتل. ويمنحهم ملاحظات فورية ويمنعهم من ارتكاب العديد من الأخطاء البسيطة.

آلية عملها

يمكن ربط كل عملية ربط بـ "فحص اتصال" وهو صفيف سلاسل قابلة للحذف.

يمكن أن يتصل اتصالان ببعضهما في الحالات التالية:

  1. أن تكون من الأنواع المتوافقة (مثل مخرج يتصل بإدخال)
  2. تتشارك هذه الطلبات سلسلة واحدة على الأقل في عملية التحقّق من الاتصال.

على سبيل المثال، يمكن أن ترتبط عمليات الربط التي تتضمّن التحقّقَين التاليَين، لأنّه تشتركان في سلسلة 'apple':

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

ولكن تعذّر ربط عمليات التحقّق هذه لأنّها لا تشترك في أي سلاسل:

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

هناك حالة خاصة أخرى. إذا كانت إحدى الصفيفات هي null، يمكن أيضًا ربط الربطَين. يتيح لك ذلك تحديد عمليات الربط التي يمكن أن ترتبط بأي شيء.

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

أمثلة

للحصول على قائمة بالأمثلة على كيفية استخدام عمليات التحقّق من الربط، اطّلِع على دليل التحقّق من الربط.

عمليات التحقّق من الإعدادات

تكون جميع عمليات الربط مزوّدة تلقائيًا بفحص اتصال null، ما يعني أنّه يمكنها الربط بأي شيء. يجب تحديد عمليات التحقّق من الاتصال يدويًا.

تختلف طريقة تخصيص عمليات التحقّق من الربط للاتصالات حسب ما إذا كنت تستخدم تعريفات كتل 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. لا يأخذ نظام التحقّق من الربط في الاعتبار سوى الاتصالَين المباشرَين اللذَين يتم ربطهما.

يمكنك تفعيل هذه الميزة باستخدام نظام الأحداث للاستماع إلى أحداث تحريك الكتلة والتحقّق مما إذا كان موضع الكتلة غير صحيح.

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());
  }
}

ولكن إذا كانت الكتلة المتصلة أيضًا عامة، لن يعمل ذلك بشكل صحيح. لا تتوفّر حلول بديلة مناسبة لهذه الحالة.

أدوات التحقّق من الاتصال

إذا لم يكن هذا النظام مناسبًا لحالة الاستخدام، يمكنك أيضًا تغيير طريقة مقارنة عمليات التحقّق من الاتصال من خلال إنشاء أداة تحقّق مخصّصة من الاتصال.

على سبيل المثال، إذا أردت إنشاء نظام أكثر تقدّمًا يعالج بعض القيود المفروضة على هذا النظام، يمكنك إنشاء أداة مخصّصة لتحقّق من الاتصال.