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.

Closure, oluşturulduğu yerdeki değişkenleri, o özgün bağlamın çalışması sona erdikten sonra bile “hatırlayan” özel bir işlev türüdür. Onu, doğduğu yerin bir parçasını gittiği her yere yanında taşıyan bir işlev olarak düşünebilirsin.

Bir işlevi başka bir işlevin içinde oluşturduğunuzda, içteki işlev dıştaki işlevin değişkenlerine erişebilir. Bu erişimin, dıştaki işlev yürütmesini tamamladıktan sonra bile sürmesi, bunu bir closure yapan şeydir.

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

Bu örnekte, createGreeting tarafından döndürülen anonim işlev bir closure'dır. Çevresindeki kapsamdan name parametresini yakalar. createGreeting çalışmasını tamamladıktan sonra bile döndürülen işlev name'in ne olduğunu hâlâ hatırlar.

Closures, özelleştirilmiş işlevler oluşturmak veya durumu temiz bir şekilde korumak için inanılmaz derecede kullanışlıdır. Oluşturuldukları ortama göre özelleştirilmiş işlevler oluşturmanıza olanak tanıyarak kodunuzu daha esnek ve güçlü hâle getirirler.

challenge icon

Görev

Kolay

Kapanışları, kişiselleştirilmiş bir mesaj oluşturucu sistemi kurarak gösteren bir program oluştur. Programın, belirli bilgileri "hatırlayan" ve özgün bağlam tamamlandıktan sonra bile bu bilgileri kullanarak özelleştirilmiş mesajlar oluşturan işlevler yaratmalıdır.

  1. Bir kişinin adını temsil eden bir dize girdisi oku
  2. Bir selamlama türünü ("formal", "casual" veya "friendly") temsil eden bir dize girdisi oku
  3. Bir şirket adını temsil eden bir dize girdisi oku
  4. Parametre olarak bir ad ve selamlama türü alan createMessageGenerator adlı bir işlev oluştur
  5. createMessageGenerator işlevi, şunları yapan başka bir işlevi (bir kapanış) döndürmelidir:
    • Parametre olarak bir şirket adı alır
    • Dış işlevin kapsamındaki 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. Kapanış işlevini elde etmek için createMessageGenerator işlevini ad ve selamlama türü girdileriyle çağır
  7. Mesajı oluşturmak için döndürülen kapanış işlevini şirket adı girdisiyle çağır
  8. Sonuçları aşağıda gösterilen tam biçimde görüntüle

Örneğin girdiler "Alice", "formal" ve "TechCorp" ise programın şu çıktıyı vermelidir:

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 şu çıktıyı vermelidir:

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 şu çıktıyı vermelidir:

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, başka bir işlev döndüren bir işlev oluşturarak kapanışları göstermelidir. Döndürülen işlev (kapanış), dış işlev çalışmasını tamamladıktan sonra bile dış işlevin kapsamındaki değişkenlere (ad ve selamlama türü) erişebilmelidir. Selamlama türü girdisine göre uygun mesaj biçimini belirlemek için koşullu ifadeler kullan.

Kendin dene

import 'dart:io';

void main() {
  // Girdiyi 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
  // Create the createMessageGenerator function that returns a closure
  // Fonksiyonu çağırın ve mesajı oluşturun
  
  // Sonuçları yazdır
  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

Kendi başına pratik yap: Online Dart derleyicisi