Dart — Flujos de control (Loops)


El flujo de control en Dart se refiere al orden en que se ejecutan las sentencias o declaraciones, Dart soporta varias estructuras de flujo de control que permiten controlar el flujo de un programa.


Bucles (Loops)

Aquí aprenderemos a como podemos controlar el flujo del código usando Bucles y algunas sentencias de apoyo.

Los Bucles manejados en Dart son los que utilizamos para recorrer las colecciones y otras tareas.

  • For
  • While
  • Do — While

y tenemos las declaraciones de apoyo para interrumpir o cortar estos Bucles.

  • break
  • continue

También hay otras formas de manipular el flujo de control en Dart con:

  • Ramas (Branches), como son if y switch.
  • Excepciones, como try, catch y throw.

Bucle For

El For se encarga de recorrer cada uno de los elementos de un Iterable y hacer cualquier sentencia o lógica dentro de ellos.

void main() {
  // ejemplo básico para imprimir los datos de una lista.
  const vocals = ['A', 'E', 'I', 'O', 'U'];  

  for (int i = 0; i < vocals.length; i++) {
    print(vocals[i]);
  }

  // imprimir los números de 0 a 4
  var message = StringBuffer('Imprimir números de 0 a 4 ');
  for (var i = 0; i < 5; i++) {
    message.write('$i');
  }

  print(message);
}

Los cierres de los bucles For en Dart, capturan el valor del índice lo que hace que se ejecute en secuencia los callback dentro del bucle.

void main() {
  // ejemplo básico que nos proporciona Dart.
  // donde vemos una lista que se llena en un For
  // otro For-in se encarga de llamar el callback e imprimir los datos
  // imprime del 0 al 3
  var callbacks = [];
  for (var i = 0; i < 4; i++) {
    callbacks.add(() => print(i));
  }

  for (final call in callbacks) {
    call();
  }
}

Los For-in se usa cuando no es necesario el índice, simplemente nos interesa el valor de cada elemento. Primero se coloca el For luego el tipo de dato del elemento, seguido la palabra in y por último la lista a recorrer.

void main() {
  const vocals = ['A', 'E', 'I', 'O', 'U'];

  // imprimimos el valor de la vocal
  for (String vocal in vocals) {
    print(vocal);
  }
}

También podemos usar en los For-in solo los campos que necesitamos de un ejemplo usando patrones de Dart.

class Person {
  String name;
  String document;
  int age;

  Person({required this.name, required this.document, required this.age});
}

void main() {
  var persons = [
    Person(name: 'Bob', document: '123', age: 30),
    Person(name: 'Pep', document: '321', age: 25),
    Person(name: 'Noah', document: '456', age: 33),
  ];

  // imprimimos solo los campos que necesitamos
  for (final Person(:name, :age) in persons) {
    print('$name tiene $age años');
  }
}

While y Do-While

El While es un bucle que mientras se cumpla una condición inicial hace un proceso indicado. El Do-While es un bucle que es para hacer un proceso mientras se cumpla una condición final.

void main() {
  // Ejemplo para WHILE
  var iterable = ['A', 'B', 'C'].iterator;
  // recorre el iterable mientras haya elementos.
  while (iterable.moveNext()) {
    print('imprime ${iterable.current}');
  }

  // Ejemplo para DO-WHILE
  const vocals = ['A', 'E', 'I', 'O', 'U'];
  int count = 0;

  do {
    print('imprime esta línea la cantidad de veces de la lista');
    count++;
  } while(count < vocals.length);

}

Break y Continue

Podemos usar break para parar y salir del bucle.

void main() {
  const vocals = ['A', 'E', 'I', 'O', 'U'];
  int count = 0;

  while(true) {
    // cuando count sea = 2, salimos del bucle
   // por lo cual solo imprime 3 vocales
   print(vocals[count]);
   if (count == 2) break;
   count++;
  }
}

Podemos usar continue para saltar al siguiente elemento de la lista.

void main() {
  const vocals = ['A', 'E', 'I', 'O', 'U'];

  for (int i = 0; i < vocals.length; i++) {
    if (i == 2) continue;
    // cuando count sea = 2, saltamos al siguiente elemento
    // por lo cual imprime todas las vocales excepto la 3 (I)
    print(vocals[i]);

  }
}

Cuando se usa un Iterable es recomendable usar otros métodos que nos brinda.

class Person {
  String name;
  String document;
  int age;

  Person({required this.name, required this.document, required this.age});
}

void main() {
  var persons = [
    Person(name: 'Bob', document: '123', age: 30),
    Person(name: 'Pep', document: '321', age: 25),
    Person(name: 'Noah', document: '456', age: 33),
  ];

  // Ejemplo utilizando continue
  for (int i = 0; i < persons.length; i++) {
    if (!persons[i].name.contains('o')) continue;
    // cuando count sea = 2, saltamos al siguiente elemento
    // por lo cual imprime todas las vocales excepto la 3 (I)
    print(persons[i].name);
  }
  // ejemplo con where (recomendado)
  persons.where((p) => p.name.contains('o')).forEach((p) => print(p.name));
}

Conclusión

Aprendimos un poco sobre flujos de control, en este caso más específicamente los Bucles (Loops). Vimos los diferentes tipos de Bucles que tiene Dart y algunos ejemplos de uso.

Siguientes pasos

Seguiremos con flujos de control pero ahora con Ramas (Branches).

Fuentes

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *