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

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

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

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

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

آلية عملها

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

يمكن إجراء اتصالين في الحالات التالية:

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

الأنواع العامة

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

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

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

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

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

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

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

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