Sınıflarda Null Güvenliği
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 28 / 110.
Sınıfları tasarlarken, hangi alanların zorunlu hangilerinin isteğe bağlı olduğuna karar vermeniz gerekir. Null safety, örnek değişkenlerini nasıl tanımladığınızı ve yapıcıları nasıl yazdığınızı etkiler.
Null değer kabul etmeyen alanlar, kurucu gövdesi çalışmadan önce başlatılmalıdır. Bunu başlatıcı listeleri, kurucu parametreleri veya varsayılan değerler aracılığıyla yapabilirsiniz:
class User {
String name; // Başlatılmalıdır
String? bio; // İsteğe bağlı - null olabilir
int age = 0; // Varsayılan değeri var
User(this.name); // name parametre aracılığıyla başlatılır
}Boş bırakılabilir (nullable) alanlar için, varsayılan olarak null değerini aldıklarından onları başlatılmamış bırakabilirsiniz. Bu, isteğe bağlı veriler için kullanışlıdır:
class Product {
String title;
String? description; // İsteğe bağlı ürün açıklaması
double? discount; // Varsayılan olarak indirim yok
Product(this.title);
}
var item = Product('Laptop');
print(item.description); // null
print(item.discount); // nullNullable alanlara erişirken, öğrendiğiniz null-aware operatörleri kullanın:
class Order {
String id;
User? customer;
Order(this.id);
String getCustomerName() {
return customer?.name ?? 'Guest';
}
}İsimlendirilmiş parametrelerdeki required anahtar kelimesi, çağıranların temel değerleri sağlamasını sağlar:
class Account {
String email;
String? phone;
Account({required this.email, this.phone});
}
var acc = Account(email: 'test@mail.com'); // phone isteğe bağlıdırBoş bırakılabilir (nullable) ve boş bırakılamaz (non-nullable) alanlar arasında düşünceli bir seçim yaparak, hangi verilerin zorunlu, hangilerinin isteğe bağlı olduğunu net bir şekilde ileten sınıflar oluşturursunuz.
Görev
KolayNull safety kullanarak gerekli ve isteğe bağlı alanların düşünceli bir karışımıyla sınıfların nasıl tasarlanacağını gösteren bir otel rezervasyon sistemi oluşturalım.
Kodunuzu iki dosyada düzenleyeceksiniz:
reservation.dart: Bir otel rezervasyonunu temsil eden birReservationsınıfı tanımlayın. Her rezervasyonun bazı temel bilgileri olmalıdır, ancak bazı ayrıntılar konukların sağlayabileceği veya sağlamayabileceği isteğe bağlı ek bilgilerdir. Sınıfınız şunlara sahip olmalıdır:- Null kabul etmeyen bir
String guestName- her rezervasyonda bir konuk adı bulunmalıdır - Null kabul etmeyen bir
int roomNumber- her rezervasyona bir oda atanmalıdır - Varsayılan değeri
int nightsolan null kabul etmeyen bir1- minimum konaklama bir gecedir - Null kabul edebilen bir
String? specialRequests- konukların özel istekleri olabilir - Null kabul edebilen bir
DateTime? checkInTime- kesin varış zamanı bilinmiyor olabilir requiredveguestNameiçinroomNumberkullanan, adlandırılmış parametrelere sahip bir kurucu;nightsise varsayılan değeriyle isteğe bağlı olmalıdır- Özel istekler sağlanmışsa bunları döndüren, sağlanmamışsa
getRequestsSummary()işleciyle'No special requests'döndüren bir??metodu getArrivalInfo()kullanarak giriş zamanının dize gösterimini döndüren veya ayarlanmamışsa?.döndüren birnullmetodu- Rezervasyon ayrıntılarını görüntüleyen bir
printConfirmation()metodu
- Null kabul etmeyen bir
main.dart: Rezervasyon sınıfınızı içe aktarın ve gerekli ve isteğe bağlı verilerin farklı birleşimlerini gösteren rezervasyonlar oluşturun:'Sarah Johnson'adlı konuk için101numaralı odada3gecelik, özel istekleri'Late checkout'olan ve giriş zamanıDateTime(2024, 6, 15, 14, 30)olarak ayarlanmış bir rezervasyon oluşturun'Mike Chen'adlı konuk için205numaralı odada (varsayılan gece sayısını kullanın), yalnızca özel isteği'Extra pillows'olarak ayarlanmış bir rezervasyon oluşturun'Emma Davis'adlı konuk için310numaralı odada2gecelik bir rezervasyon oluşturun (isteğe bağlı iki alanı da null bırakın)- Her rezervasyon için sırayla
printConfirmation()metodunu çağırın, ardındanArrival: [result]kullanarakgetArrivalInfo()yazdırın
printConfirmation() metodu şu biçimde yazdırmalıdır:
=== Reservation Confirmed ===
Guest: [guestName]
Room: [roomNumber]
Nights: [nights]
Requests: [getRequestsSummary()]Beklenen çıktı:
=== Reservation Confirmed ===
Guest: Sarah Johnson
Room: 101
Nights: 3
Requests: Late checkout
Arrival: 2024-06-15 14:30:00.000
=== Reservation Confirmed ===
Guest: Mike Chen
Room: 205
Nights: 1
Requests: Extra pillows
Arrival: null
=== Reservation Confirmed ===
Guest: Emma Davis
Room: 310
Nights: 2
Requests: No special requests
Arrival: nullKendin dene
import 'reservation.dart';
void main() {
// TODO: 'Sarah Johnson' için rezervasyon oluşturun
// Oda 101, 3 gece, özel istekler: 'Late checkout'
// Giriş zamanı: DateTime(2024, 6, 15, 14, 30)
// TODO: 'Mike Chen' için rezervasyon oluşturun
// Oda 205, varsayılan gece sayısını kullanın, özel istekler: 'Extra pillows'
// Giriş zamanı belirtilmedi
// TODO: 'Emma Davis' için rezervasyon oluşturun
// Oda 310, 2 gece, özel istek yok, giriş zamanı yok
// TODO: Sırasıyla her rezervasyon için:
// 1. printConfirmation() fonksiyonunu çağırın
// 2. getArrivalInfo() kullanarak 'Arrival: [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
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