? ve ! Operatörleri
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 25 / 110.
Nullable türlerle çalışırken Dart, değerlere güvenli bir şekilde erişmek için iki temel operatör sunar. null-aware access operator ?. ve null assertion operator !, potansiyel olarak null olan değerleri nasıl ele alacağınızı kontrol etmenizi 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 değerlerle güvenli bir şekilde nasıl ç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 eksiksiz bilgilere sahipken diğerlerinin kataloglama işlemi hâlâ devam etmektedir. Sınıfınız şunlara sahip olmalıdır:- Null olamayan bir
String name- her ürünün bir adı olmalıdır - Null olamayan bir
double price- her ürünün bir fiyatı olmalıdır - Null olabilen bir
String? description- bazı ürünlerin henüz açıklaması yoktur - Null olabilen bir
String? category- bazı ürünler henüz kategorilere ayrılmamıştır namevepricedeğerlerini gerekli parametreler olarak alan bir oluşturucugetDescriptionLength()kullanarak açıklamanın uzunluğunu döndüren veya açıklama yoksa?.döndüren birnullmetodugetCategoryUppercase()kullanarak kategoriyi büyük harfle döndüren bir!metodu - bu metot kategorinin ayarlanmış olduğunu varsayar- Ürün bilgilerini yazdıran, açıklama null olduğunda
displayProduct()ve kategori null olduğundaNo descriptiongösteren birUncategorizedmetodu
- Null olamayan bir
main.dart: Ürün sınıfınızı içe aktarın ve her iki operatörü de gösterin:- Fiyatı
'Laptop'olan999.99adlı bir ürün oluşturun, ardından açıklamasını'High-performance computing device've kategorisini'Electronics'olarak ayarlayın - Fiyatı
'Mystery Item'olan49.99adlı bir ürün oluşturun (açıklamayı ve kategoriyi null olarak bırakın) - Laptop için:
displayProduct()metodunu çağırın,Description length: [length]kullanarakgetDescriptionLength()yazdırın veCategory: [uppercase]kullanarakgetCategoryUppercase()yazdırın - Mystery Item için:
displayProduct()metodunu çağırın veDescription length: [length]kullanarakgetDescriptionLength()yazdırın (bu işlemnullgösterecektir)
- Fiyatı
displayProduct() metodu şu biçimde 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: nullKendin 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
1Nesne Tabanlı Programlamanın Temelleri
Harici DosyalarKütüphaneler ve İçe AktarmalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar SözcüğüMetotlarÖrnek DeğişkenleriYapıcıların TemelleriTekrar - Basit Hesap Makinesi4Null Güvenliği
Null Güvenliğine GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Sözcüğü ve Null GüvenliğiNull-Aware OperatörlerSınıflarda Null GüvenliğiTekrar - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulamak ve GenişletmekBirden Çok ArayüzTekrar - Şekil Hesaplayıcı10Koleksiyonlar ve Generics
List, Set, Map Genel BakışTür Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorTekrar - Generic Depolama2Dart'ta Yapıcılar
Varsayılan YapıcıAdlandırılmış YapıcılarBaşlatıcı ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Ön Ek KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DerinliğiBilgi GizlemeTekrar - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Çok Mixin KullanımıMixin'lerde on Anahtar SözcüğüMixin ve Kalıtım KarşılaştırmasıMixin ve Arayüz KarşılaştırmasıÖzet - Hayvan Sistemi11Özel Metotlar
toString() Geçersiz KılmahashCode & == Geçersiz KılmaComparable Arayüzücall() MetodunoSuchMethod Geçersiz KılmaÖzet - Özel Koleksiyon14Tasarım Desenleri Bölüm 1
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy Deseni3Sınıf Özellikleri
Örnek ve Static ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatic Metotlar ve AlanlarGetter ve Setter'larÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar SözcüğüMetot Geçersiz Kılma@override Açıklamasıfinal Sınıf Anahtar SözcüğüKurucular ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriArayüzler Yoluyla Çok BiçimlilikÇalışma Zamanı Tür Denetimiis ve as OperatörleriCovariant Anahtar KelimesiTekrar - Ödeme İşlemcisi12Asenkron OOP
Future'ler ve async/awaitStream TemelleriStream DenetleyicileriAsenkron YapıcılarSınıf Metotlarında AsenkronlukÖzet - Veri Getirici15Tasarım Desenleri Bölüm 2
Komut DeseniAdaptör DeseniDekoratör DeseniŞablon Metot DeseniDurum DeseniBileşik DesenDepo DeseniKendi başına pratik yap: Online Dart derleyicisi