Sınıflarda Null Safety
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.
Boş olamaz (non-nullable) alanlar, yapıcı (constructor) gövdesi çalışmadan önce başlatılmalıdır. Bunu başlatıcı listeleri, yapıcı 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
KolayBir otel için, null güvenliğini kullanarak zorunlu ve isteğe bağlı alanların düşünceli bir karışımıyla sınıfların nasıl tasarlanacağını gösteren bir rezervasyon sistemi oluşturalım.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
reservation.dart: Bir otel rezervasyonunu temsil eden birReservationsınıfı tanımlayın. Her rezervasyonun belirli temel bilgilere ihtiyacı vardır, ancak bazı detaylar misafirlerin sağlayabileceği veya sağlamayabileceği isteğe bağlı ekstralardır. Sınıfınız şunlara sahip olmalıdır:- Null olamaz (non-nullable) bir
String guestName- her rezervasyonun bir misafir adı olmalıdır - Null olamaz bir
int roomNumber- her rezervasyona bir oda atanmalıdır - Varsayılan değeri
1olan null olamaz birint nights- minimum konaklama bir gecedir - Null olabilir (nullable) bir
String? specialRequests- misafirlerin özel istekleri olabilir - Null olabilir bir
DateTime? checkInTime- tam varış zamanı bilinmiyor olabilir guestNameveroomNumberiçinrequiredanahtar kelimesini kullanan,nightsalanının ise varsayılan değeriyle isteğe bağlı olduğu isimlendirilmiş parametrelere (named parameters) sahip bir yapıcı (constructor)- Eğer sağlanmışsa özel istekleri, sağlanmamışsa
??operatörünü kullanarak'No special requests'değerini döndüren birgetRequestsSummary()metodu ?.operatörünü kullanarak giriş zamanının dize (string) temsilini döndüren veya ayarlanmamışsanulldöndüren birgetArrivalInfo()metodu- Rezervasyon detaylarını görüntüleyen bir
printConfirmation()metodu
- Null olamaz (non-nullable) bir
main.dart: Rezervasyon sınıfınızı içe aktarın ve zorunlu ile isteğe bağlı verilerin farklı kombinasyonlarını sergileyen rezervasyonlar oluşturun:101numaralı odada3gece konaklayacak, özel isteği'Late checkout'olan ve giriş zamanıDateTime(2024, 6, 15, 14, 30)olarak ayarlanmış'Sarah Johnson'isimli misafir için bir rezervasyon oluşturun205numaralı odada kalacak (varsayılan gece sayısını kullanın), sadece özel isteği'Extra pillows'olarak ayarlanmış'Mike Chen'isimli misafir için bir rezervasyon oluşturun310numaralı odada2gece konaklayacak (her iki isteğe bağlı alanı da null bırakın)'Emma Davis'isimli misafir için bir rezervasyon oluşturun- Sırasıyla her rezervasyon için
printConfirmation()metodunu çağırın, ardındangetArrivalInfo()metodunu kullanarakArrival: [result]ifadesini yazdırın
printConfirmation() metodu şu formatta çıktı vermelidir:
=== 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: nullKopya kağıdı
Null olamayan (non-nullable) alanlar, yapıcı (constructor) gövdesi çalışmadan önce başlatılmalıdır; null olabilen (nullable) alanlar ise başlatılmadan bırakılabilir (varsayılan olarak null değerini alır):
class User {
String name; // Başlatılması zorunludur
String? bio; // İsteğe bağlı - varsayılan olarak null
int age = 0; // Varsayılan değeri var
User(this.name);
}İsteğe bağlı veriler için null olabilen alanları kullanın:
class Product {
String title;
String? description; // İsteğe bağlı
double? discount; // İsteğe bağlı
Product(this.title);
}
var item = Product('Laptop');
print(item.description); // nullNull olabilen alanlara null-aware (null'a duyarlı) operatörlerle erişin:
class Order {
String id;
User? customer;
Order(this.id);
String getCustomerName() {
return customer?.name ?? 'Guest';
}
}Temel değerler için isimlendirilmiş parametrelerde (named parameters) required anahtar kelimesini kullanın:
class Account {
String email;
String? phone;
Account({required this.email, this.phone});
}
var acc = Account(email: 'test@mail.com');Kendin 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
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ı