Boucles Loops

I. Boucle for standard

Syntaxe : for(initialisation; condition; itérateur) { corps de boucle }

1 : Concaténation basique de chaînes

void main() {
  var message = StringBuffer('welcome to FoxDevelop.com');
  for (var i = 0; i < 5; i++) {
    message.write('!');
  }
  print(message); // welcome to FoxDevelop.com!!!!!
}Langage du code : Dart (dart)

La boucle s’exécute de 0 à 5 (5 exclu), c’est-à-dire que i prend les valeurs 0 à 4 pour un total de cinq itérations. Chaque fois, un point d’exclamation est ajouté à la fin de la chaîne.

1ère fois : welcome to FoxDevelop.com!

2ème fois : welcome to FoxDevelop.com!!

5ème fois : welcome to FoxDevelop.com!!!!!

Caractéristique : capture d’index par fermeture (différence majeure avec JavaScript)

Dart lie une variable i indépendante à chaque itération, ce qui évite le défaut de JavaScript où tous les rappels affichent la valeur finale 2.

void main() {
  var callbacks = [];
  for (var i = 0; i < 2; i++) {
    callbacks.add(() => print(i));
  }
  for (final c in callbacks) {
    c();
  }
}
// Sortie
// 0
// 1
Langage du code : Dart (dart)

II. Boucle for-in pour parcourir des objets itérables List/Set

Adapté aux cas où vous n’avez pas besoin de l’indice, seulement de la valeur de l’élément.

Écriture basique

class Candidate {
  void interview() => print("Entretien terminé");
}

void main() {
  var candidates = [Candidate(), Candidate()];
  for (var candidate in candidates) {
    candidate.interview();
  }
}Langage du code : Dart (dart)

Parcourt la liste candidates, stocke chaque élément dans la variable candidate puis appelle sa méthode interview(). Après chaque lecture, l’itérateur passe automatiquement à l’élément suivant.

Utilisation avancée

for-in associé à la déstructuration de motif d’objet (Dart 3+)

class Candidate {
  final String name;
  final int yearsExperience;
  Candidate({required this.name, required this.yearsExperience});
}

void main() {
  var candidates = [
    Candidate(name: "Lily", yearsExperience: 6),
    Candidate(name: "Tom", yearsExperience: 3),
  ];

  // Déstructuration directe des champs via le motif objet
  for (final Candidate(:name, :yearsExperience) in candidates) {
    print('$name possède $yearsExperience années d’expérience professionnelle');
  }
}
Langage du code : Dart (dart)

Combiné à la déstructuration vue précédemment, il extrait automatiquement les deux propriétés de l’objet dans les variables name et yearsExperience, utilisables directement dans le corps de boucle.

III. Méthode de parcours Iterable.forEach ()

Parcours fonctionnel natif aux collections, passez un rappel pour traiter chaque élément.

void main() {
  var collection = [1, 2, 3];
  collection.forEach(print);
  // Sortie 1 2 3
}Langage du code : Dart (dart)

forEach est une méthode native de Dart accessible sur toute collection itérable.

IV. while / do-while

1. while

Vérifie la condition avant d’exécuter le corps ; la boucle peut ne jamais s’exécuter. Fonctionne identiquement à C, C++, Java, C# et d’autres langages.

bool isDone() => false;
void doSomething() => print("Exécuter la tâche");

void main() {
  while (!isDone()) {
    doSomething();
    break;
  }
}Langage du code : Dart (dart)

On évalue d’abord !isDone() : la fonction renvoie false, la négation donne true donc le bloc s’exécute :

doSomething();
break;

L’instruction break termine immédiatement la boucle et saute au code après le bloc while. Si isDone() renvoyait true, la première vérification échouerait et le corps ne s’exécuterait pas du tout.

2. do-while

Exécute le corps une première fois sans condition, puis vérifie la contrainte : au moins une exécution est garantie.

bool atEndOfPage() => true;
void printLine() => print("Afficher une ligne");

void main() {
  do {
    printLine();
  } while (!atEndOfPage());
}
Langage du code : Dart (dart)

Que la condition du while soit vraie ou fausse, le code dans le bloc do {} s’exécute obligatoirement une fois.

V. break / continue

break

Arrête complètement la boucle instantanément et saute aux instructions suivantes ; le reste du corps n’est pas exécuté.

bool shutDownRequested() => true;
void processIncomingRequests() => print("Traiter les requêtes");

void main() {
  while (true) {
    if (shutDownRequested()) break;
    processIncomingRequests();
  }
  print("Fin de la boucle");
}
Langage du code : Dart (dart)

continue

Ignore toutes les instructions restantes de l’itération en cours et passe directement à l’itération suivante.

Écriture for traditionnelle
class Candidate {
  final int yearsExperience;
  Candidate(this.yearsExperience);
  void interview() => print("Réaliser l’entretien");
}

void main() {
  var candidates = [Candidate(3), Candidate(6)];
  for (int i = 0; i < candidates.length; i++) {
    var candidate = candidates[i];
    if (candidate.yearsExperience < 5) {
      continue; // Les candidats avec moins de 5 ans d’expérience sont ignorés
    }
    candidate.interview();
  }
}
Langage du code : Dart (dart)
Alternative fonctionnelle (sans continue)
void main() {
  var candidates = [Candidate(3), Candidate(6)];
  candidates
      .where((c) => c.yearsExperience >= 5)
      .forEach((c) => c.interview());
}
Langage du code : Dart (dart)

VI. Labels pour contrôler des boucles imbriquées

Syntaxe : placer NomLabel: devant une boucle, utiliser avec break NomLabel / continue NomLabel

Utilité : avec des boucles multiples imbriquées, sortir ou sauter directement la boucle externe au lieu de ne gérer que l’interne.

1. break + label

Sortir d’une double boucle

void main() {
  outerLoop:
  for (var i = 1; i <= 3; i++) {
    for (var j = 1; j <= 3; j++) {
      print('i = $i, j = $j');
      if (i == 2 && j == 2) {
        break outerLoop; // Terminer immédiatement la boucle externe marquée outerLoop
      }
    }
  }
  print('outerLoop exited');
}
Langage du code : Dart (dart)

Sortie :

i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited
Langage du code : Dart (dart)

2. continue + label

Passer directement à l’itération suivante de la boucle externe

void main() {
  outerLoop:
  for (var i = 1; i <= 3; i++) {
    for (var j = 1; j <= 3; j++) {
      if (i == 2 && j == 2) {
        continue outerLoop; // Ignorer tous les j restants pour i=2, passer à i=3
      }
      print('i = $i, j = $j');
    }
  }
}
Langage du code : Dart (dart)

Sortie :

i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 3, j = 1
i = 3, j = 2
i = 3, j = 3

Exemple while+break+label

void main() {
  var i = 1;
  outerLoop:
  while (i <= 3) {
    var j = 1;
    while (j <= 3) {
      print('i = $i, j = $j');
      if (i == 2 && j == 2) {
        break outerLoop;
      }
      j++;
    }
    i++;
  }
  print('outerLoop exited');
}
Langage du code : PHP (php)

Résultat d’exécution

D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited

Ce mécanisme se comporte de manière similaire à l’instruction goto des autres langages de programmation.

Boucles Loops

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *