Języki oparte na blokach a języki oparte na tekście

Języki oparte na blokach różnią się od języków tekstowych pod wieloma względami, głównie dlatego, że są przeznaczone dla początkujących użytkowników. Oto lista kwestii, które warto wziąć pod uwagę podczas projektowania własnego języka opartego na blokach.

Korzystanie z list opartych na wartości 1

Blok, który wybiera literę o określonym indeksie w ciągu i korzysta z wartości 1 oznaczającej pierwszą literę.

Początkujący programiści źle reagują, gdy po raz pierwszy spotykają listy z liczbami zerowymi. W związku z tym Blockly naśladuje Lua i Lambda Moo, indeksując listy i ciągi znaków od 1.

W przypadku bardziej zaawansowanych zastosowań Blockly obsługuje listy z numeracją od 0, aby ułatwić przejście na tekst. W przypadku młodszych odbiorców lub osób początkujących nadal zalecamy indeksowanie jednokierunkowe.

Rekomendacja: 1 to pierwsza liczba.

Obsługa liberalnych zasad dotyczących nazw

Blokuje zmienne o nazwach location_x (małe x) i location_X (duże X), w których wielkość liter nie ma znaczenia.

Programiści początkujący nie wiedzą, że location_Xlocation_x to różne zmienne. W rezultacie Blockly naśladuje języki BASIC i HTML, ignorując wielkość liter w nazwach zmiennych i funkcji. Scratch stosuje bardziej subtelne podejście (jak widać po prawej stronie) i uwzględnia wielkość liter w przypadku nazw zmiennych, ale nie w przypadku sprawdzania równości.

Ponadto w Blockly zmienne i funkcje nie muszą być zgodne z typowym schematem [_A-Za-z][_A-Za-z0-9]*. Jeśli ktoś chce nazwać zmienną List of zip codes lub רשימת מיקודים, to jest to jak najbardziej w porządku.

Rekomendacja: zignoruj wielkość liter, zezwól na dowolne nazwy.

Ustawianie wszystkich zmiennych jako globalnych

Początkujący programiści również mają problemy ze zrozumieniem zakresu. W rezultacie Blockly postępuje zgodnie z zasadami Scratch i czyni wszystkie zmienne globalnymi. Jedyną wadą zmiennych globalnych jest to, że rekurencyjność jest trudniejsza (trzeba wstawiać i wyjmować zmienne z listy), ale jest to technika programowania wykraczająca poza zakres użytkowników docelowych Blockly.

Rekomendacja: zakres wykracza poza zakres projektu, odłóż go na później.

Zastanów się, jak obsługiwać opcjonalne wartości zwracane

Wiele funkcji w programowaniu tekstowym wykonuje działanie, a następnie zwraca wartość. Wartość zwracana może być używana lub nie. Przykładem jest funkcja pop()z poziomu stosu. Metoda pop może być wywoływana w celu pobrania i usunięcia ostatniego elementu lub tylko w celu usunięcia ostatniego elementu z ignorowaniem wartości zwracanej.

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

Języki oparte na blokach nie są zazwyczaj dobre w ignorowaniu wartości zwracanej. Blok wartości musi być podłączony do czegoś, co akceptuje tę wartość. Istnieje kilka strategii radzenia sobie z tym problemem.

a) Unikaj problemu. Większość języków opartych na blokach jest zaprojektowana tak, aby unikać takich sytuacji. Na przykład Scratch nie ma żadnych bloków, które mają zarówno efekty uboczne, jak i wartość zwracaną.

b) Podaj 2 bloki. Jeśli miejsce w skrzynce narzędzi nie stanowi problemu, prostym rozwiązaniem jest udostępnienie 2 bloków tego typu: jednego z wartością zwracaną i jednego bez niej. Minusem jest to, że może to prowadzić do powstania mylącej listy narzędzi z wiele niemal identycznych bloków.

Blok wartości, który usuwa i zwraca ostatni element na liście, oraz blok instrukcji, który usuwa tylko ostatni element na liście.

c) zmutować jeden blok. Użyj menu, pola wyboru lub innego elementu sterującego, który pozwoli użytkownikowi wybrać, czy ma być zwracana wartość. Blok zmienia kształt w zależności od opcji. Przykładem jest blokada dostępu na liście w Blockly.

Blok, który po usunięciu ostatniego elementu na liście zmienia kształt z bloku wartości na blok instrukcji, w zależności od tego, czy zwraca ten element.

d) Zjedz wartość. Pierwsza wersja App Inventor utworzyła specjalny blok pipe, który pobierał dowolną powiązaną wartość. Użytkownicy nie rozumieli tej koncepcji, dlatego w drugiej wersji App Inventor usunięto blok pipe i zamiast tego zalecono użytkownikom przypisywanie wartości do zmiennej jednorazowej.

Bloki pokazujące 2 sposoby ignorowania danych wyjściowych bloku. Pierwszy używa bloku z znakami „<” i „>”, aby „zjeść” wartość, a drugi ustawia wartość zmiennej o nazwie „junk”.

Rekomendacja: każda strategia ma swoje zalety i wady. Wybierz tę, która jest odpowiednia dla Twoich użytkowników.

generowanie czytelnego kodu,

Zaawansowani użytkownicy Blockly powinni mieć możliwość sprawdzenia wygenerowanego kodu (JavaScript, Python, PHP, Lua, Dart itp.) i natychmiastowego rozpoznania napisanego przez siebie programu. Oznacza to, że trzeba włożyć dodatkowy wysiłek, aby kod wygenerowany przez maszynę był czytelny. Niepotrzebne nawiasy, zmienne liczbowe, ściśnione odstępy i długie szablony kodu utrudniają tworzenie eleganckiego kodu. Wygenerowany kod powinien zawierać komentarze i być zgodny ze stylówkami Google.

Rekomendacja: bądź dumny ze swojego wygenerowanego kodu. Pokaż je użytkownikowi.

Akceptowanie różnic między językami

Skutkiem ubocznym dążenia do czystego kodu jest to, że działanie Blockly jest w dużej mierze zdefiniowane przez sposób działania kompilowanego języka. Najczęstszym językiem wyjściowym jest JavaScript, ale jeśli Blockly ma przetłumaczyć kod na inny język, nie należy podejmować nieuzasadnionych prób zachowania dokładnego zachowania w obu językach. Na przykład w JavaScript pusty ciąg znaków ma wartość false, a w Lua – true. Zdefiniowanie pojedynczego wzoru zachowania kodu Blockly do wykonania niezależnie od języka docelowego spowodowałoby powstanie kodu, który nie nadaje się do utrzymania i wygląda jak kod wygenerowany przez kompilator GWT.

Rekomendacja: Blockly nie jest językiem, dlatego dopuść, aby istniejący język wpływał na działanie.