בדיקות החיבורים מגבילות את החיבורים (ולכן את הבלוקרים) שיכולים להתחבר זה לזה.
בדיקות החיבורים שימושיות לסוגי מודלים. לדוגמה, אין סיבה לחבר את שלושת הבלוקסים הבאים, כי הם מייצגים קוד שמחזיר סוגים שונים:
אפשר להשתמש בבדיקות חיבור כדי למנוע מהבלוקים האלה להתחבר. כך המשתמשים מקבלים משוב מיידי ומונעים טעויות פשוטות רבות.
איך זה עובד
אפשר לשייך לכל חיבור 'בדיקת חיבור', שהיא מערך של מחרוזות שיכול להיות null.
שני חיבורים יכולים להתחבר אם:
- הם סוגים תואמים (למשל, פלט שמתחבר להזנה).
- יש להן לפחות מחרוזת אחת משותפת בבדיקת החיבור.
לדוגמה, אפשר לחבר בין חיבורים עם שתי הבדיקות הבאות כי הן משתפות את המחרוזת '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
לחיבורים ברמה העליונה, אפשר להעביר את הבדיקה ישירות ל-method שמגדיר את החיבור. אם לא מעבירים ערך, הבדיקה נחשבת ל-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());
}
}
אבל אם הבלוק המחובר הוא גם כללי, הפתרון הזה לא עובד כמו שצריך. אין פתרון טוב לבעיה הזו.
בודקי חיבורים
אם המערכת הזו לא מתאימה לתרחיש לדוגמה שלכם, תוכלו גם לשנות את אופן ההשוואה של בדיקות החיבור על ידי יצירת בודק חיבורים בהתאמה אישית.
לדוגמה, אם רוצים ליצור מערכת מתקדמת יותר שתטפל בחלק מהמגבלות של המערכת הזו, אפשר ליצור בודק חיבורים מותאם אישית.