कस्टम ब्लॉक: ब्लॉक पैरामीटर

Blockly का इस्तेमाल करने वाला ऐप्लिकेशन डिज़ाइन करते समय, कई उदाहरण मौजूद हैं. इन विकल्पों के बारे में पहले ही सोच लेना चाहिए, क्योंकि इनसे उपयोगकर्ताओं को मिलने वाले ब्लॉक पर असर पड़ता है.

कॉन्फ़िगरेशन

कई ब्लॉकली ऐप्लिकेशन का इस्तेमाल, एक्ज़ीक्यूटेबल प्रोग्राम के बजाय, कॉन्फ़िगरेशन के बारे में बताने के लिए किया जाता है. कॉन्फ़िगरेशन ऐप्लिकेशन आम तौर पर, फ़ाइल फ़ोल्डर पर एक रूट लेवल ब्लॉक को शुरू करने से शुरू होते हैं. ब्लॉकली डेवलपर टूल का ब्लॉक फ़ैक्ट्री टैब एक अच्छा उदाहरण है:

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);

सीरियल प्रोग्राम

ब्लॉकली के ज़्यादातर ऐप्लिकेशन, सीरियल प्रोग्राम बनाने के लिए डिज़ाइन किए गए हैं. उपयोगकर्ता एक साथ उन ब्लॉक को स्टैक करते हैं जिन्हें क्रम में लागू किया जाता है.

फ़ाइल फ़ोल्डर का हर ब्लॉक (जो बंद नहीं है) इस कार्यक्रम का हिस्सा बनेगा. अगर ब्लॉक में एक से ज़्यादा स्टैक हैं, तो सबसे बड़े ब्लॉक को पहले लागू किया जाता है. (अगर दो स्टैक की ऊंचाई करीब-करीब एक जैसी है, तो बाईं ओर (आरटीएल मोड में दाईं ओर) स्टैक को प्राथमिकता दी जाती है.)

फ़ाइल फ़ोल्डर को किसी भी समय एक्ज़ीक्यूटेबल कोड में एक्सपोर्ट किया जा सकता है. इस कोड को JavaScript में क्लाइंट साइड (eval या JS अनुवादक का इस्तेमाल करके) या किसी भी भाषा में सर्वर साइड का इस्तेमाल किया जा सकता है.

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

अगर टारगेट भाषा JavaScript है, तो allCode कलेक्शन का इस्तेमाल करके, एक साथ कई JS इंटरसेप्टर बनाए जा सकते हैं. अगर टारगेट लैंग्वेज Python जैसी कुछ है, तो allCode कलेक्शन को ऐसे एक प्रोग्राम में इकट्ठा किया जा सकता है जो थ्रेडिंग मॉड्यूल का इस्तेमाल करता है.

किसी भी पैरलल प्रोग्राम की तरह, वैरिएबल और फ़ंक्शन जैसे किसी भी शेयर किए गए रिसॉर्स के बारे में सावधानी से फ़ैसले लिए जाने चाहिए.

इवेंट-आधारित कार्यक्रम

इवेंट हैंडलर सिर्फ़ ऐसे फ़ंक्शन हैं जिन्हें प्रोग्राम के बजाय सिस्टम की मदद से कॉल किया जाता है. ये ब्लॉक, एक्ज़ीक्यूट करने के लिए ब्लॉक के स्टैक को शामिल कर सकते हैं या वे हेडर हो सकते हैं जो ब्लॉक के स्टैक के ऊपर मौजूद होते हैं.

कुछ डेवलपर इवेंट ब्लॉक के ऊपर 'हैट' जोड़ना पसंद करते हैं, ताकि वे अन्य ब्लॉक से अलग दिखें. यह 'ब्लॉकली' के लिए डिफ़ॉल्ट लुक नहीं है. हालांकि, रेंडरर कॉन्स्टेंट को ADD_START_HATS से बदलकर true (कस्टम रेंडरर कोडलैब - ओवरराइड कॉन्सटेंट) या ब्लॉक स्टाइल में कोई थीम जोड़कर और हैट का विकल्प सेट करके जोड़ा जा सकता है. थीम के हिस्से के तौर पर, ब्लॉक पर हैट सेट करने के बारे में ज़्यादा जानकारी यहां मिल सकती है.

इवेंट-ड्रिवन मॉडल में, प्रोग्राम की शुरुआत के लिए एक हैंडलर बनाया जा सकता है. इस मॉडल में, फ़ाइल फ़ोल्डर पर ऐसा कोई भी ब्लॉक जो इवेंट हैंडलर से कनेक्ट नहीं है, उसे अनदेखा कर दिया जाएगा और उसे एक्ज़ीक्यूट नहीं किया जाएगा.

इवेंट का इस्तेमाल करने वाला सिस्टम डिज़ाइन करते समय, यह देख लें कि एक ही इवेंट हैंडलर के एक से ज़्यादा इंस्टेंस का इस्तेमाल किया जा सकता है या ज़रूरी है या नहीं.