Menu
CoddyTech

Memahami Closure

Termasuk bagian Logika dan Alur dalam perjalanan Dart di Coddy. Pelajaran 46 dari 65.

Closure adalah jenis fungsi khusus yang "mengingat" variabel dari tempat fungsi itu dibuat, bahkan setelah konteks aslinya selesai dijalankan. Anggap saja closure sebagai fungsi yang membawa sebagian dari tempat asalnya ke mana pun ia pergi.

Saat kamu membuat fungsi di dalam fungsi lain, fungsi di dalam tersebut dapat mengakses variabel fungsi luar. Hal yang menjadikannya closure adalah akses ini tetap tersedia bahkan setelah fungsi luar selesai dijalankan.

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

Dalam contoh ini, fungsi anonim yang dikembalikan oleh createGreeting adalah closure. Fungsi ini menangkap parameter name dari lingkup sekitarnya. Bahkan setelah createGreeting selesai dijalankan, fungsi yang dikembalikan tetap mengingat nilai name.

Closure sangat berguna untuk membuat fungsi khusus atau mempertahankan state dengan cara yang rapi. Closure memungkinkan kamu membuat fungsi yang disesuaikan dengan lingkungan tempat fungsi tersebut dibuat, sehingga kodemu menjadi lebih fleksibel dan tangguh.

challenge icon

Tantangan

Mudah

Buat program yang mendemonstrasikan closure dengan membangun sistem pembuat pesan yang dipersonalisasi. Programmu akan membuat fungsi yang "mengingat" informasi tertentu dan menggunakan informasi tersebut untuk membuat pesan khusus, bahkan setelah konteks aslinya selesai.

  1. Baca input string yang mewakili nama seseorang
  2. Baca input string yang mewakili jenis sapaan ("formal", "casual", atau "friendly")
  3. Baca input string yang mewakili nama perusahaan
  4. Buat fungsi bernama createMessageGenerator yang menerima nama dan jenis sapaan sebagai parameter
  5. Fungsi createMessageGenerator harus mengembalikan fungsi lain (closure) yang:
    • Menerima nama perusahaan sebagai parameternya
    • Menggunakan nama dan jenis sapaan dari scope fungsi luar
    • Mengembalikan pesan berformat berdasarkan jenis sapaan:
      • Untuk "formal": "Dear [name], we are pleased to welcome you to [company]."
      • Untuk "casual": "Hey [name]! Welcome to [company]!"
      • Untuk "friendly": "Hi [name], so glad you joined [company]!"
  6. Panggil fungsi createMessageGenerator dengan input nama dan jenis sapaan untuk mendapatkan fungsi closure
  7. Panggil fungsi closure yang dikembalikan dengan input nama perusahaan untuk membuat pesan
  8. Tampilkan hasil dalam format persis seperti yang ditunjukkan di bawah

Misalnya, jika inputnya adalah "Alice", "formal", dan "TechCorp", programmu harus menghasilkan output:

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

Jika inputnya adalah "Bob", "casual", dan "StartupXYZ", programmu harus menghasilkan output:

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

Jika inputnya adalah "Carol", "friendly", dan "InnovateLab", programmu harus menghasilkan output:

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

Programmu harus mendemonstrasikan closure dengan membuat fungsi yang mengembalikan fungsi lain. Fungsi yang dikembalikan (closure) harus dapat mengakses variabel dari scope fungsi luar (nama dan jenis sapaan), bahkan setelah fungsi luar selesai dijalankan. Gunakan pernyataan percabangan untuk menentukan format pesan yang sesuai berdasarkan input jenis sapaan.

Coba sendiri

import 'dart:io';

void main() {
  // Baca input
  String? name = stdin.readLineSync();
  String? greetingType = stdin.readLineSync();
  String? company = stdin.readLineSync();
  
  // Tampilkan header sistem
  print("Message Generator System");
  print("========================");
  print("Creating message generator for: $name");
  print("Greeting type: $greetingType");
  print("Company: $company");
  print("========================");
  
  // TODO: Tulis kodemu di bawah ini
  // Buat fungsi createMessageGenerator yang mengembalikan closure
  // Panggil fungsi tersebut dan buat pesannya
  
  // Tampilkan hasil akhirnya sebagai output
  print("Generated message: \$message");
  print("Message generation completed successfully");
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika dan Alur

Latihan sendiri: Compiler Dart online