Dart

Dart es un lenguaje liberado por Google, es orientado a objetos, de hecho todo es un objeto. Dart se hizo originalmente para correr bajo su propia máquina virtual. Actualmente, provee herramienta para traducir a código nativo (binario para diversas plataformas) y funciona en el navegador compilando (o transpilando) el código a Javascript (siendo uno de los más maduros en esta labor). Ultimamente se viene incentivando más con el marco de trabajo de Google denominado Flutter, enfocado en el desarrollo para aplicaciones móbiles bajo Android e iOS, incluso Web. Se puede encontrar que Dart tiene varias características influenciadas por lenguajes como C++, Java y Javascript. Su lema es “Dart is a client-optimized language for fast apps on any platform” (Dart es un lenguaje de cliente optimizado para aplicaciones rápidas en cualquier plataforma), es decir, aunque también puede funcionar del lado del servidor (backend) lo promueven como lenguaje optimizado para la UI.

Esta es una referencia ágil para quién tenga nociones de programación o codifique con algún otro lenguaje, también a modo de repaso y uso frecuente. Siendo así, tener esta información como memoria te resultará simple de acceder a los fundamentos, incluso como prueba de concepto sobre el lenguaje.

Tips esenciales del lenguaje

Para quien tenga habilidades, experticia en programación y/o requiera agilidad en conceptos técnicos, pueden resumirse los siguientes tips esenciales del lenguaje:

  1. Tipos de datos básicos: int, double, bool, String, List, dynamic (para cualquier tipo). Las variables se definen iniciando con el tipo de datos y luego el nombre (semejante a C++ y Java). También se puede usar var para cualquier tipo de modo dinámico.
  2. Las funciones se definen o comienzan con uno de los tipos de datos (o void si no retorna valor), luego los parámetros van entre paréntesis (...) iniciando también con el tipo de datos (y separando los parámetros con coma ,). Además, se usa return para retornar un valor. La función principal de un programa se denomina main.
  3. Para el bloque de la función o el flujo de control se usan llaves {}. Las sentencias deben terminar siempre con punto y coma ; (semejante a C++ y Java).
  4. El flujo de control es semejante a lenguajes como C, Java, Javascript, Kotlin, es decir que se cuenta con una anatomía cercana para el uso de if, for, while, incluso para el manejo de excepciones (try).
  5. El constructor de una clase lleva el mismo nombre de la clase y la clase se define con la palabra reservada class (semejante a C++).
  6. Semejante a lenguajes modernos como kotlin o versiones actuales de Javascript, se cuenta con operador de nulo seguro (null-safe): ?.
  7. Después de Javascript y Typescript, el uso de JSON en Dart es tan sencillo como en Python, comprendiendo que no es un tipo o estructura natural del lenguaje. Se usa jsonEncode() para serializar un objeto y luego el objeto puede usar el método .toJson() para devolver una representación en JSON.

Ejemplo esencial

void main() {
  print('Hi there!');
}

main es la función principal de una aplicación o programa con Dart, semejante a otros lenguajes.

Tipos de datos básicos

Dart promueve menos tipos de datos que otros lenguajes o una orientación más simple (comparado con Java o Rust).

Declaración de variables

Se puede declarar variables con la palabra reservada var (indicando que el tipo de datos puede variar) o con el tipo de datos previo al nombre.

Ejemplo:

var variable = 'Ana';
String name = 'Ana';
int n = 0;
List<dynamic> list = [1, 2.3, 'Hi'];

Para las variables definidas con var se puede identificar el tipo usando el nombre y .runtimeType.
En la última línea que corresponde a una lista, se usa <dynamic> sólo si contiene diferentes tipos de datos, por tanto List en su modo simplificado sólo permite un tipo de datos.

Definición de funciones

Las funciones se definen comenzando con el tipo de datos que retornan, o void en caso de no retornar un tipo. Al final se usa la palabra reservada return para devolver el valor respectivo, salvo que se defina con void cuando no retorna valor.

int plus(a, b) {
    return a + b;
}

Los parametros opcionales se encierran entre corchetes []. También se pueden usar parámetros nombrados definiendo la función con todos lo parámetros entre llaves ({...}), pero debe recordarse que la función se invoca con el nombre de los parámetros y sus valores separados por el signo :.

Adicionalmente, si la función se reduce a una sóla línea, se pueden usar funciones de flecha, por ejemplo:

int plus2(a, b) => a + b;

Nótese que se evita el uso de llaves {} y la palabra reservada return.

Condicionamiento if / else (if)

if (i == 1) {
    print('one');
}
else if (i == 2) {
    print('two');
}
else {
    print('aha');
};

El Ciclo For

for (int i = 0; i < 5; i++) {
    print(i);
}

El Ciclo While

while (i < 10) {
    i++;
}
do {
    i++;
}
while (i < 10);

Excepciones

try {
    ...
}
on Exception1 {
    ...
}
catch Exception2 {
    ...
}
finally {
    ...
}

Puedes usar throw (por ejemplo: throw new Exception();) para forzar el lanzamiento de un error.

Clases

La programación orientada a objetos (OOP) tiene su propia base de conceptos que abre un capítulo aparte para su comprensión, se puede decir que se pasa de pensar en funciones a clases que agrupan métodos (funciones) y propiedades (variables), siendo de gran útilidad para la reutilización de código. Como referencia simplemente se presenta la anatomía de una clase.

class Shape {
    int sides;

    Shape(String name, int sides) {
        this.sides = sides;
    }
}

void main() {
    Shape x = Shape('frame', 4);
}

Nótese que el constructor de la clase lleva el mismo nombre de la clase.

Programando un Servidor Web con Angel

Veamos ahora como lograr un servidor web en simples pasos con Angel Framework. Primero configuramos el archivo pubspec.yaml así:

name: hello_angel
dependencies:
    angel_framework: ^2.0.0

environment:
  sdk: '>=2.10.0 <3.0.0'

Ejecutamos:

pub get

Abrimos el editor y nombramos nuestro programa, por ejemplo server.dart, y colocamos el siguiente contenido:

import 'package:angel_framework/angel_framework.dart';
import 'package:angel_framework/http.dart';

main() async {
    var app = Angel();
    var http = AngelHttp(app);
    await http.startServer('localhost', 8000);
}

Ejecutamos el programa con el comando:

dart server.dart

Puedes revisar en un navegador consultando la dirección: localhost:8000


2021 by César Arcila