সংযোগ চেক

সংযোগ চেকগুলি কোন সংযোগগুলি (এবং তাই ব্লকগুলি) একে অপরের সাথে সংযোগ করতে পারে তা সীমাবদ্ধ করে।

সংযোগ চেক মডেলিং ধরনের জন্য দরকারী. উদাহরণস্বরূপ, নিম্নলিখিত তিনটি ব্লকের কোনো ব্যবসায়িক সংযোগ নেই, কারণ তারা কোড প্রতিনিধিত্ব করে যা বিভিন্ন ধরনের প্রদান করে:

একটি খালি তালিকা ব্লক, একটি বর্গমূল ব্লকের সাথে সংযুক্ত, একটির সাথে সংযুক্ত বড় হাতের ব্লক

সংযোগ চেক এই ব্লক সংযোগ থেকে প্রতিরোধ করতে ব্যবহার করা যেতে পারে. এটি ব্যবহারকারীদের তাত্ক্ষণিক প্রতিক্রিয়া দেয় এবং অনেক সাধারণ ভুল প্রতিরোধ করে।

তারা কিভাবে কাজ করে

প্রতিটি সংযোগ একটি "সংযোগ চেক" এর সাথে যুক্ত হতে পারে যা স্ট্রিংগুলির একটি বাতিলযোগ্য অ্যারে।

দুটি সংযোগ সংযোগ করতে পারে যদি:

  1. এগুলি সামঞ্জস্যপূর্ণ প্রকার (যেমন একটি আউটপুট একটি ইনপুটের সাথে সংযুক্ত)।
  2. তাদের অন্তত একটি স্ট্রিং তাদের সংযোগ চেক কমন আছে.

উদাহরণস্বরূপ, নিম্নলিখিত দুটি চেকের সাথে সংযোগগুলি সংযোগ করতে পারে, কারণ তারা 'apple' স্ট্রিং ভাগ করে:

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

কিন্তু এই দুটি চেকের সাথে সংযোগগুলি সংযোগ করতে পারেনি, কারণ তারা কোনো স্ট্রিং ভাগ করে না:

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

আরও একটি বিশেষ ঘটনা আছে। যদি উভয় অ্যারে null হয়, তাহলে দুটি সংযোগও সংযোগ করতে পারে। এটি আপনাকে সংযোগগুলি সংজ্ঞায়িত করতে দেয় যা যেকোনো কিছুর সাথে সংযোগ করতে পারে।

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

উদাহরণ

সংযোগ চেকগুলি কীভাবে ব্যবহার করবেন তার উদাহরণগুলির একটি তালিকার জন্য, সংযোগ চেক প্লেবুকটি দেখুন।

চেক সেট করুন

ডিফল্টরূপে, সমস্ত সংযোগের একটি null সংযোগ-চেক থাকে, যার অর্থ তারা যেকোনো কিছুর সাথে সংযোগ করতে পারে। সংযোগ চেক ম্যানুয়ালি বরাদ্দ করা প্রয়োজন.

আপনি কীভাবে সংযোগগুলিতে সংযোগ চেকগুলি বরাদ্দ করেন আপনি JSON ব্লক সংজ্ঞা ব্যবহার করছেন বা জাভাস্ক্রিপ্ট ব্লক সংজ্ঞা ব্যবহার করছেন তার উপর নির্ভর করে।

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
    }
  ]
}

জাভাস্ক্রিপ্ট

শীর্ষ-স্তরের সংযোগের জন্য, আপনি সরাসরি সেই পদ্ধতিতে চেক পাস করতে পারেন যা সংযোগটি সংজ্ঞায়িত করে। যদি আপনি একটি মান পাস না করেন, চেকটি 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());
  }
}

কিন্তু যদি সংযুক্ত ব্লকটিও জেনেরিক হয়, তাহলে এটি সঠিকভাবে কাজ করে না। এই মামলার জন্য আশেপাশে কোন ভাল কাজ নেই।

সংযোগ পরীক্ষক

যদি এই সিস্টেমটি আপনার ব্যবহারের ক্ষেত্রে কাজ না করে, তাহলে আপনি একটি কাস্টম সংযোগ পরীক্ষক তৈরি করে সংযোগ চেকগুলিকে কীভাবে তুলনা করা হয় তা পরিবর্তন করতে পারেন৷

উদাহরণস্বরূপ, যদি আপনি একটি আরও উন্নত সিস্টেম তৈরি করতে চান যা এটির কিছু সীমাবদ্ধতা পরিচালনা করে, আপনি একটি কাস্টম সংযোগ পরীক্ষক তৈরি করতে পারেন।