Blockschrift und Textsprachen

Blockbasierte Sprachen unterscheiden sich in vielerlei Hinsicht von textbasierten Sprachen, vor allem, weil sie für Einsteiger konzipiert sind. Hier ist eine Liste mit Dingen, die Sie beim Entwerfen einer eigenen blockbasierten Sprache berücksichtigen sollten.

Listen mit der Zählung „1“ verwenden

Block, mit dem der Buchstabe an einem bestimmten Index in einem String ausgewählt wird. Dabei steht „1“ für den ersten Buchstaben.

Anfänger reagieren oft verunsichert, wenn sie zum ersten Mal auf Listen mit dem Startwert 0 stoßen. Daher folgt Blockly dem Beispiel von Lua und Lambda Moo und beginnt die Indexierung von Listen und Strings mit 1.

Für erweiterte Verwendungen von Blockly werden Listen mit Zählung ab Null unterstützt, um den Übergang zu Text zu erleichtern. Für jüngere oder weniger erfahrene Nutzer wird weiterhin die Indexierung mit einer Basis empfohlen.

Empfehlung: „Eins“ ist die erste Zahl.

Liberale Namensregeln unterstützen

Blöcke mit den Variablennamen „location_x“ (Kleinbuchstaben x) und „location_X“ (Großbuchstaben X), bei denen die Groß- und Kleinschreibung nicht beachtet wird.

Anfänger gehen nicht davon aus, dass location_X und location_x unterschiedliche Variablen sind. Daher folgt Blockly dem Beispiel von BASIC und HTML, indem bei Variablen und Funktionen die Groß- und Kleinschreibung nicht beachtet wird. In Scratch wird ein subtilerer Ansatz verwendet (siehe rechts). Dabei wird bei Variablennamen die Groß- und Kleinschreibung beachtet, bei Gleichheitsvergleichen jedoch nicht.

Außerdem ist es in Blockly nicht erforderlich, dass Variablen und Funktionen dem typischen [_A-Za-z][_A-Za-z0-9]*-Schema entsprechen. Wenn man eine Variable List of zip codes oder רשימת מיקודים nennen möchte, ist das völlig in Ordnung.

Empfehlung: Groß-/Kleinschreibung ignorieren, alle Namen zulassen

Alle Variablen global machen

Anfänger haben auch Schwierigkeiten, den Umfang zu verstehen. Daher folgt Blockly dem Beispiel von Scratch und macht alle Variablen global. Der einzige Nachteil globaler Variablen ist, dass die Rekursion etwas komplizierter ist (Variablen müssen in eine Liste eingefügt und daraus entfernt werden). Dies ist jedoch eine Programmiertechnik, die über den Umfang der Zielgruppe von Blockly hinausgeht.

Empfehlung: Der Umfang geht über das Ziel hinaus. Lassen Sie es für später.

Optionale Rückgabewerte berücksichtigen

Viele Funktionen in der textbasierten Programmierung führen eine Aktion aus und geben dann einen Wert zurück. Dieser Rückgabewert kann verwendet werden oder auch nicht. Ein Beispiel ist die pop()-Funktion eines Stacks. Pop kann aufgerufen werden, um das letzte Element abzurufen und zu entfernen, oder um nur das letzte Element zu entfernen, wobei der Rückgabewert ignoriert wird.

var last = stack.pop();  // Get and remove last element.
stack.pop();  // Just remove last element.

Blockbasierte Sprachen eignen sich in der Regel nicht gut zum Ignorieren eines Rückgabewerts. Ein Wertblock muss an etwas angeschlossen werden, das den Wert akzeptiert. Es gibt mehrere Strategien, um mit diesem Problem umzugehen.

a) Das Problem umgehen. Bei den meisten blockbasierten Sprachen ist das nicht der Fall. In Scratch gibt es beispielsweise keine Blöcke, die sowohl Nebenwirkungen als auch einen Rückgabewert haben.

b) Zwei Blöcke angeben Wenn der Platz in der Toolbox kein Problem darstellt, ist eine einfache Lösung, jeweils zwei Blöcke dieser Art bereitzustellen, einen mit und einen ohne Rückgabewert. Der Nachteil ist, dass dies zu einer verwirrenden Toolbox mit vielen nahezu identischen Blöcken führen kann.

Ein Wertblock, der das letzte Element in einer Liste entfernt und zurückgibt, und ein Anweisungsblock, der nur das letzte Element in einer Liste entfernt.

c) Einen Block mutieren. Verwenden Sie ein Drop-down-Menü, ein Kästchen oder ein anderes Steuerelement, mit dem der Nutzer auswählen kann, ob ein Rückgabewert vorhanden ist oder nicht. Die Form des Blocks ändert sich dann je nach Optionen. Ein Beispiel dafür ist der Block „List Access“ (Listenzugriff) in Blockly.

Block, der beim Entfernen des letzten Elements in einer Liste seine Form von einem Wertblock in einen Anweisungsblock ändert, je nachdem, ob dieses Element auch zurückgegeben wird.

d) Den Wert aufessen. In der ersten Version von App Inventor wurde ein spezieller Pipe-Block erstellt, der jeden verbundenen Wert aufnahm. Die Nutzer verstanden das Konzept nicht und in der zweiten Version von App Inventor wurde der Pipe-Block entfernt. Stattdessen wurde empfohlen, den Wert einfach einer Einmalvariablen zuzuweisen.

Blöcke, die zwei verschiedene Möglichkeiten zum Ignorieren der Ausgabe eines Blocks zeigen Im ersten Beispiel wird der Wert mit einem Pipe-Block „aufgefressen“ und im zweiten wird der Wert einer Variablen namens „junk“ festgelegt.

Empfehlung: Jede Strategie hat Vor- und Nachteile. Wählen Sie die aus, die für Ihre Nutzer am besten geeignet ist.

Lesbaren Code generieren

Fortgeschrittene Blockly-Nutzer sollten in der Lage sein, sich den generierten Code (JavaScript, Python, PHP, Lua, Dart usw.) anzusehen und das von ihnen geschriebene Programm sofort zu erkennen. Daher ist zusätzlicher Aufwand erforderlich, um diesen maschinengenerierten Code lesbar zu halten. Unnötige Klammern, numerische Variablen, zu wenig Weißraum und ausführliche Codevorlagen erschweren die Erstellung eleganter Codeblöcke. Der generierte Code sollte Kommentare enthalten und den Google-Stilrichtlinien entsprechen.

Empfehlung: Seien Sie stolz auf Ihren generierten Code. Zeigen Sie es dem Nutzer.

Akzeptieren Sie Unterschiede zwischen Sprachen

Ein Nebeneffekt des Wunsches nach sauberem Code ist, dass das Verhalten von Blockly weitgehend anhand des Verhaltens der plattformunabhängig kompilierten Sprache definiert wird. Die gängigste Ausgabesprache ist JavaScript. Wenn Blockly jedoch in eine andere Sprache übersetzt wird, sollten keine unverhältnismäßigen Anstrengungen unternommen werden, um das genaue Verhalten in beiden Sprachen beizubehalten. In JavaScript ist ein leerer String beispielsweise „falsch“, in Lua hingegen „wahr“. Wenn wir ein einziges Verhaltensmuster für den Blockly-Code definieren, das unabhängig von der Zielsprache ausgeführt wird, würde dies zu nicht wartbarem Code führen, der aussieht, als wäre er aus dem GWT-Compiler gekommen.

Empfehlung: Blockly ist keine Sprache. Lassen Sie die vorhandene Sprache das Verhalten beeinflussen.