بررسی های اتصال محدود می کند که کدام اتصالات (و در نتیجه بلوک ها) می توانند به یکدیگر متصل شوند.
بررسی اتصال برای انواع مدلسازی مفید است. به عنوان مثال، سه بلوک زیر هیچ کسب و کاری متصل نیستند، زیرا آنها کدی را نشان می دهند که انواع مختلفی را برمی گرداند:
برای جلوگیری از اتصال این بلوک ها می توان از بررسی اتصال استفاده کرد. این به کاربران بازخورد آنی می دهد و از بسیاری از اشتباهات ساده جلوگیری می کند.
چگونه کار می کنند
هر اتصال را می توان با یک "بررسی اتصال" که یک آرایه از رشته ها تهی می شود، مرتبط کرد.
دو اتصال می توانند متصل شوند اگر:
- آنها انواع سازگار هستند (به عنوان مثال خروجی اتصال به ورودی).
- آنها حداقل یک رشته مشترک در بررسی اتصال خود دارند.
به عنوان مثال، اتصالات با دو چک زیر می توانند متصل شوند، زیرا آنها رشته 'apple'
را به اشتراک می گذارند:
['apple', 'ball', 'cat']
['apple', 'bear', 'caterpillar']
اما اتصالات با این دو چک نمی توانند وصل شوند، زیرا هیچ رشته ای مشترک ندارند:
['apple', 'ball', 'cat']
['ape', 'bear', 'caterpillar']
یک مورد خاص دیگر نیز وجود دارد. اگر هر یک از آرایه ها null
باشد، آنگاه دو اتصال نیز می توانند به هم متصل شوند. این به شما امکان می دهد اتصالاتی را تعریف کنید که می توانند به هر چیزی متصل شوند.
null
['ape', 'bear', 'caterpillar]
نمونه ها
برای فهرستی از نمونههایی از نحوه استفاده از بررسیهای اتصال، به کتاب پخش بررسی اتصال مراجعه کنید.
چک ها را تنظیم کنید
به طور پیش فرض، همه اتصالات دارای یک بررسی اتصال null
هستند، به این معنی که می توانند به هر چیزی متصل شوند. بررسی اتصال باید به صورت دستی اختصاص داده شود.
نحوه اختصاص بررسی اتصال به اتصالات بسته به اینکه از تعاریف بلوک JSON یا تعاریف بلوک جاوا اسکریپت استفاده می کنید متفاوت است.
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
}
]
}
جاوا اسکریپت
برای اتصالات سطح بالا، می توانید چک را مستقیماً به روشی که اتصال را تعریف می کند، ارسال کنید. اگر مقداری را پاس نکنید، چک 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;
},
}
انواع ژنریک
این سیستم به خودی خود از تعریف انواع عمومی پشتیبانی نمی کند. به عنوان مثال، شما نمی توانید یک بلوک "Identity" ایجاد کنید، که هر ورودی خود را "باز می گرداند".
میتوانید با تغییر فعال بررسی اتصال در خروجی بلوک برای مطابقت با ورودی آن، تا حدودی از این پشتیبانی کنید. کاری که می توانید با استفاده از سیستم رویداد برای گوش دادن به رویدادهای حرکتی مسدود انجام دهید.
Blockly.Blocks['custom_block'] = {
init: function() { }
onchange: function(e) {
if (e.type !== Blockly.Events.BlockMove) return;
this.setOutput(
true, this.getInputTargetBlock()?.outputConnection.getCheck());
}
}
اما اگر بلوک متصل نیز عمومی باشد، این به درستی کار نمی کند. کار خوبی برای این مورد وجود ندارد.
چک کننده های اتصال
اگر این سیستم برای مورد استفاده شما کار نمی کند، می توانید نحوه مقایسه بررسی های اتصال را نیز با ایجاد یک بررسی کننده اتصال سفارشی تغییر دهید.
برای مثال، اگر میخواهید یک سیستم پیشرفتهتر ایجاد کنید که برخی از محدودیتهای این سیستم را کنترل کند، میتوانید یک بررسی کننده اتصال سفارشی ایجاد کنید.