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

تعمل عمليات التحقق من الاتصال على تقييد الاتصالات (وبالتالي الكتل) التي يمكن الاتصال ببعضها البعض.

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

يشير هذا المصطلح إلى كتلة قائمة فارغة ومتصلة بكتلة جذر تربيعية ومتصلة بكتلة أحرف كبيرة.

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

آلية عملها

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

يمكن الاتصال في الحالتَين التاليتَين:

  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_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.

كتلة قيمة تقبل أي نوع

الأنواع الفرعية للإرجاع

لإنشاء كتلة "تُرجع" نوعًا فرعيًا، عليك تضمين كل من النوع والنوع الفائق في فحص اتصال الإخراج.

كتلة قيمة تُرجع نوعها ونوعها الفائق

في حالة الأنواع الفرعية، لا مانع من إجراء عدة عمليات تحقق في فحص المخرجات، لأن الحظر دائمًا "يعرض" كلا النوعين.

عرض الأنواع التي تتضمّن معلَمات

لإنشاء كتلة "تعرض" نوعًا يتضمّن معلَمة، عليك تضمين الإصدار الذي يتضمّن معلَمات والنسخة غير المُعلَّمة في عملية فحص الاتصال للناتج.

وفقًا لمدى صرامة لغة الحظر، قد تحتاج أيضًا إلى تضمين تباين النوع.

كتلة قيمة تعرض نوعها الذي يتضمن معلَمة ونوعها غير المحدد

كما هو الحال مع الأنواع الفرعية، لا بأس في إجراء عدة عمليات تحقّق في فحص الناتج في هذه الحالة، لأنّ الحظر دائمًا "يُرجع" كلا النوعين.

أمثلة على التكدس أو العبارة

هناك بعض الطرق الشائعة التي يحدد بها المطورون عمليات التحقق من الروابط السابقة والتالية. عادة ما تفكر في هذه على أنها تقييد ترتيب القوالب.

يجب أن تتضمن الاتصالات التالية الكتل التي يجب أن تتبع الكتلة الحالية، وأن تتضمن الاتصالات السابقة ماهية الكتلة الحالية.

الحفاظ على ترتيب القوالب

لإنشاء مجموعة من الكتل المتصلة بترتيب محدّد، عليك تضمين الكتل البرمجية التي يجب أن تتبع الكتلة الحالية في عملية التحقّق التالية من الاتصال، وتعريف الكتلة الحالية "في" عملية فحص الاتصال السابقة.

مجموعات العبارات التي لها ترتيب إجباري

السماح بإدراج الكثير من القوالب الوسطى

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

قوالب عبارات تسمح بالكثير من الكتل الوسطى

عدم السماح باستخدام مربّعات وسط

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

مجموعات عبارات لا تسمح بكتل متوسطة

إمّا-أو الحِزم

ولإنشاء حظر لا يمكن أن تتبعه إلا مجموعات من مجموعة واحدة، أو حظر من مجموعة أخرى (وليس كلتاهما)، عليك تنفيذ أمرين:

  1. عليك تضمين إدخال واحد على الأقل من كلتا المجموعتين من عمليات فحص الربط السابقة في فحص الاتصال التالي للمجموعة الأولى.

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

كتل العبارات التي يمكن أن يتبعها عدة نوع من الكتل، أو عدة أنواع من نوع آخر، ولكن ليس كليهما

القيود

هذا النظام قوي جدًا ويمكنه حل العديد من حالات الاستخدام، ولكن هناك بعض القيود المفروضة عليه.

حصر إمكانية الوصول إلى سياق أكبر

لا يدعم هذا النظام، في حد ذاته، تقييد "السياق الأكبر" الذي يُسمح من خلاله بالاتصال. على سبيل المثال، لا يمكنك القول بأنّ حظر 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());
  }
}

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

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

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

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