Menu
Coddy logo textTech

Desenler ve Eşleştirme (3.0)

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 87 / 110.

Dart 3, verileri tek bir ifadede parçalarına ayırmanın ve incelemenin güçlü bir yolu olan desen eşleştirmeyi (pattern matching) sundu. Desenler; nesnelerden değerleri çıkarmanıza, yapılarını kontrol etmenize ve değişkenleri bağlamanıza olanak tanır - hem de hepsini aynı anda.

Kayıtlar (records) ile temel yapı bozmayı (destructuring) zaten gördünüz. Desenler (patterns), bunu nesneler, listeler ve eşlemlerle (maps) çalışacak şekilde genişletir:

void main() {
  // Liste desenleri
  var numbers = [1, 2, 3];
  var [a, b, c] = numbers;
  print('$a, $b, $c');  // 1, 2, 3
  
  // Map desenleri
  var user = {'name': 'Alice', 'age': 30};
  var {'name': name, 'age': age} = user;
  print('$name is $age');  // Alice is 30
}

Desenler, switch ifadelerinde özellikle güçlü hale gelir. Aynı anda tür, değer ve yapı üzerinde eşleştirme yapabilirsiniz:

String describe(Object obj) {
  return switch (obj) {
    int n when n < 0 => 'Negative number',
    int n => 'Positive number: $n',
    String s => 'String of length ${s.length}',
    [int first, ...] => 'List starting with $first',
    _ => 'Something else',
  };
}

void main() {
  print(describe(-5));        // Negatif sayı
  print(describe(42));        // Pozitif sayı: 42
  print(describe([1, 2, 3])); // 1 ile başlayan liste
}

when ifadesi desenlere koşullar ekler ve ... bir listedeki kalan öğelerle eşleşir. Alt çizgi _, her şeyle eşleşen bir joker karakter görevi görür. Mühürlü sınıflarla (sealed classes) birleştirildiğinde desenler, karmaşık veri yapılarının kapsamlı ve tür güvenli bir şekilde işlenmesini sağlar.

challenge icon

Görev

Kolay

Farklı girdi türlerini analiz etmek ve kategorize etmek için desen eşleştirmeyi (pattern matching) kullanan bir veri sınıflandırıcı oluşturalım! Dart 3'ün güçlü desen eşleştirme özelliklerini kullanarak çeşitli veri yapılarını tanımlayabilen ve açıklayabilen bir sistem oluşturacaksınız.

Kodunuzu iki dosyada düzenleyeceksiniz:

  • classifier.dart: Bir Object parametresi alan ve bir String açıklaması döndüren classify adında bir fonksiyon oluşturun. Bu durumları işlemek için desen eşleştirmeli bir switch ifadesi kullanın:
    • Boş bir liste [], Empty list döndürmelidir
    • Tam olarak bir tam sayı öğesi içeren bir liste, Single item: [value] döndürmelidir
    • Tam olarak iki öğe içeren bir liste, Pair: [first] and [second] döndürmelidir
    • Bir tam sayı ile başlayan ve ardından daha fazla öğe gelen bir liste, List starting with [first], length: [total length] döndürmelidir (... rest desenini kullanın)
    • Hem 'name' hem de 'age' anahtarlarını içeren bir map, [name] is [age] years old döndürmelidir (map deseni parçalamayı - destructuring - kullanın)
    • Negatif olan bir tam sayı (when ifadesini kullanın), Negative: [value] döndürmelidir
    • Sıfır olan bir tam sayı, Zero döndürmelidir
    • Diğer tüm tam sayılar, Positive: [value] döndürmelidir
    • Diğer tüm değerler, Unknown type döndürmelidir
  • main.dart: Sınıflandırıcınızı içe aktarın ve çeşitli girdilerle desen eşleştirmeyi gösterin. Bu değerlerin her birini sınıflandırmanın sonucunu yazdırın:
    • Boş bir liste []
    • Tek öğeli bir liste: [42]
    • İki öğeli bir liste: ['hello', 'world']
    • Daha uzun bir liste: [1, 2, 3, 4, 5]
    • Bir map: {'name': 'Alice', 'age': 25}
    • Tam sayı -10
    • Tam sayı 0
    • Tam sayı 99

Bu meydan okuma; liste desenlerini, map desenlerini, korumalar (guards) için when ifadesini ve rest desenini (...) - dersteki tüm temel desen eşleştirme özelliklerini - birleştirir!

Beklenen çıktı:

Empty list
Single item: 42
Pair: hello and world
List starting with 1, length: 5
Alice is 25 years old
Negative: -10
Zero
Positive: 99

Kopya kağıdı

Dart 3, verileri tek bir ifadede ayrıştırmak (destructuring) ve incelemek için desen eşleştirme (pattern matching) özelliğini tanıttı.

Liste Desenleri

Listelerden değerleri çıkarın:

var numbers = [1, 2, 3];
var [a, b, c] = numbers;
print('$a, $b, $c');  // 1, 2, 3

Map Desenleri

Map yapılarını anahtara göre ayrıştırın:

var user = {'name': 'Alice', 'age': 30};
var {'name': name, 'age': age} = user;
print('$name is $age');  // Alice is 30

Desenli Switch İfadeleri

Tür, değer ve yapı üzerinde eşleştirme yapın:

String describe(Object obj) {
  return switch (obj) {
    int n when n < 0 => 'Negative number',
    int n => 'Positive number: $n',
    String s => 'String of length ${s.length}',
    [int first, ...] => 'List starting with $first',
    _ => 'Something else',
  };
}

Desen Özellikleri

  • when cümleciği: Desenlere koşullar ekler
  • ... (rest deseni): Bir listedeki geri kalan öğelerle eşleşir
  • _ (wildcard): Herhangi bir şeyle eşleşir

Kendin dene

import 'classifier.dart';

void main() {
  // TODO: Her bir değeri kategorize etmek için classify fonksiyonunu kullanın
  // ve sonuçları yazdırın
  
  // Boş bir liste ile test et
  print(classify([]));
  
  // TODO: Tek bir öğe içeren bir liste ile test et: [42]
  
  // TODO: İki öğe içeren bir liste ile test et: ['hello', 'world']
  
  // TODO: Daha uzun bir liste ile test et: [1, 2, 3, 4, 5]
  
  // TODO: Bir map ile test et: {'name': 'Alice', 'age': 25}
  
  // TODO: -10 tam sayısı ile test et
  
  // TODO: 0 tam sayısı ile test et
  
  // TODO: 99 tam sayısı ile test et
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler