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.
Görev
KolayFarklı 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: BirObjectparametresi alan ve birStringaçıklaması döndürenclassifyadında bir fonksiyon oluşturun. Bu durumları işlemek için desen eşleştirmeli bir switch ifadesi kullanın:- Boş bir liste
[],Empty listdö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 olddöndürmelidir (map deseni parçalamayı - destructuring - kullanın) - Negatif olan bir tam sayı (
whenifadesini kullanın),Negative: [value]döndürmelidir - Sıfır olan bir tam sayı,
Zerodöndürmelidir - Diğer tüm tam sayılar,
Positive: [value]döndürmelidir - Diğer tüm değerler,
Unknown typedöndürmelidir
- Boş bir liste
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
- Boş bir liste
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: 99Kopya 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, 3Map 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 30Desenli 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
whencü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
}
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
1OOP Temelleri
Harici DosyalarKütüphaneler ve ImportlarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarÖrnek DeğişkenleriConstructor TemelleriÖzet - Basit Hesap Makinesi4Null Safety
Null Safety'ye GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Kelimesi ve Null SafetyNull-Aware OperatörleriSınıflarda Null SafetyÖzet - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulama vs. GenişletmeÇoklu ArayüzlerÖzet - Şekil Hesaplayıcı10Koleksiyonlar ve Generic'ler
List, Set, Map Genel BakışTip Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorÖzet - Generic Depolama13İleri Düzey OOP Kavramları
Kompozisyon ve KalıtımExtension MetotlarÇağrılabilir SınıflarSealed Sınıflar (Dart 3)Records (Dart 3)Desenler ve Eşleştirme (3.0)Metot İçeren Enum'lar2Dart'ta Yapıcılar
Varsayılan Yapıcıİsimlendirilmiş Yapıcılarİlklendirme ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Öneki KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DetaylarıBilgi GizlemeÖzet - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Fazla Mixin KullanımıMixin'lerde on Anahtar KelimesiMixin vs KalıtımMixin vs ArayüzÖzet - Hayvan Sistemi11Özel Metotlar
toString() OverridehashCode ve == OverrideComparable Arayüzücall() MetodunoSuchMethod OverrideÖzet - Özel Koleksiyon14Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı17Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakter SistemiAraç Kiralama Servisi3Sınıf Özellikleri
Instance ve Statik ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatik Metotlar ve AlanlarGetters ve SettersÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar KelimesiMetot Ezme@override Anotasyonufinal Sınıf Anahtar KelimesiYapıcı Metotlar ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriInterface'ler ile Çok BiçimlilikÇalışma Zamanı Tip Kontrolüis ve as OperatörleriCovariant Anahtar KelimesiÖzet - Ödeme İşlemcisi12Asenkron OOP
Futures ve async/awaitStream TemelleriStream Controller'larAsenkron KurucularSınıf Metotlarında Asenkron KullanımıÖzet - Data Fetcher15Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı