Pattern Matching și Destructurare Avansată în Dart 3: Switch Expressions, Guard Clauses și Destructurarea Colecțiilor în Dart

Ghid complet pentru Pattern Matching în Dart 3: utilizarea expresiilor switch ca valori, clauze de gardă (when), destructurarea automată a obiectelor, a listelor și a map-urilor cu verificare exhaustivă.

Sintaxă
return switch (response) { Success(:final data) => data, Error(:final code, :final msg) when code >= 500 => ... }

Lansat în Dart 3.0, sistemul de Pattern Matching reprezintă una dintre cele mai mari evoluții ale limbajului. El permite inspectarea structurii datelor, verificarea tipurilor, filtrarea pe baza unor condiții suplimentare (guard clauses) și extragerea valorilor componente (destructuring) într-o singură instrucțiune elegantă.

În Dart 3, instrucțiunea switch a devenit și o expresie (Switch Expression), ceea ce înseamnă că poate returna direct o valoare și este verificată exhaustiv de către compilator.

Comparație: Parsare Tradițională Imperativă vs Pattern Matching Dart 3
// ❌ ABORDARE CLASICĂ: Verificări repetitive de tip, cast forțat și if-uri imbricate
String describeResponseOld(dynamic response) {
  if (response is Map) {
    if (response.containsKey('error')) {
      final code = response['error']['code'] as int;
      final msg = response['error']['message'] as String;
      return 'Eroare HTTP $code: $msg';
    } else if (response.containsKey('data')) {
      return 'Succes: ${response['data']}';
    }
  }
  return 'Răspuns necunoscut';
}

// CORECT & IDIOMATIC ÎN DART 3: Switch Expression cu Destructurare de Map
String describeResponse(dynamic response) => switch (response) {
  {'error': {'code': int code, 'message': String msg}} when code >= 500 =>
    'Eroare critică de server ($code): $msg',
  {'error': {'code': int code, 'message': String msg}} =>
    'Eroare client ($code): $msg',
  {'data': var data} => 'Date recepționate cu succes: $data',
  _ => 'Format de răspuns nerecunoscut'
};

Tipuri Principale de Tipare (Patterns) Suportate în Dart 3

Tip de Pattern Sintaxă Exemplu Descriere Tehnică
Pattern de Obiect User(:final name, :final age) Extrage proprietățile name și age direct din instanța clasei User.
Pattern de Listă [var first, var second, ...var rest] Extrage primele două elemente și restul listei folosind operatorul rest (...).
Pattern Relațional >= 0 && <= 100 Validează dacă valoarea se încadrează într-un interval fără a repeta variabila.
Clauză de Gardă case Pattern when conditie Aplică potrivirea doar dacă expresia booleană din when este adevărată.
Destructurare Directă în Declarații de Variabile
void main() {
  // Destructurarea unei liste cu rest:
  final [head, second, ...tail] = [10, 20, 30, 40, 50];
  print('Primul: $head, Al doilea: $second, Restul: $tail');
  // Afișează: Primul: 10, Al doilea: 20, Restul: [30, 40, 50]

  // Destructurarea unui Record:
  final (title, :author, :pages) = ('Ghid Dart', author: 'Dexter', pages: 350);
  print('Carte: $title de $author ($pages pagini)');
}