Menu
Coddy logo textTech

Closure'ları Anlamak

Coddy'nin Dart Journey'sinin Mantık & Akış bölümünün bir parçası — ders 46 / 65.

Bir closure, oluşturulduğu yerdeki değişkenleri, orijinal bağlamın çalışması bittikten sonra bile "hatırlayan" özel bir fonksiyon türüdür. Onu, gittiği her yere doğduğu yerden bir parça taşıyan bir fonksiyon olarak düşünün.

Bir fonksiyonu başka bir fonksiyonun içinde oluşturduğunuzda, içteki fonksiyon dıştaki fonksiyonun değişkenlerine erişebilir. Bunu bir closure yapan şey, bu erişimin dıştaki fonksiyonun yürütülmesi tamamlandıktan sonra bile devam etmesidir.

Function createGreeting(String name) {
  return () {
    return "Hello, $name!";
  };
}

Bu örnekte, createGreeting tarafından döndürülen anonim fonksiyon bir closure'dır. Çevreleyen kapsamındaki name parametresini yakalar. createGreeting çalışmasını bitirdikten sonra bile, döndürülen fonksiyon name değişkeninin ne olduğunu hala hatırlar.

Closure'lar, özelleştirilmiş fonksiyonlar oluşturmak veya durumu temiz bir şekilde korumak için inanılmaz derecede kullanışlıdır. Oluşturuldukları ortama göre özelleştirilen fonksiyonlar oluşturmanıza olanak tanıyarak kodunuzu daha esnek ve güçlü hale getirirler.

challenge icon

Görev

Kolay

Kişiselleştirilmiş bir mesaj oluşturma sistemi kurarak closure'ları (kapanışları) gösteren bir program oluşturun. Programınız, belirli bilgileri "hatırlayan" ve orijinal bağlam sona erdikten sonra bile bu bilgileri özelleştirilmiş mesajlar oluşturmak için kullanan fonksiyonlar oluşturacaktır.

  1. Bir kişinin adını temsil eden bir dize (string) girdisi okuyun
  2. Bir selamlama türünü temsil eden bir dize girdisi okuyun ("formal", "casual" veya "friendly")
  3. Bir şirket adını temsil eden bir dize girdisi okuyun
  4. Parametre olarak bir ad ve selamlama türü alan createMessageGenerator adında bir fonksiyon oluşturun
  5. createMessageGenerator fonksiyonu, şunları yapan başka bir fonksiyon (bir closure) döndürmelidir:
    • Parametre olarak bir şirket adı alır
    • Dış fonksiyonun kapsamındaki (scope) adı ve selamlama türünü kullanır
    • Selamlama türüne göre biçimlendirilmiş bir mesaj döndürür:
      • "formal" için: "Dear [name], we are pleased to welcome you to [company]."
      • "casual" için: "Hey [name]! Welcome to [company]!"
      • "friendly" için: "Hi [name], so glad you joined [company]!"
  6. Closure fonksiyonunuzu elde etmek için createMessageGenerator fonksiyonunu ad ve selamlama türü girdileriyle çağırın
  7. Mesajı oluşturmak için döndürülen closure fonksiyonunu şirket adı girdisiyle çağırın
  8. Sonuçları aşağıda gösterilen tam formatta görüntüleyin

Örneğin, girdiler "Alice", "formal" ve "TechCorp" ise, programınızın çıktısı şöyle olmalıdır:

Message Generator System
========================
Creating message generator for: Alice
Greeting type: formal
Company: TechCorp
========================
Generated message: Dear Alice, we are pleased to welcome you to TechCorp.
Message generation completed successfully

Girdiler "Bob", "casual" ve "StartupXYZ" ise, programınızın çıktısı şöyle olmalıdır:

Message Generator System
========================
Creating message generator for: Bob
Greeting type: casual
Company: StartupXYZ
========================
Generated message: Hey Bob! Welcome to StartupXYZ!
Message generation completed successfully

Girdiler "Carol", "friendly" ve "InnovateLab" ise, programınızın çıktısı şöyle olmalıdır:

Message Generator System
========================
Creating message generator for: Carol
Greeting type: friendly
Company: InnovateLab
========================
Generated message: Hi Carol, so glad you joined InnovateLab!
Message generation completed successfully

Programınız, başka bir fonksiyon döndüren bir fonksiyon oluşturarak closure'ları göstermelidir. Döndürülen fonksiyon (closure), dış fonksiyonun yürütülmesi bittikten sonra bile dış fonksiyonun kapsamındaki değişkenlere (ad ve selamlama türü) erişebilmelidir. Selamlama türü girdisine göre uygun mesaj formatını belirlemek için koşullu ifadeler kullanın.

Kopya kağıdı

Bir closure (kapanış), oluşturulduğu yerdeki değişkenleri, orijinal bağlamın çalışması bittikten sonra bile "hatırlayan" bir fonksiyondur.

Bir fonksiyonu başka bir fonksiyonun içinde oluşturduğunuzda, içteki fonksiyon dıştaki fonksiyonun değişkenlerine erişebilir. Bu erişim, dıştaki fonksiyonun yürütülmesi tamamlandıktan sonra bile devam eder.

Function createGreeting(String name) {
  return () {
    return "Hello, $name!";
  };
}

Bu örnekte, createGreeting tarafından döndürülen anonim fonksiyon bir closure'dır. Çevreleyen kapsamdaki name parametresini yakalar. createGreeting çalışmasını bitirdikten sonra bile, döndürülen fonksiyon name değişkeninin ne olduğunu hala hatırlar.

Closure'lar, özelleştirilmiş fonksiyonlar oluşturmak veya durumu temiz bir şekilde korumak için kullanışlıdır. Oluşturuldukları ortama göre özelleştirilmiş fonksiyonlar oluşturmanıza olanak tanırlar.

Kendin dene

import 'dart:io';

void main() {
  // Girişi oku
  String? name = stdin.readLineSync();
  String? greetingType = stdin.readLineSync();
  String? company = stdin.readLineSync();
  
  // Sistem başlığını görüntüle
  print("Message Generator System");
  print("========================");
  print("Creating message generator for: $name");
  print("Greeting type: $greetingType");
  print("Company: $company");
  print("========================");
  
  // TODO: Kodunuzu aşağıya yazın
  // Bir closure döndüren createMessageGenerator fonksiyonunu oluşturun
  // Fonksiyonu çağırın ve mesajı oluşturun
  
  // Nihai sonuçları çıktı olarak ver
  print("Generated message: \$message");
  print("Message generation completed successfully");
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Mantık & Akış bölümündeki tüm dersler