? ve ! Operatörleri
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 25 / 110.
Nullable (boş bırakılabilir) türlerle çalışırken, Dart değerlere güvenli bir şekilde erişmek için iki temel operatör sunar. Null-aware access (null duyarlı erişim) operatörü ?. ve null assertion (null onaylama) operatörü !, potansiyel olarak null olan değerleri nasıl işleyeceğiniz konusunda size kontrol sağlar.
?. operatörü, null olabilen bir değer üzerindeki özelliklere veya yöntemlere güvenli bir şekilde erişir. Eğer değer null ise, tüm ifade kilitlenmek yerine null döndürür:
String? name = 'Alice';
print(name?.length); // 5
name = null;
print(name?.length); // null (çökme olmaz!)! operatörü Dart'a "Bu değerin null olmadığından eminim." der. Nullable bir türü non-nullable bir türe dönüştürür, ancak değer gerçekten null ise bir hata fırlatır:
String? maybeName = 'Bob';
String definite = maybeName!; // Tamam - null olmadığını iddia ediyoruz
print(definite.length); // 3
String? empty = null;
// String crash = empty!; // Çalışma zamanı hatası! Değer null idiNull değerleri sorunsuz bir şekilde işlemek istediğinizde ?. kullanın. ! operatörünü yalnızca bir değerin var olduğundan kesinlikle emin olduğunuzda kullanın - belki bir if ifadesiyle kontrol ettikten sonra veya mantığın bir değeri garanti ettiğini bildiğinizde. ! operatörünün aşırı kullanımı null güvenliğinin amacını boşa çıkarır ve çalışma zamanı çökmelerine neden olabilir.
Görev
Kolay?. ve ! operatörlerini kullanarak null olabilir (nullable) değerlerle nasıl güvenli bir şekilde çalışılacağını gösteren bir ürün envanter sistemi oluşturalım.
Kodunuzu düzenlemek için iki dosya oluşturacaksınız:
product.dart: Envanterdeki bir öğeyi temsil eden birProductsınıfı tanımlayın. Bazı ürünler tam bilgiye sahipken, diğerleri hala kataloglanıyor olabilir. Sınıfınız şunlara sahip olmalıdır:- Null olamaz (non-nullable) bir
String name- her ürünün bir adı olmalıdır - Null olamaz (non-nullable) bir
double price- her ürünün bir fiyatı olmalıdır - Null olabilir (nullable) bir
String? description- bazı ürünlerin henüz açıklaması yoktur - Null olabilir (nullable) bir
String? category- bazı ürünler henüz kategorize edilmemiştir - Gerekli parametreler olarak
namevepricealan bir yapıcı (constructor) ?.kullanarak açıklamanın uzunluğunu döndüren veya açıklama yoksanulldöndüren birgetDescriptionLength()metodu!kullanarak kategoriyi büyük harflerle döndüren birgetCategoryUppercase()metodu - bu metod kategorinin ayarlanmış olduğunu varsayar- Ürün bilgilerini yazdıran, açıklama null olduğunda
"No description"ve kategori null olduğunda"Uncategorized"gösteren birdisplayProduct()metodu
- Null olamaz (non-nullable) bir
main.dart: Ürün sınıfınızı içe aktarın ve her iki operatörü de gösterin:- Adı
'Laptop've fiyatı999.99olan bir ürün oluşturun, ardından açıklamasını'High-performance computing device've kategorisini'Electronics'olarak ayarlayın - Adı
'Mystery Item've fiyatı49.99olan bir ürün oluşturun (açıklama ve kategoriyi null olarak bırakın) - Laptop için:
displayProduct()metodunu çağırın,getDescriptionLength()kullanarakDescription length: [length]yazdırın vegetCategoryUppercase()kullanarakCategory: [uppercase]yazdırın - Mystery Item için:
displayProduct()metodunu çağırın vegetDescriptionLength()kullanarakDescription length: [length]yazdırın (bunullgösterecektir)
- Adı
displayProduct() metodu şu formatta yazdırmalıdır:
Product: [name] - $[price]
Description: [description or "No description"]
Category: [category or "Uncategorized"]Beklenen çıktı:
Product: Laptop - $999.99
Description: High-performance computing device
Category: Electronics
Description length: 32
Category: ELECTRONICS
Product: Mystery Item - $49.99
Description: No description
Category: Uncategorized
Description length: nullKopya kağıdı
Null-aware erişim operatörü ?., null olabilen değerler üzerindeki özelliklere veya metotlara güvenli bir şekilde erişir. Eğer değer null ise, bir hata fırlatmak yerine null döndürür:
String? name = 'Alice';
print(name?.length); // 5
name = null;
print(name?.length); // null (çökme olmaz!)Null assertion (null kesinlik) operatörü !, null olabilen bir türü null olamaz türüne dönüştürür. Bunu yalnızca değerin null olmadığından emin olduğunuzda kullanın, çünkü değer gerçekten null ise bir çalışma zamanı hatası fırlatacaktır:
String? maybeName = 'Bob';
String definite = maybeName!; // Tamam - null olmadığını iddia eder
print(definite.length); // 3
String? empty = null;
// String crash = empty!; // Çalışma zamanı hatası!Hataları önleyen null yönetimi için ?. operatörünü, yalnızca bir değerin var olduğundan kesinlikle emin olduğunuzda ise ! operatörünü kullanın.
Kendin dene
import 'product.dart';
void main() {
// TODO: 999.99 fiyatıyla 'Laptop' adında bir ürün oluşturun
// Ardından açıklamasını 'High-performance computing device' olarak ayarlayın
// Ve kategorisini 'Electronics' olarak ayarlayın
// TODO: 49.99 fiyatıyla 'Mystery Item' adında bir ürün oluşturun
// Açıklama ve kategoriyi null olarak bırakın
// TODO: Laptop için:
// - displayProduct() fonksiyonunu çağırın
// - getDescriptionLength() kullanarak "Description length: [length]" yazdırın
// - getCategoryUppercase() kullanarak "Category: [uppercase]" yazdırın
// TODO: Mystery Item için:
// - displayProduct() fonksiyonunu çağırın
// - getDescriptionLength() kullanarak "Description length: [length]" 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ı