Verbindungsprüfungen

Verbindungsprüfungen schränken ein, welche Verbindungen (und damit Blöcke) eine Verbindung herstellen können miteinander kommunizieren.

Verbindungsprüfungen sind für Modellierungstypen nützlich. Beispiel: drei Blöcke sind nicht miteinander verbunden, da sie Code darstellen, der gibt verschiedene Typen zurück:

Ein leerer Listenblock, der mit einem Quadratwurzelblock verbunden ist, der mit einem
Block in Großbuchstaben

Mit Verbindungsprüfungen kann verhindert werden, dass diese Blöcke eine Verbindung herstellen. Dieses gibt den Nutzenden sofortiges Feedback und vermeidet viele einfache Fehler.

Funktionsweise

Jede Verbindung kann einer „Verbindungsprüfung“ zugeordnet werden. ein Nullwert zulässig ist, Array von Zeichenfolgen.

Zwei Verbindungen können in folgenden Fällen verbunden werden:

  1. Es sind kompatible Typen (z.B. eine Ausgabe, die eine Verbindung zu eine Eingabe).
  2. Sie haben mindestens einen String in ihrer Verbindungsprüfung gemeinsam.

Die folgenden beiden Prüfungen könnten beispielsweise eine Verbindung herstellen, da sie den gleichen 'apple'-String:

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

Bei diesen beiden Prüfungen konnte jedoch keine Verbindung hergestellt werden, da sie keine Strings gemeinsam haben:

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

Es gibt noch einen weiteren Sonderfall. Wenn eines der Arrays null ist, dann sind die beiden Verbindungen herstellen können. So können Sie Verbindungen definieren, für alles.

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

Vorabprüfung einrichten

Standardmäßig haben alle Verbindungen eine null-Verbindungsprüfung, d. h., sie können mit allem, was Sie brauchen. Verbindungsprüfungen müssen manuell zugewiesen werden.

Wie Sie Verbindungen Verbindungsprüfungen zuweisen, hängt davon ab, unabhängig davon, ob Sie JSON-Blockdefinitionen oder JavaScript-Blockdefinitionen verwenden.

JSON

Bei Verbindungen auf oberster Ebene weisen Sie die Prüfung direkt der Property zu, die definiert die Verbindung. Der Wert, den Sie zuweisen, kann null sein, ein String (der der einzige Eintrag in der Verbindungsprüfung wird) oder ein String-Array.

{
  'type': 'custom_block',

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

Bei Eingaben können Sie die Diagnose dem Attribut check der Eingabe zuweisen. Definition. Wenn das Attribut check nicht vorhanden ist, wird die Prüfung durchgeführt null. Der Wert, den Sie zuweisen, kann ein String oder ein Array von Strings sein.

{
  'type': 'custom_block',
  'message0': '%1 %2',

  'args0': [
    {
      'type': 'input_value',
      'check': 'a connection check entry'
    },
    {
      'type': 'input_statement',
      'check': ['four', 'connection', 'check', 'entries']
    }
  ]
}

JavaScript

Für Verbindungen auf oberster Ebene können Sie die Prüfung direkt an die Methode übergeben, definiert die Verbindung. Wird ein Wert nicht übergeben, wird die Prüfung null Bei dem Wert, den Sie übergeben, kann es sich um einen String handeln. Dieser wird der einzige Eintrag im Verbindungsprüfung) oder ein String-Array verwenden.

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']);
  }
}

Bei Eingaben können Sie die Prüfung an die Methode setCheck übergeben, nachdem Sie die Eingabe definiert hat. Wird die Methode setCheck nicht aufgerufen, wird geprüft, als null betrachtet. Der Wert, den Sie übergeben, kann ein String oder ein Array von Strings sein.

Blockly.Blocks['custom_block'] = {
  init: function() {
    this.appendValueInput('NAME')
        .setCheck('a connection check entry');
    this.appendStatementInput('NAME')
        .setCheck(['four', 'connection', 'check', 'entries']);
  }
}

Integrierte Prüfzeichenfolgen

Die integrierten Blöcke haben Verbindungsprüfungen mit den Werten 'Array', 'Boolean', 'Colour', 'Number' und 'String'. Wenn Ihre Blockierungen mit den integrierten Blöcken interagieren, können Sie diese Werte verwenden, kompatibel sind.

Beispiele für Werte

Wenn Sie Verbindungsprüfungen für Ein- und Ausgaben definieren, sollten Sie sich die Prüfungen als Typen vorstellen.

Eingaben Überprüfungen sollten jeden „type“ enthalten die sie akzeptieren, und gibt Vorabprüfung sollte genau enthalten, was sie „zurückgeben“.

Einzelnen Typ akzeptieren

Im einfachsten Fall, wenn Sie einen Block erstellen möchten, oder „Retouren“ eines Typs müssen Sie diesen bei der Verbindungsprüfung einbeziehen.

einen Wertblock, der einen einzelnen Typ akzeptiert

Mehrere Typen akzeptieren

Um einen Block zu erstellen, der „annimmt“ müssen Sie alle akzeptierten Typ bei der Verbindungsprüfung der Eingabe.

einen Wertblock, der mehrere Typen akzeptiert

Konventionsgemäß kann eine Ausgabe manchmal in mehreren Situationen akzeptiert werden Wenn Sie z.B. manchmal Zahlen als Strings zulassen, sollte die Ausgabe so aussehen: restriktiver sein und die Eingabe(en) sollte(n) großzügiger sein. Diese Konvention sorgt dafür, dass die Ausgaben nicht an Stellen verbunden werden, die nicht unterstützt werden.

Beliebige Art akzeptieren

Um einen Block zu erstellen, der „annimmt“ müssen Sie den Typ der Eingabe Verbindungsprüfung zu null.

einen Wertblock, der jeden Typ akzeptiert

Untertypen der Rückgabe

Um einen Block zu erstellen, der müssen Sie sowohl den Typ und den Supertyp in der Verbindungsprüfung der Ausgabe.

Wertblock, der seinen Typ und seinen Supertyp zurückgibt

Bei Untertypen ist es in Ordnung, wenn eine Ausgabeprüfung mehrere Prüfungen umfasst, da der Block immer "wiedergibt", für beide Typen.

Parametrisierte Typen zurückgeben

Um einen Block zu erstellen, der parametrisiert werden, müssen Sie sowohl die parametrisierte Version und die nicht parametrisierte Version in der Ausgabe Verbindungsprüfung.

Je nachdem, wie streng die Blocksprache sein soll, Einschließen der Abweichungen des Typs.

einen Wertblock, der seinen parametrisierten und seinen nicht parametrisierten
Typ

Wie bei Untertypen ist es in Ordnung, wenn eine Ausgabeprüfung mehrere Prüfungen umfasst. da der Block immer "zurückgibt", für beide Typen.

Beispiele für Stacks oder Anweisungen

Es gibt einige gängige Methoden, mit denen Entwickler Prüfungen für vorherige und nächste Verbindungen. Normalerweise schränken Sie damit die Reihenfolge der Blöcke ein.

Die nächsten Verbindungen sollten angeben, welche Blöcke auf den aktuellen folgen sollen, und vorherige Verbindungen beinhalten, was der aktuelle Block „ist“.

Reihenfolge der Blockierungen beibehalten

Um eine Reihe von Blöcken zu erstellen, die in einer definierten Reihenfolge miteinander verbunden werden, müssen Sie welche Blöcke bei der nächsten Verbindungsprüfung auf den aktuellen Block folgen sollen, und was der aktuelle Block „ist“ in der vorherigen Verbindungsprüfung.

Anweisungsblöcke mit erzwungener Reihenfolge

Viele mittlere Blöcke zulassen

Um eine Reihe von geordneten Blöcken zu erstellen, die viele mittlere Blöcke ermöglichen, müssen Sie Nehmen Sie mindestens einen Eintrag aus dem vorherigen Verbindungscheck des mittleren Blocks auf. die nächste Verbindungsprüfung des mittleren Blocks. So können Sie dem Block für sich genommen hat.

die viele mittlere Blöcke ermöglichen,

Keine mittleren Blöcke zulassen

Um einen Satz geordneter Blöcke zu erstellen, bei denen die mittleren Blöcke optional sind, müssen Sie , um mindestens einen Eintrag aus der vorherigen Verbindung des mittleren Blocks anzugeben und die vorherige Verbindungsprüfung des letzten Blocks Verbindungsprüfung. So kann auf den ersten Block entweder ein mittlerer oder einem letzten Block.

Anweisungsblöcke, die keine mittleren Blöcke

Entweder-oder-Stacks

So erstellen Sie einen Block, auf den nur Blockierungen aus einer Gruppe oder Blockierungen folgen können: von einem anderen (und nicht aus beiden) entfernt werden, müssen Sie zwei Dinge tun:

  1. Du musst mindestens einen Eintrag aus den beiden vorherigen Gruppen hinzufügen Verbindungsprüfungen in der nächsten Verbindungsprüfung im ersten Block.

  2. Sie müssen die Gruppen Nächste Verbindungsprüfung, um nur Werte einzubeziehen die bereits in den vorherigen Verbindungsprüfungen enthalten sind. durch Blöcke derselben Gruppe).

Anweisungsblöcke, denen mehrere eines Blocktyps folgen können, oder
Vielfaches eines anderen, aber nicht beides

Beschränkungen

Dieses System ist sehr stabil und löst viele Anwendungsfälle, hat aber einige Einschränkungen.

Den übergeordneten Kontext einschränken

Dieses System an sich unterstützt keine Einschränkung des „größeren Kontexts“ in die eine Verbindung herstellen darf. Sie können beispielsweise nicht sagen, dass ein Der Block break darf nur innerhalb eines Blocks vom Typ loop vorhanden sein. Die Verbindung berücksichtigt, dass das System nur die beiden unmittelbar verbundenen Verbindungen berücksichtigt.

Sie können dies unterstützen, indem Sie das Ereignissystem verwenden, um block Move und prüfen Sie, ob der Block falsch positioniert ist.

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;
  },
}

Allgemeine Typen

Dieses System selbst unterstützt die Definition generischer Typen nicht. Beispiel: können Sie keine „Identität“ und diese „Antworten“ unabhängig von ihrer Eingabe.

Sie können dies eher unterstützen, indem Sie die Verbindungsprüfung auf der an die Eingabe anzupassen. Das können Sie mit dem Ereignissystem tun, auf „Move-Ereignisse blockieren“.

Blockly.Blocks['custom_block'] = {
  init: function() { }

  onchange: function(e) {
    if (e.type !== Blockly.Events.BlockMove) return;
    this.setOutput(
        true, this.getInputTargetBlock()?.outputConnection.getCheck());
  }
}

Wenn der verbundene Block jedoch auch generisch ist, funktioniert das nicht richtig. In diesem Fall gibt es keine geeignete Lösung.

Verbindungsprüfung

Wenn dieses System für Ihren Anwendungsfall nicht geeignet ist, können Sie auch die werden die Verbindungsprüfungen durch Erstellen eines benutzerdefinierte Verbindungsprüfung.

Wenn Sie z. B. ein fortschrittlicheres System entwickeln möchten, das einige Einschränkungen hier beschrieben, können Sie ein benutzerdefiniertes Verbindungsprüfung.