কাস্টম ব্লক: ব্লক দৃষ্টান্ত

ব্লকলি ব্যবহার করে এমন একটি অ্যাপ্লিকেশন ডিজাইন করার সময় বেছে নেওয়ার জন্য বেশ কয়েকটি দৃষ্টান্ত রয়েছে। এই পছন্দগুলি বিবেচনা করার আগে থেকেই করা উচিত, যেহেতু তারা ব্যবহারকারীর প্রয়োজনীয় ব্লকগুলিকে প্রভাবিত করে।

কনফিগারেশন

অনেক ব্লকলি অ্যাপ্লিকেশনগুলি এক্সিকিউটেবল প্রোগ্রামের পরিবর্তে কনফিগারেশন বর্ণনা করতে ব্যবহৃত হয়। কনফিগারেশন অ্যাপ্লিকেশনগুলি সাধারণত ওয়ার্কস্পেসে একটি রুট লেভেল ব্লক শুরু করার মাধ্যমে শুরু হয়। একটি ভাল উদাহরণ হল ব্লকলি ডেভেলপার টুলের ব্লক ফ্যাক্টরি ট্যাব:

Blockly.Blocks['factory_base'] = {
  init: function() {
    this.setDeletable(false);
    this.setMovable(false);
    this.setEditable(false);
    // etc...
  }
}

Blockly.serialization.blocks.append({'type': 'factory_base'}, workspace);

এটি একটি অপসারণযোগ্য, অস্থাবর ব্লক তৈরি করে যা ব্যবহারকারীর সমস্ত কনফিগারেশন ধারণ করে। বর্তমান কনফিগারেশন নির্ধারণ করতে ওয়ার্কস্পেস যেকোন সময় সিরিয়াল করা হতে পারে।

এই ধরনের অ্যাপ্লিকেশনগুলি রুট ব্লকের সাথে সংযুক্ত নয় এমন কোনও ব্লক স্বয়ংক্রিয়ভাবে নিষ্ক্রিয় করতে পারে। এটি একটি লাইন দিয়ে সম্পন্ন করা যেতে পারে:

workspace.addChangeListener(Blockly.Events.disableOrphans);

সিরিয়াল প্রোগ্রাম

বেশিরভাগ ব্লকলি অ্যাপ্লিকেশনগুলি সিরিয়াল প্রোগ্রাম তৈরি করার জন্য ডিজাইন করা হয়েছে। ব্যবহারকারীরা ব্লকগুলিকে একত্রে স্ট্যাক করে যা ক্রমানুসারে কার্যকর করা হয়।

কর্মক্ষেত্রে প্রতিটি (অ-অক্ষম) ব্লক প্রোগ্রামের অংশ হবে। ব্লকের একাধিক স্ট্যাক থাকলে, উচ্চতরগুলি প্রথমে কার্যকর করা হয়। (যদি দুটি স্ট্যাক প্রায় একই উচ্চতা হয়, তবে বাম দিকের স্ট্যাকগুলিকে (RTL মোডে ডানে) অগ্রাধিকার দেওয়া হয়৷)

ওয়ার্কস্পেস যেকোন সময় এক্সিকিউটেবল কোডে এক্সপোর্ট করা হতে পারে। এই কোডটি জাভাস্ক্রিপ্টে ক্লায়েন্ট সাইড (ইভাল বা জেএস ইন্টারপ্রেটার ব্যবহার করে) বা যেকোনো ভাষায় সার্ভার সাইডে এক্সিকিউট করা হতে পারে।

import {javascriptGenerator} from 'blockly/javascript';

var code = javascriptGenerator.workspaceToCode(workspace);

সমান্তরাল প্রোগ্রাম

কিছু ব্লকলি অ্যাপ্লিকেশান ক্রমিক না হয়ে সমান্তরালভাবে ব্লকের সমস্ত স্ট্যাক কার্যকর করতে বেছে নেয়। একটি উদাহরণ একটি সঙ্গীত অ্যাপ্লিকেশন যেখানে একটি ড্রাম লুপ একটি সুরের সাথে একযোগে চলে।

সমান্তরাল এক্সিকিউশন বাস্তবায়নের একটি উপায় হল প্রতিটি ব্লকের জন্য পৃথকভাবে কোড তৈরি করা:

import {javascriptGenerator} from 'blockly/javascript';

var json = Blockly.serialization.workspaces.save(workspace);

// Store top blocks separately, and remove them from the JSON.
var blocks = json['blocks']['blocks'];
var topBlocks = blocks.slice();  // Create shallow copy.
blocks.length = 0;

// Load each block into the workspace individually and generate code.
var allCode = [];
var headless = new Blockly.Workspace();
for (var i = 0; block < topBlocks.length; i++) {
  var block = topBlocks[i];
  blocks.push(block);
  Blockly.serialization.workspaces.load(json, headless);
  allCode.push(javascriptGenerator.workspaceToCode(headless));
  blocks.length = 0;
}

টার্গেট ল্যাঙ্গুয়েজ যদি জাভাস্ক্রিপ্ট হয়, তাহলে allCode অ্যারে একসাথে এক্সিকিউশনের জন্য একাধিক JS ইন্টারপ্রেটার তৈরি করতে ব্যবহার করা যেতে পারে। টার্গেট ল্যাঙ্গুয়েজ যদি পাইথনের মত কিছু হয়, তাহলে allCode অ্যারে একটি একক প্রোগ্রামে একত্রিত হতে পারে যা একটি থ্রেডিং মডিউল ব্যবহার করে।

যেকোনো সমান্তরাল প্রোগ্রামের মতো, ভেরিয়েবল এবং ফাংশনের মতো শেয়ার্ড রিসোর্স সম্পর্কে সতর্ক সিদ্ধান্ত নিতে হবে।

ইভেন্ট চালিত প্রোগ্রাম

ইভেন্ট হ্যান্ডলারগুলি এমন ফাংশন যা প্রোগ্রামের পরিবর্তে সিস্টেম দ্বারা কল করা হয়। এই ব্লকগুলি হয় ব্লকের স্ট্যাকটিকে কার্যকর করতে পারে, অথবা সেগুলি হেডার হতে পারে যা ব্লকের স্ট্যাকের উপরে বসে থাকে।

কিছু বিকাশকারী ইভেন্ট ব্লকের শীর্ষে একটি 'হ্যাট' যুক্ত করতে পছন্দ করে যাতে সেগুলি অন্যান্য ব্লক থেকে আলাদা দেখায়। এটি Blockly-এর জন্য ডিফল্ট চেহারা নয়, তবে এটি রেন্ডারার ধ্রুবক ADD_START_HATS true ওভাররাইড করে যোগ করা যেতে পারে ( কাস্টম রেন্ডারার কোডল্যাব - ওভাররাইড ধ্রুবক )। অথবা একটি থিম যোগ করে এবং ব্লক শৈলীতে হ্যাট বিকল্প সেট করে। থিমের অংশ হিসাবে ব্লকগুলিতে টুপি সেট করার জন্য আরও তথ্য এখানে পাওয়া যাবে।

একটি ইভেন্ট-চালিত মডেলের মধ্যে, প্রোগ্রাম শুরুর জন্য একটি হ্যান্ডলার তৈরি করাও বোধগম্য হতে পারে। এই মডেলের অধীনে, ইভেন্ট হ্যান্ডলারের সাথে সংযুক্ত না থাকা ওয়ার্কস্পেসের যেকোনো ব্লক উপেক্ষা করা হবে এবং কার্যকর করা হবে না।

ইভেন্ট ব্যবহার করে এমন একটি সিস্টেম ডিজাইন করার সময়, একই ইভেন্ট হ্যান্ডলারের একাধিক দৃষ্টান্ত সমর্থন করা সম্ভব বা পছন্দনীয় কিনা তা বিবেচনা করুন।