সংযোগ চেক

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

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

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

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

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

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

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

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

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

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

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

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

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

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