Bağlantı kontrolleri

Bağlantı kontrolleri hangi bağlantıların (ve bu nedenle engellemelerin) bağlanabileceğini kısıtlar bir iletişim kurmaktır.

Bağlantı kontrolleri, modelleme türleri için yararlıdır. Örneğin, Bu üç blokun birbirine bağlı olmadığı bir kodu temsil ederler. farklı türler döndürür:

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

Bu blokların bağlanmasını önlemek için bağlantı kontrolleri kullanılabilir. Bu kullanıcılara anında geri bildirim verir ve birçok basit hatayı önler.

İşleyiş şekli

Her bağlantı bir "bağlantı kontrolü" ile ilişkilendirilebilir. Bu, boş değer dize dizisidir.

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

  1. Bunlar, uyumlu türlerdir (ör. girin).
  2. Bağlantı kontrollerinde en az bir dize bulunur.

Örneğin, aşağıdaki iki kontrol aynı frekansı paylaştığından 'apple' dizesi:

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

Ancak bu iki kontrol herhangi bir dizeye sahip olmadığı için bağlanamadı:

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

Bir özel durum daha var. Dizilerden biri null ise ikisi bağlanabiliyor. Bu sayede, bir dünya ile sizin için bağlantı kurabilecek çok kolaylaşır.

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

Kontrolleri ayarlayın

Varsayılan olarak tüm bağlantılar bir null bağlantı denetimine sahiptir. Yani bağlantı kurma olanağınız yoktur. Bağlantı kontrollerinin manuel olarak atanması gerekir.

Bağlantı denetimlerini bağlantılara nasıl atayacağınız JSON blok tanımları veya JavaScript blok tanımları kullanıp kullanmadığınıza bakmalısınız.

JSON

Üst düzey bağlantılarda kontrolü doğrudan bağlantıyı tanımlar. Atadığınız değer null, yani bir dize ( bağlantı kontrolündeki tek giriş olur) veya bir dize dizisi olur.

{
  'type': 'custom_block',

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

Girişler için kontrolü, girişin bir check özelliğine atayabilirsiniz belirler. check özelliği yoksa kontrol kabul edilir null. Atadığınız değer bir dize veya bir 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ılarda, kontrolü doğrudan bağlantıyı tanımlar. Bir değeri iletmemeniz durumunda kontrol, null İlettiğiniz değer bir dize olabilir (bu, bağlantı kontrolü) veya bir dize dizisi kullanılır.

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 şunları kontrol ettikten sonra kontrolü setCheck yöntemine geçirebilirsiniz: girdiyi tanımladı. setCheck yöntemi çağrılmazsa kontrol null dikkate alındı. İlettiğiniz değer bir dize veya bir 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']);
  }
}

Yerleşik kontrol dizeleri

Yerleşik bloklarda 'Array' değerleriyle bağlantı kontrolleri vardır. 'Boolean', 'Colour', 'Number' ve 'String'. Engellemelerinizin yerleşik bloklarla birlikte çalıştıklarından emin olmak için bu değerleri, uyumlu olmalıdır.

Değer örnekleri

Giriş ve çıkışlar için bağlantı kontrollerini tanımlarken genellikle kontrollerin türleri temsil ettiği düşünülmelidir.

Girişler kontroller her "türü" içermelidir ve şu sonuçları verir: kontroller "döndürdükleri" içeriği tam olarak içermelidir.

Tek bir türü kabul et

En temel durumda, "kabul eden" bir blok oluşturun veya "returns" her tür için bağlantının bağlantı kontrolüne de eklenmesi gerekir.

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

Birden fazla türü kabul et

"Kabul eden" bir blok oluşturmak için farklı türler varsa her bir türü kabul edilen bağlantı türünü girin.

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

Standart olarak, bir çıktı bazen birden fazla durumda kabul edilebiliyorsa (örneğin, sayıların bazen dize olarak kullanılmasına izin verirseniz) çıkış ve girişler daha esnek olmalıdır. Bu kural çıkışların desteklenmediği yerlerde bağlanmamasını sağlar.

Tüm türleri kabul et

"Kabul eden" bir blok oluşturmak için her türde için, girişin null bağlantısı kontrolü yapılıyor.

tüm türleri kabul eden bir değer bloğu

Alt türleri döndürün

"Geri gelen" bir blok oluşturmak için alt tür olarak görünüyorsa hem türü hem de ve çıkışın bağlantı kontrolündeki süper yazı tipini seçin.

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

Alt türler söz konusu olduğunda, bir çıkış kontrolünde birden fazla denetim olabilir. çünkü blok her zaman "döndürür" kullanabilirsiniz.

Parametre haline getirilmiş türleri döndürün

"Geri gelen" bir blok oluşturmak için parametre haline getirilmiş bir tür için çıkışın parametresindeki parametreli sürümü ve parametre içermeyen sürümü bağlantı kontrolü.

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

parametreye alınmış türünü ve parametresiz değerini döndüren bir değer bloğu
tür

Alt türlerde olduğu gibi, bir çıkış kontrolünde de birden fazla denetim olabilir bu durumda, engelleme her zaman "döndürür" kullanabilirsiniz.

Yığın veya ifade örnekleri

Geliştiricilerin önceki ve sonrakine yönelik kontrolleri tanımlamaları için yaygın olarak kullanılan birkaç yöntem vardır. bağlantılar. Bunları genellikle blokların sıralamasının kısıtlanması olarak düşünürsünüz.

Sonraki bağlantılar, hangi blokların mevcut bloku izlemesi gerektiğini içermelidir. önceki bağlantılar mevcut bloğun "ne olduğunu" içerir.

Blokları sıralı tutun

Belirli bir sırayla bağlanan bir blok dizisi oluşturmak için Bir sonraki bağlantı kontrolünde hangi blokların geçerli olanı izlemesi gerektiğini ve mevcut blok "nedir" kontrol edin.

zorunlu sıra içeren ifade blokları

Çok sayıda orta bloğa izin verin

Çok sayıda orta bloğa izin veren bir sıralı blok kümesi oluşturmak için şunları yapmanız gerekir: orta bloğun önceki bağlantı kontrolünden en az bir giriş içermelidir orta bloğun bir sonraki bağlantı kontrolünü tamamlayacaktır. Bu, engellemenin takip edilmesine olanak tanır çok daha fazlasını yapar.

çok sayıda orta bloka izin veren ifade blokları

Orta bloklara izin verme

Orta blokların isteğe bağlı olduğu bir sıralı blok kümesi oluşturmak için her iki orta bloğun önceki bağlantısından en az bir giriş dahil etmek ve son bloğun önceki bağlantı kontrolünü, ilk bloğun bir sonraki bağlantı kontrolü. Bu, ilk bloğun ardından ortadaki bir blokun gelmesine izin verir. veya son blok olabilir.

orta bloklara izin vermeyen ifade blokları

İkisinden biri veya gruplar

Yalnızca bir gruptaki bloklar veya bloklar izlenebilecek bir blok oluşturmak için başka birinde (ikisinden birinde değil) iki şey yapmanız gerekir:

  1. Önceki grupların her ikisinden de en az bir giriş eklemelisiniz bağlantısını kontrol eder.

  2. Grupların özelliklerini tanımlamanız gerekir yalnızca değerleri içeren bir sonraki bağlantı kontrolünün Bunlar, önceki bağlantı kontrollerinde bulunan (böylece yalnızca aynı grubun bloklarına göre).

Bir blok türünün katları tarafından takip edilebilen ifade blokları veya
diğerinin katı, ancak her ikisi değil

Sınırlamalar

Bu sistem oldukça sağlamdır ve birçok kullanım durumunu çözebilir, ancak sınırlamaları vardır.

Daha geniş bağlamı kısıtlayın

Bu sistem, "daha geniş bağlamın" kısıtlanmasını tek başına desteklemez inç izin verilen e-posta adresi belirtir. Örneğin, şöyle söyleyemezsiniz: break bloğunun yalnızca bir loop bloğu içinde olmasına izin verilir. Bağlantı sadece o andaki bağlı olan iki bağlantıyı dikkate alır.

Aşağıdakileri dinlemek için etkinlik sistemini kullanarak bunu destekleyebilirsiniz engelleme taşıma etkinliklerini kontrol edip blokun yanlış konumlandırılıp konumlandırılmadığını kontrol edin.

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 desteklememektedir. Örneğin, "Kimlik" oluşturamazsınız o "döndürülen" bloke her şey olduğu anlamına gelir.

ile eşleşmesi gerekir. Bunu yapmak için etkinlik sistemini dinleme etkinliklerini izlemelidir.

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 genel ise bu özellik düzgün çalışmaz. Bu destek kaydı için iyi bir çözüm bulunmuyor.

Bağlantı kontrol araçları

Bu sistem kullanım alanınız için çalışmıyorsa bağlantı kontrolleri, özel bağlantı kontrol edici.

Örneğin, bazı temel işlemleri gerçekleştiren daha gelişmiş bir sistem oluşturmak sınırlamalarını önlemek isterseniz, bağlantı kontrol aracı.