Menu
Coddy logo textTech

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

Bir 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 bir Reservation sı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 1 olan null olamaz bir int 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
    • guestName ve roomNumber için required anahtar kelimesini kullanan, nights alanı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 bir getRequestsSummary() metodu
    • ?. operatörünü kullanarak giriş zamanının dize (string) temsilini döndüren veya ayarlanmamışsa null döndüren bir getArrivalInfo() metodu
    • Rezervasyon detaylarını görüntüleyen bir printConfirmation() metodu
  • 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:
    • 101 numaralı odada 3 gece 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şturun
    • 205 numaralı 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şturun
    • 310 numaralı odada 2 gece 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ından getArrivalInfo() metodunu kullanarak Arrival: [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: null

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

Null 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
}
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