Null-Aware Operatörleri
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 27 / 110.
?. ve ! operatörlerinin ötesinde Dart, null olabilir (nullable) değerlerle çalışmayı daha kısa ve özlü hale getiren ek operatörler sağlar. Bu null-aware operatörler, potansiyel null değerlerle uğraşırken daha temiz kod yazmanıza yardımcı olur.
null birleştirme operatörü ??, sol taraftaki değer null değilse onu, aksi takdirde sağ taraftaki değeri döndürür:
String? nickname;
String displayName = nickname ?? 'Guest';
print(displayName); // Guest
nickname = 'Alex';
displayName = nickname ?? 'Guest';
print(displayName); // AlexNull-aware atama operatörü ??=, bir değeri yalnızca değişken şu anda null ise atar:
String? username;
username ??= 'Anonymous';
print(username); // Anonymous
username ??= 'NewName';
print(username); // Hala Anonymous (null değildi)İç içe geçmiş özellikler için null-aware (null-farkındalıklı) erişim operatörünü ?. zincirleme olarak kullanabilirsiniz:
String? city = user?.address?.city; // user veya address null olsa bile güvenlidirBu operatörler birbiriyle iyi uyum sağlar. Örneğin, null olabilir bir özelliğe erişebilir ve varsayılan bir değer sağlayabilirsiniz:
String greeting = user?.name ?? 'Stranger';
// Eğer user null ise VEYA user.name null ise, 'Stranger' kullanBu operatörleri kullanmak, programınız boyunca null güvenliğini korurken kodunuzun okunabilir kalmasını sağlar.
Görev
Kolayİsteğe bağlı bilgileri işlerken null-aware operatörlerinin kodunuzu nasıl daha temiz hale getirebileceğini gösteren bir misafir kayıt sistemi oluşturalım.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
guest.dart: Bir etkinliğe katılan birini temsil eden birGuestsınıfı tanımlayın. Bazı misafirler tüm detayları sağlarken, diğerleri sadece temel bilgileri verir. Sınıfınız şunlara sahip olmalıdır:- Null olamayan bir
String name- her misafirin bir ismi olmalıdır - Null olabilir bir
String? email- herkes e-posta adresi vermeyebilir - Null olabilir bir
String? dietaryPreference- bazı misafirler diyet ihtiyaçlarını belirtmez nameparametresini zorunlu olarak alan bir yapıcı (constructor)- E-posta varsa onu, yoksa
??operatörünü kullanarak'No email provided'değerini döndüren birgetDisplayEmail()metodu ??=operatörünü kullanarak,dietaryPreferencedeğerini yalnızca şu an null ise'Standard'olarak ayarlayan birassignDefaultDiet()metodu?.kullanarak e-postanın uzunluğunu döndüren veya e-posta yoksanulldöndüren birgetEmailDomain()metodu- Misafirin yaka kartı bilgilerini yazdıran bir
printBadge()metodu
- Null olamayan bir
main.dart: Misafir sınıfınızı içe aktarın ve farklı bilgi düzeylerine sahip üç misafir kaydedin:'Alice'adında bir misafir oluşturun, e-postasını'alice@company.com've diyet tercihini'Vegetarian'olarak ayarlayın'Bob'adında bir misafir oluşturun, sadece e-postasını'bob@email.org'olarak ayarlayın (diyet tercihini null bırakın)'Charlie'adında bir misafir oluşturun (hem e-postayı hem de diyet tercihini null bırakın)- Her üç misafir için de
assignDefaultDiet()metodunu çağırın - Sırasıyla her misafir için
printBadge()metodunu çağırın, ardındangetEmailDomain()kullanarakEmail length: [result]yazdırın
printBadge() metodu şu formatta yazdırmalıdır:
=== Guest Badge ===
Name: [name]
Email: [getDisplayEmail()]
Diet: [dietaryPreference or "Not specified"]Alice'in diyet tercihinin nasıl 'Vegetarian' olarak kaldığına dikkat edin; çünkü ??= operatörü yalnızca değer null olduğunda atama yapar, oysa Bob ve Charlie'ye varsayılan 'Standard' diyeti atanır.
Beklenen çıktı:
=== Guest Badge ===
Name: Alice
Email: alice@company.com
Diet: Vegetarian
Email length: 17
=== Guest Badge ===
Name: Bob
Email: bob@email.org
Diet: Standard
Email length: 13
=== Guest Badge ===
Name: Charlie
Email: No email provided
Diet: Standard
Email length: nullKopya kağıdı
Dart, null olabilen (nullable) değerlerle daha kısa ve öz bir şekilde çalışmak için null-aware operatörler sunar.
Null-coalescing operatörü ??, sol taraftaki değer null değilse onu, null ise sağ taraftaki değeri döndürür:
String? nickname;
String displayName = nickname ?? 'Guest';
print(displayName); // Guest
nickname = 'Alex';
displayName = nickname ?? 'Guest';
print(displayName); // AlexNull-aware atama operatörü ??=, bir değeri yalnızca değişken şu an null ise atar:
String? username;
username ??= 'Anonymous';
print(username); // Anonymous
username ??= 'NewName';
print(username); // Still Anonymous (wasn't null)İç içe geçmiş özellikler için null-aware erişim operatörünü ?. zincirleme olarak kullanabilirsiniz:
String? city = user?.address?.city; // Safe even if user or address is nullBu operatörler birlikte kombine edilebilir:
String greeting = user?.name ?? 'Stranger';
// If user is null OR user.name is null, use 'Stranger'Kendin dene
import 'guest.dart';
void main() {
// TODO: 'Alice' adında bir konuk oluşturun
// E-postasını 'alice@company.com' olarak ayarlayın
// Diyet tercihini 'Vegetarian' olarak ayarlayın
// TODO: 'Bob' adında bir konuk oluşturun
// Sadece e-postasını 'bob@email.org' olarak ayarlayın
// Diyet tercihini null olarak bırakın
// TODO: 'Charlie' adında bir konuk oluşturun
// Hem e-postayı hem de diyet tercihini null olarak bırakın
// TODO: Üç konuğun tamamında assignDefaultDiet() fonksiyonunu çağırın
// TODO: Sırasıyla her konuk için (Alice, Bob, Charlie):
// - printBadge() fonksiyonunu çağırın
// - getEmailDomain() kullanarak 'Email length: [result]' yazdırın
}
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 Depolama2Dart'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ı