Los lenguajes basados en bloques difieren de los lenguajes basados en texto de varias maneras, principalmente porque están diseñados para usuarios principiantes. Esta es una lista de aspectos que debes tener en cuenta cuando diseñes tu propio lenguaje basado en bloques.
Usa listas basadas en uno
Los programadores novatos reaccionan mal cuando se encuentran con listas basadas en cero por primera vez. Como resultado, Blockly sigue el ejemplo de Lua y Lambda Moo, ya que hace que el indexado de listas y cadenas sea uno.
Para usos más avanzados de Blockly, se admiten listas basadas en cero para facilitar la transición al texto. Para públicos más jóvenes o novatos, aún se recomienda el indexado basado en uno.
Recomendación: Uno es el primer número.
Admite reglas de nombres liberales
Los programadores novatos no esperan que location_X
y location_x
sean variables diferentes. Como resultado, Blockly sigue el ejemplo de BASIC y HTML, ya que hace que las variables y las funciones no sean sensibles a mayúsculas ni minúsculas. Scratch usa un enfoque más sutil (como se ve a la derecha) y distingue mayúsculas de minúsculas para los nombres de las variables, pero no para las verificaciones de igualdad.
Además, Blockly no requiere que las variables y las funciones se ajusten al esquema [_A-Za-z][_A-Za-z0-9]*
típico. Si quieres nombrar una variable List
of zip codes
o רשימת מיקודים
, está bien.
Recomendación: Ignora el caso y permite cualquier nombre.
Cómo hacer que todas las variables sean globales
Los programadores novatos también tienen dificultades para comprender el alcance. Como resultado, Blockly sigue el ejemplo de Scratch y hace que todas las variables sean globales. El único inconveniente de las variables globales es que la recursividad es más complicada (hay que insertar y quitar variables en una lista), pero esa es una técnica de programación que está más allá del alcance de los usuarios objetivo de Blockly.
Recomendación: El alcance está fuera de lugar, déjalo para más adelante.
Considera cómo controlar los valores devueltos opcionales
Muchas funciones de la programación basada en texto realizan una acción y, luego, muestran un valor.
Este valor que se muestra puede usarse o no. Un ejemplo es la función pop()
de una pila. Se puede llamar a Pop para obtener y quitar el último elemento, o bien para quitar solo el último elemento y que se ignore el valor que se muestra.
var last = stack.pop(); // Get and remove last element.
stack.pop(); // Just remove last element.
Por lo general, los lenguajes basados en bloques no son buenos para ignorar un valor de retorno. Un bloque de valor se debe conectar a algo que lo acepte. Existen varias estrategias para abordar este problema.
a) Evitar el problema La mayoría de los lenguajes basados en bloques están diseñados para evitar estos casos. Por ejemplo, Scratch no tiene ningún bloque que tenga efectos secundarios y un valor de retorno.
b) Proporcionar dos bloques Si el espacio en la caja de herramientas no es un problema, una solución simple es proporcionar dos de cada uno de este tipo de bloque, uno con y uno sin un valor que se muestra. La desventaja es que esto puede generar una caja de herramientas confusa con muchos bloques casi idénticos.
c) Mutar un bloque Usa un menú desplegable, una casilla de verificación o algún otro control que le permita al usuario elegir si hay un valor que se muestra o no. Luego, el bloque cambia de forma según sus opciones. Puedes ver un ejemplo de esto en el bloque de acceso a la lista de Blockly.
d) Consumir el valor La primera versión de App Inventor creó un bloque de tubería especial que consumía cualquier valor conectado. Los usuarios no entendían el concepto, y la segunda versión de App Inventor quitó el bloque de tuberías y, en su lugar, recomendó que los usuarios simplemente asignaran el valor a una variable desechable.
Recomendación: Cada estrategia tiene ventajas y desventajas. Elige la que sea adecuada para tus usuarios.
Genera un código legible
Los usuarios avanzados de Blockly deberían poder ver el código generado (JavaScript, Python, PHP, Lua, Dart, etcétera) y reconocer de inmediato el programa que escribieron. Esto significa que se debe hacer un esfuerzo adicional para mantener la legibilidad de este código generado por máquinas. Los paréntesis superfluos, las variables numéricas, los espacios en blanco comprimidos y las plantillas de código extensas dificultan la producción de un código elegante. El código generado debe incluir comentarios y cumplir con los lineamientos de estilo de Google.
Recomendación: Enorgullécete de tu código generado. Muéstralo al usuario.
Acepta las diferencias entre idiomas
Un efecto secundario del deseo de tener un código limpio es que el comportamiento de Blockly se define en gran medida en términos de cómo se comporta el lenguaje compilado de forma cruzada. El lenguaje de salida más común es JavaScript, pero si Blockly se compilara en otro idioma, no se deberían realizar intentos injustificados para preservar el comportamiento exacto en ambos idiomas. Por ejemplo, en JavaScript, una cadena vacía es falsa, mientras que en Lua es verdadera. Definir un solo patrón de comportamiento para que el código de Blockly se ejecute independientemente del idioma de destino generaría un código imposible de mantener que parece salido del compilador de GWT.
Recomendación: Blockly no es un lenguaje, permite que el lenguaje existente afecte el comportamiento.