Menu
Coddy logo textTech

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);     // null

Nullable 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ır

Boş 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.

challenge icon

Görev

Kolay

Null 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 bir Reservation sı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 nights olan null kabul etmeyen bir 1 - 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
    • required ve guestName için roomNumber kullanan, adlandırılmış parametrelere sahip bir kurucu; nights ise 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 bir null metodu
    • Rezervasyon ayrıntılarını görüntüleyen bir printConfirmation() metodu
  • 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çin 101 numaralı odada 3 gecelik, ö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çin 205 numaralı 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çin 310 numaralı odada 2 gecelik 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ından Arrival: [result] kullanarak getArrivalInfo() 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: null

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
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Dart derleyicisi