कनेक्शन की जांच से यह तय होता है कि कौनसे कनेक्शन (और इसलिए ब्लॉक) एक-दूसरे से कनेक्ट हो सकते हैं.
कनेक्शन की जांच, मॉडलिंग टाइप के लिए काम की होती है. उदाहरण के लिए, यहां दिए गए तीन ब्लॉक को आपस में नहीं जोड़ा जा सकता, क्योंकि ये अलग-अलग तरह के कोड दिखाते हैं:
कनेक्शन की जांच करके, इन ब्लॉक को कनेक्ट होने से रोका जा सकता है. इससे उपयोगकर्ताओं को तुरंत सुझाव मिलते हैं और कई सामान्य गलतियां होने से बचती हैं.
इनके काम करने का तरीका
हर कनेक्शन को "कनेक्शन की जांच" से जोड़ा जा सकता है. यह स्ट्रिंग का एक ऐरे होता है, जिसमें वैल्यू न होने पर भी काम चलता है.
दो कनेक्शन तब कनेक्ट हो सकते हैं, जब:
- ये एक-दूसरे के साथ काम करने वाले टाइप हैं. उदाहरण के लिए, इनपुट से कनेक्ट करने वाला आउटपुट.
- कनेक्शन की जांच करने के लिए, उनमें कम से कम एक स्ट्रिंग एक जैसी होनी चाहिए.
उदाहरण के लिए, यहां दी गई दो जांचों वाले कनेक्शन कनेक्ट हो सकते हैं, क्योंकि ये '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_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
}
]
}
JavaScript
टॉप-लेवल कनेक्शन के लिए, जांच को सीधे उस तरीके पर भेजा जा सकता है जो कनेक्शन तय करता है. अगर कोई वैल्यू नहीं दी जाती है, तो जांच को 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());
}
}
हालांकि, अगर कनेक्ट किया गया ब्लॉक भी सामान्य है, तो यह सही तरीके से काम नहीं करता. इस मामले में कोई अच्छा तरीका नहीं है.
कनेक्शन की जांच करने वाले टूल
अगर यह सिस्टम आपके इस्तेमाल के उदाहरण के लिए काम नहीं करता है, तो कस्टम कनेक्शन चेकर बनाकर, कनेक्शन की जांच करने के तरीके में बदलाव किया जा सकता है.
उदाहरण के लिए, अगर आपको एक ऐसा बेहतर सिस्टम बनाना है जो इस सिस्टम की कुछ सीमाओं को मैनेज करता हो, तो कस्टम कनेक्शन चेकर बनाया जा सकता है.