Menu
Coddy logo textTech

Asenkron Yapıcılar

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 79 / 110.

Dart'taki kurucular (constructors) async olarak işaretlenemez - bir Future değil, sınıfın bir örneğini anında döndürmelidirler. Peki, bir veritabanından veri yüklemek veya yapılandırma getirmek gibi asenkron başlatma gerektiren nesneleri nasıl oluşturursunuz?

Çözüm, statik bir async factory metodu kullanmaktır. Yapıcıyı private (veya basit) tutun ve async işlemi gerçekleştiren ve sınıfınızın bir Future nesnesini döndüren statik bir metot sağlayın:

class UserProfile {
  final String name;
  final int age;
  
  UserProfile._(this.name, this.age);  // Özel kurucu metot
  
  static Future<UserProfile> create(String userId) async {
    // Veri getirmeyi simüle et
    await Future.delayed(Duration(seconds: 1));
    return UserProfile._('Alice', 25);
  }
}

Future<void> main() async {
  var user = await UserProfile.create('123');
  print(user.name);  // Alice
}

Özel yapıcı UserProfile._ asıl nesne oluşturma işlemini gerçekleştirirken, statik create() yöntemi tüm asenkron işleri halleder. Çağıranlar, tamamen başlatılmış nesneyi elde etmek için await kullanır.

Bu desen, nesnenizin elinize geçtiğinde tamamen kullanıma hazır olmasını sağlar; kısmen başlatılmış durumlar veya eksik veriler söz konusu olmaz. Kaynak yüklemesi gereken, servislere bağlanan veya zaman alan herhangi bir kurulum işlemi gerçekleştiren sınıflar için yaygın olarak kullanılır.

challenge icon

Görev

Kolay

Sınıflarda async başlatmanın nasıl ele alınacağını gösteren bir yapılandırma yükleyici oluşturalım! Yapıcılar async olamayacağı için, verilerini “yüklemek” için zamana ihtiyaç duyan nesneler oluşturmak üzere statik fabrika yöntemi desenini kullanacaksın.

Kodunu iki dosyada düzenleyeceksin:

  • config_loader.dart: Yapılandırma ayarlarını async olarak yüklemeyi simüle eden bir ConfigLoader sınıfı oluştur. Sınıfında şunlar bulunmalı:
    • Üç final alan: appName (String), version (String) ve maxUsers (int)
    • Üç alanın tamamını başlatan özel bir yapıcı
    • load parametresi alan ve String configId döndüren, Future<ConfigLoader> adlı statik async fabrika yöntemi. Bu yöntem şunları yapmalı:
      • Yükleme süresini simüle etmek için 100 milisaniyeyle Future.delayed() kullanmalı
      • Yapılandırma değerlerini configId'ye göre oluşturmalı:
        • appName: sonuna " App" eklenmiş configId
        • version: "1.0." ve ardından configId'nin uzunluğu
        • maxUsers: configId'nin uzunluğunun 10 ile çarpımı
      • Bu değerlerle yeni bir ConfigLoader örneği döndürmeli
    • Yapılandırmayı şu biçimde yazdıran bir displayInfo() yöntemi: Config: [appName] v[version] (max [maxUsers] users)
  • main.dart: Yapılandırma yükleyicini içe aktar ve async başlatma desenini göster:
    • Loading configurations... yazdır
    • "Production" configId değerine sahip bir yapılandırma yükle ve displayInfo() yöntemini çağır
    • "Dev" configId değerine sahip bir yapılandırma yükle ve displayInfo() yöntemini çağır
    • All configs loaded! yazdır

Statik load yönteminin tüm async işlemlerini nasıl yönettiğine, özel yapıcının ise yalnızca değerleri atadığına dikkat et! Çağıranlar, tamamen başlatılmış bir nesne elde etmek için await kullanır!

Beklenen çıktı:

Loading configurations...
Config: Production App v1.0.10 (max 100 users)
Config: Dev App v1.0.3 (max 30 users)
All configs loaded!

Kendin dene

import 'config_loader.dart';

void main() async {
  // TODO: "Loading configurations..." yazdır
  
  // TODO: configId'si "Production" olan bir yapılandırma yükle
  // ve onun displayInfo() metodunu çağır
  
  // TODO: configId'si "Dev" olan bir yapılandırma yükle
  // ve onun displayInfo() metodunu çağır
  
  // TODO: "All configs loaded!" yazdır
}
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