Bağlantı kontrolleri

Bağlantı kontrolleri hangi bağlantıların (ve dolayısıyla blokların) birbirine bağlanabileceğini kısıtlar.

Bağlantı kontrolleri, modelleme türleri için kullanışlıdır. Örneğin, aşağıdaki üç blok, farklı türleri döndüren kodu temsil ettiğinden bağlı işletme yoktur:

Kareköklü bloka bağlı, büyük harfli bloka bağlı boş bir liste bloğu

Bu blokların bağlanmasını önlemek için bağlantı kontrolleri kullanılabilir. Böylece kullanıcılar anında geri bildirim alabiliyor ve birçok basit hatayı önlemiş oluyor.

İşleyiş şekli

Her bağlantı, boş değer atanabilir bir dize dizisi olan bir "bağlantı kontrolü" ile ilişkilendirilebilir.

Aşağıdaki durumlarda iki bağlantı bağlanabilir:

  1. Uyumlu türlerdir (ör. bir girişe bağlanan çıkış).
  2. Bağlantı kontrollerinde en az bir dize ortak.

Örneğin, 'apple' dizesini paylaştıkları için aşağıdaki iki denetim bağlanabilir:

['apple', 'ball', 'cat']
['apple', 'bear', 'caterpillar']

Ancak herhangi bir dize paylaşmadıkları için şu iki kontrol birbirine bağlanamadı:

['apple', 'ball', 'cat']
['ape', 'bear', 'caterpillar']

Bir özel durum daha var. Dizilerden biri null ise iki bağlantı da bağlanabilir. Böylece her şeye bağlanabilen bağlantıları tanımlayabilirsiniz.

null
['ape', 'bear', 'caterpillar]

Kontrolleri ayarla

Varsayılan olarak tüm bağlantılar null bağlantı denetimine sahiptir. Yani her şeye bağlanabilirler. Bağlantı kontrollerinin manuel olarak atanması gerekir.

Bağlantı kontrollerini bağlantılara atama şekliniz, JSON bloku tanımlarını veya JavaScript blok tanımlarını kullanmanıza bağlı olarak farklılık gösterir.

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ündeki tek giriş olur) veya bir dize dizisi olabilir.

{
  'type': 'custom_block',

  'output': null,
  'nextStatement': 'a connection check entry',
  'previousStatement': ['four', 'connection', 'check', 'entries']
}

Girişler için kontrolü giriş tanımının bir check özelliğine atayabilirsiniz. check özelliği 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'
    },
    {
      'type': 'input_statement',
      'check': ['four', 'connection', 'check', 'entries']
    }
  ]
}

JavaScript

Üst düzey bağlantılar için kontrolü doğrudan bağlantıyı tanımlayan yönteme aktarabilirsiniz. Bir değeri iletmezseniz çek null olarak değerlendirilir. İlettiğiniz değer bir dize (bağlantı kontrolündeki tek giriş olur) veya bir dize dizisi olabilir.

Blockly.Blocks['custom_block'] = {
  init: function() {
    this.setOutput(true); // null check
    this.setNextStatement(true, 'a connection check entry');
    this.setPreviousStatement(true, ['four', 'connection', 'check', 'entries']);
  }
}

Girişler için, girişi tanımladıktan sonra kontrolü setCheck yöntemine geçirebilirsiniz. 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');
    this.appendStatementInput('NAME')
        .setCheck(['four', 'connection', 'check', 'entries']);
  }
}

Dahili kontrol dizeleri

Yerleşik blokların 'Array', 'Boolean', 'Colour', 'Number' ve 'String' değerleriyle bağlantı kontrolleri var. Bloklarınızın yerleşik bloklarla birlikte çalışmasını istiyorsanız bunları uyumlu hale getirmek için bu değerleri kullanabilirsiniz.

Değer örnekleri

Giriş ve çıkışlar için bağlantı kontrolleri tanımlarken, genellikle kontrolleri türleri temsil eden öğeler olarak düşünmelisiniz.

Girişlerin kontrolleri kabul ettikleri her "türü", çıkışların kontrolleri ise tam olarak "döndürdükleri" öğeleri içermelidir.

Tek bir türü kabul etme

Belirli bir türü "kabul eden" veya "döndüren" bir blok oluşturmak istediğiniz en temel durumda, bu türü bağlantının bağlantı kontrolüne dahil etmeniz gerekir.

tek bir türü kabul eden bir değer bloğu

Birden çok türü kabul et

Birden fazla türü "kabul eden" bir blok oluşturmak için, kabul edilen her türü girişin bağlantı denetimine eklemeniz gerekir.

birden çok türü kabul eden bir değer bloğu

Geleneksel olarak, bir çıkış bazen birden çok durumda kabul edilebiliyorsa (ör. sayıların bazen dize olarak kullanılmasına izin verirseniz) çıkış daha kısıtlayıcı ve girişler daha geniş kapsamlı olmalıdır. Bu kural, çıkışların desteklenmeyen yerlerde bağlanmamasını sağlar.

Tüm türleri kabul et

Her türü "kabul eden" bir blok oluşturmak için girişin bağlantı kontrolünü null olarak ayarlamanız gerekir.

her türü kabul eden bir değer bloğu

Alt türleri döndür

Bir alt türü "döndüren" bir blok oluşturmak için çıkışın bağlantı kontrolüne hem türü hem de üst türü dahil etmeniz gerekir.

türünü ve üst türünü döndüren bir değer bloğu

Alt türler söz konusu olduğunda, blok her zaman her iki türü de "döndürdüğünden" çıkış kontrolünde birden çok kontrol bulunabilir.

Parametre haline getirilmiş türleri döndürme

Parametreleştirilmiş bir türü "döndüren" bir blok oluşturmak için hem parametreleştirilmiş sürümü hem de parametreleştirilmemiş sürümü çıkışın bağlantı kontrolüne eklemeniz gerekir.

Engelleme dilinizin ne kadar katı olmasını istediğinize bağlı olarak türün varyanslarını da dahil etmek isteyebilirsiniz.

parametreleştirilmiş türünü ve parametreleştirilmemiş türünü döndüren bir değer bloğu

Alt türlerde olduğu gibi, bu durumda da çıkış kontrolünde birden çok kontrol kullanılabilir çünkü blok her zaman her iki türü de "döndürür".

Yığın veya ifade örnekleri

Geliştiricilerin önceki ve sonraki bağlantılar için kontrolleri tanımlaması gereken birkaç yaygın yol vardır. Bunları genellikle blokların sırasının kısıtlanması olarak görürsünüz.

Sonraki bağlantılar hangi blokların mevcut bloğu takip etmesi gerektiğini, önceki bağlantılar ise mevcut blokun "ne olduğunu" içermelidir.

Blokları düzenli tutun

Belirli bir sırada bağlanan bir blok grubu oluşturmak için hangi blokların bir sonraki bağlantı kontrolünde geçerli bloğu takip etmesi gerektiğini ve önceki bağlantı kontrolünde mevcut blokun ne "olduğunu" eklemeniz gerekir.

zorunlu sipariş içeren ifade blokları

Çok sayıda orta bloka izin verin

Çok sayıda orta bloka izin veren sıralı bloklardan oluşan bir küme oluşturmak için, orta bloğun bir sonraki bağlantı kontrolünde orta bloğun önceki bağlantı kontrolünden en az bir giriş eklemeniz gerekir. Bu, bloğun kendisinden biri tarafından takip edilmesini sağlar.

çok sayıda orta bloğun bulunmasını sağlayan ifade

Orta bloklara izin verme

Orta blokların isteğe bağlı olduğu sıralı bloklar grubu oluşturmak için hem orta bloğun önceki bağlantı kontrolünden hem de ilk bloğun bir sonraki bağlantı kontrolünde son bloğun önceki bağlantı kontrolünden en az bir giriş eklemeniz gerekir. Bu, ilk bloğun ardından bir orta blok veya son blok gelmesini sağlar.

orta bloklara izin vermeyen ifade blokları

Ya da yığınlar

Yalnızca bir gruptan gelen bloklar veya başka bir gruptan gelen bloklar (ikisi birden değil) gelen bir blok oluşturmak için iki şey yapmanız gerekir:

  1. İlk bloğun bir sonraki bağlantı kontrolüne, her iki grubun önceki bağlantı kontrollerinden en az bir giriş eklemeniz gerekir.

  2. Grupların bir sonraki bağlantı kontrollerini, yalnızca önceki bağlantı kontrollerindeki değerleri içerecek şekilde tanımlamanız gerekir (böylece gruplar yalnızca aynı grubun blokları tarafından izlenebilir).

birden çok blok türü veya başka bir blok türünden
birden fazla izlenebilen ancak her ikisinin birden gerçekleşmediği ifade blokları

Sınırlamalar

Bu sistem oldukça sağlamdır ve birçok kullanım senaryosunu çözebilir ancak bazı kısıtlamaları vardır.

Daha kapsamlı bağlamı sınırlayın

Bu sistem tek başına, bir bağlantının bağlanmasına izin verilen "daha fazla bağlamın" kısıtlanmasını desteklemez. Örneğin, bir break blokunun yalnızca bir loop bloğunun içinde bulunmasına izin verildiğini söyleyemezsiniz. Bağlantı kontrol sistemi yalnızca birbirine bağlı olan iki bağlantıyı hesaba katar.

Blok taşıma etkinliklerini dinlemek ve blokun yanlış yerleştirilmiş olup olmadığı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, tek başına genel türlerin tanımlanmasını desteklemez. Örneğin, girdisi ne olursa olsun "döndüren" bir "Kimlik" bloğu oluşturamazsınız.

Bloğun girişindeki bağlantı kontrolünü, girişiyle eşleşecek şekilde etkin bir şekilde değiştirerek bunu bir şekilde destekleyebilirsiniz. Bunu, taşıma etkinliklerini engellemek için dinlemek üzere etkinlik sistemini kullanarak 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 düzgün çalışmaz. Bu durumda iyi bir çözüm yoktur.

Bağlantı kontrolleri

Bu sistem kullanım alanınız için çalışmıyorsa özel bir bağlantı denetleyici oluşturarak bağlantı kontrollerinin karşılaştırılma şeklini de değiştirebilirsiniz.

Örneğin, bunun sınırlamalarından bazılarını kaldıran daha gelişmiş bir sistem oluşturmak istiyorsanız özel bir bağlantı denetleyici oluşturabilirsiniz.