Bağlantı kontrolleri, hangi bağlantıların birbirine bağlanabileceğini kısıtlar (ve bu nedenle engeller).
Bağlantı kontrolleri, türleri modellemek için yararlıdır. Örneğin, aşağıdaki üç blok farklı türde değer döndüren kodları temsil ettiği için birbirine bağlanamaz:
Bu blokların bağlanmasını önlemek için bağlantı kontrolleri kullanılabilir. Bu sayede kullanıcılara anında geri bildirim verilir ve birçok basit hata önlenir.
İşleyiş şekli
Her bağlantı, boş değer atanabilir bir dize dizisi olan "bağlantı kontrolü" ile ilişkilendirilebilir.
İki bağlantı aşağıdaki durumlarda bağlanabilir:
- Bunlar uyumlu türlerdir (ör. bir girişe bağlanan çıkış).
- Bağlantı kontrollerinde en az bir ortak dize vardır.
Örneğin, aşağıdaki iki kontrol içeren bağlantılar 'apple'
dizesini paylaştıkları için bağlanabilir:
['apple', 'ball', 'cat']
['apple', 'bear', 'caterpillar']
Ancak bu iki kontroldeki bağlantılar, herhangi bir dize paylaşmadığı için bağlanamadı:
['apple', 'ball', 'cat']
['ape', 'bear', 'caterpillar']
Başka bir özel durum daha var. Herhangi bir dizi null
ise iki bağlantı da bağlanabilir. Bu sayede, her şeye bağlanabilecek bağlantılar tanımlayabilirsiniz.
null
['ape', 'bear', 'caterpillar]
Örnekler
Bağlantı kontrollerinin nasıl kullanılacağına dair örneklerin listesi için Bağlantı kontrolü başucu kitabı başlıklı makaleyi inceleyin.
Kontrolleri ayarlama
Varsayılan olarak tüm bağlantılarda null
bağlantı kontrolü bulunur. Bu, her şeye bağlanabilecekleri anlamına gelir. Bağlantı kontrolleri manuel olarak atanmalıdır.
Bağlantı denetimlerini bağlantılara atama şekliniz, JSON blok tanımları mı yoksa JavaScript blok tanımları mı kullandığınıza bağlı olarak değişir.
JSON
Üst düzey bağlantılar için kontrolü doğrudan bağlantıyı tanımlayan mülke atarsınız. Atadığınız değer null
, bir dize (bağlantı kontrolünde tek giriş olur) veya bir dize dizisi olabilir.
{
'type': 'custom_value_block',
'output': 'a connection check entry',
},
{
'type': 'custom_statement_block',
'nextStatement': null, // null check
'previousStatement': ['four', 'connection', 'check', 'entries']
}
Girişler için kontrolü, giriş tanımının bir check
özelliğine atayabilirsiniz. check
mülkü mevcut değilse kontrol null
olarak kabul edilir. Atadığınız değer bir dize veya dize dizisi olabilir.
{
'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
Üst düzey bağlantılar için kontrolü doğrudan bağlantıyı tanımlayan yönteme iletebilirsiniz. Değer göndermezseniz kontrol null
olarak kabul edilir. İlettiğiniz değer bir dize (bağlantı kontrolünde tek giriş olur) veya dize dizisi olabilir.
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']);
}
};
Girişler için, girişi tanımladıktan sonra kontrolü setCheck
yöntemine iletebilirsiniz. setCheck
yöntemi çağrılmazsa kontrol null
olarak kabul edilir. İlettiğiniz değer bir dize veya dize dizisi olabilir.
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
}
};
Yerleşik kontrol dizelerini
Yerleşik bloklarda 'Array'
, 'Boolean'
, 'Colour'
, 'Number'
ve 'String'
değerleriyle bağlantı kontrolleri bulunur. Bloklarınızın yerleşik bloklarla birlikte çalışmasını istiyorsanız bu değerleri kullanarak uyumlu hale getirebilirsiniz.
Sınırlamalar
Bu sistem oldukça sağlamdır ve birçok kullanım alanını çözebilir ancak birkaç sınırlaması vardır.
Daha geniş bağlamı kısıtlama
Bu sistem, bağlantının bağlanmasına izin verilen "daha büyük bağlamı" tek başına kısıtlamayı desteklemez. Örneğin, bir break
bloğunun yalnızca bir loop
bloğunun içinde var olmasına izin verildiğini söyleyemezsiniz. Bağlantı kontrol sistemi yalnızca bağlı olan iki bağlantıyı dikkate alır.
Blok taşıma etkinliklerini dinlemek ve bloğun yanlış konumlandırılıp konumlandırılmadığını kontrol etmek için etkinlik sistemini kullanarak bunu destekleyebilirsiniz.
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;
},
}
Genel türler
Bu sistem, genel türlerin tanımlanmasını tek başına desteklemez. Örneğin, girişi ne olursa olsun "döndüren" bir "Identity" bloğu oluşturamazsınız.
Blokun çıkışındaki bağlantı kontrolünü girişiyle eşleşecek şekilde etkin bir şekilde değiştirerek bunu bir derece destekleyebilirsiniz. Taşıma işlemlerini engelleme etkinliklerini dinlemek için etkinlik sistemini kullanarak bunu yapabilirsiniz.
Blockly.Blocks['custom_block'] = {
init: function() { }
onchange: function(e) {
if (e.type !== Blockly.Events.BlockMove) return;
this.setOutput(
true, this.getInputTargetBlock()?.outputConnection.getCheck());
}
}
Ancak bağlı blok aynı zamanda genelse bu işlem düzgün çalışmaz. Bu durum için iyi bir geçici çözüm yoktur.
Bağlantı kontrol araçları
Bu sistem, kullanım alanınız için uygun değilse özel bağlantı kontrol cihazı oluşturarak bağlantı kontrollerinin karşılaştırılma şeklini de değiştirebilirsiniz.
Örneğin, bu sistemin sınırlamalarının bazılarını ele alan daha gelişmiş bir sistem oluşturmak istiyorsanız özel bir bağlantı kontrol cihazı oluşturabilirsiniz.