Os idiomas baseados em blocos diferem dos baseados em texto de várias maneiras, principalmente porque são projetados para usuários iniciantes. Confira uma lista de itens a serem considerados ao projetar sua própria linguagem baseada em blocos.
Usar listas com base em um
Programadores iniciantes reagem mal quando encontram listas baseadas em zero pela primeira vez. Como resultado, o Blockly segue o exemplo do Lua e do Lambda Moo, fazendo a indexação de listas e strings com base 1.
Para usos mais avançados do Blockly, as listas com base em zero são compatíveis para facilitar a transição para o texto. Para públicos mais jovens ou mais novatos, a indexação com base em um ainda é recomendada.
Recomendação: "Um" é o primeiro número.
Suporte a regras de nomenclatura flexíveis
Programadores iniciantes não esperam que location_X
e location_x
sejam
variáveis diferentes. Como resultado, o Blockly segue o exemplo do BASIC e do HTML,
fazendo com que variáveis e funções não sejam sensíveis a maiúsculas e minúsculas. O Scratch usa uma abordagem mais sutil (como mostrado à direita) e é sensível a maiúsculas e minúsculas para nomes de variáveis, mas não
para verificações de igualdade.
Além disso, o Blockly não exige que variáveis e funções se conformem ao
esquema [_A-Za-z][_A-Za-z0-9]*
típico. Se alguém quiser nomear uma variável List
of zip codes
ou רשימת מיקודים
, tudo bem.
Recomendação: ignore a distinção entre maiúsculas e minúsculas e permita qualquer nome.
Tornar todas as variáveis globais
Programadores iniciantes também têm dificuldades para entender o escopo. Como resultado, o Blockly segue o exemplo do Scratch e torna todas as variáveis globais. A única desvantagem das variáveis globais é que a recursão é mais complicada (é preciso inserir e remover variáveis de uma lista), mas essa é uma técnica de programação que está além do escopo dos usuários-alvo do Blockly.
Recomendação: o escopo está fora do escopo, deixe para depois.
Considere como lidar com valores de retorno opcionais
Muitas funções na programação baseada em texto executam uma ação e retornam um valor.
Esse valor de retorno pode ou não ser usado. Um exemplo é a função pop()
de uma pilha. O método pop pode ser chamado para receber e remover o último elemento ou
apenas para remover o último elemento com o valor de retorno ignorado.
var last = stack.pop(); // Get and remove last element.
stack.pop(); // Just remove last element.
Linguagens baseadas em blocos geralmente não são boas em ignorar um valor de retorno. Um bloco de valor precisa ser conectado a algo que aceite o valor. Há várias estratégias para lidar com esse problema.
a) Ignorar o problema. A maioria dos idiomas baseados em blocos projeta a linguagem para evitar esses casos. Por exemplo, o Scratch não tem blocos com efeitos colaterais e um valor de retorno.
b) Forneça dois blocos. Se o espaço na caixa de ferramentas não for um problema, uma solução simples é fornecer dois blocos de cada tipo, um com e outro sem um valor de retorno. A desvantagem é que isso pode levar a uma caixa de ferramentas confusa com muitos blocos quase idênticos.
c) Modificar um bloco. Use um menu suspenso, uma caixa de seleção ou outro controle que permita ao usuário escolher se há um valor de retorno ou não. O bloco muda de forma dependendo das opções. Confira um exemplo disso no bloco de acesso à lista do Blockly.
d) Consumir o valor. A primeira versão do App Inventor criou um bloco de pipe especial que consumia qualquer valor conectado. Os usuários não entenderam o conceito, e a segunda versão do App Inventor removeu o bloco de pipe e recomendou que os usuários simplesmente atribuíssem o valor a uma variável descartável.
Recomendação: cada estratégia tem prós e contras. Escolha o que for melhor para seus usuários.
Gerar código legível
Os usuários avançados do Blockly precisam conseguir analisar o código gerado (JavaScript, Python, PHP, Lua, Dart etc.) e reconhecer imediatamente o programa que eles escreveram. Isso significa que é preciso fazer um esforço extra para manter esse código gerado pela máquina legível. Parênteses desnecessários, variáveis numéricas, espaços em branco comprimidos e modelos de código detalhados atrapalham a produção de um código elegante. O código gerado precisa incluir comentários e estar em conformidade com os guias de estilo do Google.
Recomendação: tenha orgulho do código gerado. Mostre ao usuário.
Aceitar diferenças entre idiomas
Um efeito colateral do desejo de um código limpo é que o comportamento do Blockly é definido em grande parte em termos de como a linguagem compilada cruzada se comporta. O idioma de saída mais comum é o JavaScript, mas se o Blockly fosse compilado em outro idioma, não seriam feitas tentativas indevidas para preservar o comportamento exato nos dois idiomas. Por exemplo, em JavaScript, uma string vazia é falsa, enquanto em Lua é verdadeira. Definir um único padrão de comportamento para que o código do Blockly seja executado, independentemente do idioma de destino, resultaria em um código não mantido que parece ter saído do GWT.
Recomendação: o Blockly não é um idioma. Permita que o idioma atual afete o comportamento.