Fungsi

Sintaks panah, parameter bernama, dan parameter opsional pada fungsi Dart.

Daftar isi

Fungsi membungkus rangkaian langkah menjadi satu nama yang dapat dipanggil berulang, dan Dart menyediakan beberapa gaya penulisan untuk berbagai bentuk pemanggilan. Topik ini membahas sintaks panah untuk tubuh fungsi satu ekspresi, parameter bernama dengan kata kunci required dan nilai bawaan (default value), serta parameter posisi opsional dalam kurung siku. Setelah membacanya, tanda tangan fungsi (function signature), yaitu gabungan tipe kembali, nama, dan daftar parameter, dapat dirancang agar pemanggilannya tetap jelas dan aman diperiksa analyzer.

Sintaks panah untuk tubuh satu ekspresi#

Sintaks panah menuliskan tubuh fungsi sebagai => diikuti satu ekspresi, dan nilai ekspresi itu menjadi nilai kembalian fungsi. Bentuk ini setara dengan tubuh blok yang berisi satu pernyataan return, hanya lebih ringkas. Syaratnya mutlak, yaitu tubuh benar-benar hanya satu ekspresi, sehingga pernyataan bersyarat bersarang, perulangan, atau variabel sementara tidak muat di dalamnya. Apabila tubuh fungsi tumbuh menjadi lebih dari satu langkah, kembali ke bentuk blok adalah pilihan yang tepat. Kandidat yang cocok antara lain penghitung luas, pembentukan pesan, dan konversi satuan sederhana, karena semuanya berupa hitungan satu langkah.

Contoh berikut menuliskan fungsi kuadrat yang sama dalam dua bentuk, lalu memanggil keduanya.

dart Contoh: bentuk blok dan bentuk panah
void main() {
  print(kuadratBlok(9));
  print(kuadratPanah(9));
}

// bentuk blok: tubuh berisi pernyataan return
int kuadratBlok(int angka) {
  return angka * angka;
}

// bentuk panah: tubuh satu ekspresi, hasil ekspresinya menjadi nilai kembali
int kuadratPanah(int angka) => angka * angka;
text Keluaran
81
81

Kedua fungsi menghasilkan 81 karena keduanya setara. Fungsi bertipe void pun dapat menggunakan panah, misalnya void tampilkanPesan(String teks) => print(teks);, karena nilainya memang tidak dikembalikan. Konsistensi memilih bentuk panah untuk fungsi satu ekspresi membuat kode lebih mudah dipindai, sedangkan bentuk blok menyisakan ruang untuk logika yang lebih panjang. Apabila ekspresi pada panah mulai sulit dibaca, hitungannya dapat dipindahkan ke fungsi bernama lain sehingga setiap baris tetap memuat satu gagasan.

Parameter bernama dalam kurung kurawal#

Parameter bernama (named parameter) dituliskan di dalam kurung kurawal {} pada tanda tangan fungsi dan dipanggil dengan menyebut namanya, misalnya nama: 'Citra'. Gaya ini membuat pemanggilan terbaca seperti kalimat, karena arti setiap nilai terlihat langsung di tempat pemanggilan. Urutan argumen bernama bebas disusun, karena pencocokannya mengikuti nama dan bukan posisi. Secara bawaan parameter dalam kurung kurawal bersifat opsional, dan Dart memberi dua cara mengaturnya, yaitu kata kunci required yang menuntut kehadiran serta nilai bawaan (default value) yang digunakan apabila argumen tidak disertakan.

Contoh berikut menggunakan keduanya pada satu fungsi, dan pemanggilan kedua sengaja menukar urutan argumen untuk memperlihatkan sifat pencocokan namanya.

dart Contoh: parameter bernama dengan required dan nilai bawaan
void main() {
  tampilkanStatus(nama: 'Citra', rataRata: 88.5);
  tampilkanStatus(rataRata: 76.0, nama: 'Budi', lulus: false);
}

void tampilkanStatus({
  required String nama,
  required double rataRata,
  bool lulus = true,
}) {
  print('$nama: rata-rata $rataRata, lulus $lulus');
}
text Keluaran
Citra: rata-rata 88.5, lulus true
Budi: rata-rata 76.0, lulus false

Pemanggilan pertama tidak menyertakan lulus, sehingga nilai bawaan true digunakan. Pemanggilan kedua menyertakan ketiganya dengan urutan yang berbeda dari deklarasinya, dan hasilnya tetap terpasang pada parameter yang benar. Apabila parameter required tidak disertakan, analyzer menolak pemanggilan tersebut sebelum program dijalankan, sebagaimana ditunjukkan blok berikut.

bash
# buat berkas yang melewatkan parameter required, lalu jalankan dart analyze
rm -rf /tmp/uji/fungsi-required && mkdir -p /tmp/uji/fungsi-required
cat > /tmp/uji/fungsi-required/required_kurang.dart <<'EOF'
void main() {
  tampilkanStatus(nama: 'Ali');
}

void tampilkanStatus({required String nama, required double rataRata}) {
  print('$nama: $rataRata');
}
EOF
cd /tmp/uji/fungsi-required && dart analyze
text Keluaran
Analyzing fungsi-required...

  error - required_kurang.dart:2:3 - The named parameter 'rataRata' is required, but there's no corresponding argument. Try adding the required argument. - missing_required_argument

1 issue found.

Pesan error menyebut nama parameter yang kurang beserta saran perbaikannya. Pemeriksaan ini terjadi saat kode dianalisis, sehingga kelalaian pada pemanggilan tertangkap sebelum program berjalan, bukan setelahnya.

Parameter posisi opsional dalam kurung siku#

Parameter posisi opsional (optional positional parameter) dituliskan dalam kurung siku [] setelah parameter wajib dan dipanggil sesuai posisinya tanpa menyebut nama. Bentuk ini cocok untuk argumen tambahan yang artinya sudah jelas dari urutannya, seperti satuan pada pemformatan nilai. Aturan penempatannya ketat, yaitu kurung siku selalu berada di akhir daftar parameter, dan satu fungsi tidak boleh memuat kurung siku sekaligus kurung kurawal. Nilai bawaan juga dapat diberikan, dan perilakunya sama dengan pada parameter bernama.

Contoh berikut menambahkan satu parameter opsional pada fungsi sapaan.

dart Contoh: parameter posisi opsional
void main() {
  print(sapa('Dewi'));
  print(sapa('Dewi', 'pagi'));
}

// parameter wajib ditulis lebih dahulu, parameter opsional mengikuti dalam []
String sapa(String nama, [String waktu = 'siang']) {
  return 'Selamat $waktu, $nama.';
}
text Keluaran
Selamat siang, Dewi.
Selamat pagi, Dewi.

Pemanggilan pertama hanya menyertakan nama, sehingga parameter waktu menggunakan nilai bawaan siang. Pemanggilan kedua menyertakan pagi yang menempati parameter opsional sesuai posisinya. Apabila parameter wajib dan opsional ditukar posisinya, deklarasi ditolak sebagai kesalahan sintaks karena kurung siku wajib berada di akhir daftar parameter.

Pemilihan antara kurung siku dan kurung kurawal dapat diringkas dalam satu panduan. Gunakan kurung siku untuk satu atau dua argumen tambahan yang artinya mengikuti urutan, dan gunakan kurung kurawal untuk parameter yang banyak atau yang kehadirannya wajib dijaga dengan required. Kombinasi dua gaya pada satu fungsi tidak diperbolehkan, sehingga keputusan diambil per fungsi.

Merancang tanda tangan fungsi#

Tanda tangan fungsi menjadi kontrak yang diperiksa analyzer pada setiap pemanggilan, sehingga perubahan tipe atau daftar parameternya langsung terdeteksi di seluruh kode yang memanggilnya. Program kecil berikut menggabungkan tiga gaya penulisan fungsi dalam satu berkas statistik nilai ujian, dari fungsi panah yang menghitung rata-rata sampai fungsi dengan parameter bernama yang menampilkan data.

dart fungsi.dart
// Statistik nilai ujian dengan tiga gaya penulisan fungsi.
void main() {
  tampilkanData(nama: 'Citra', nilai: 88.5);
  print('Rata-rata kelas: ${rataRata([85.0, 90.0, 80.0])}');
}

// bentuk panah: tubuh hanya satu ekspresi
double rataRata(List<double> nilai) =>
    nilai.fold(0.0, (total, n) => total + n) / nilai.length;

// parameter posisi wajib ditambah satu parameter posisi opsional
String formatNilai(double nilai, [String satuan = 'poin']) {
  return '$nilai $satuan';
}

// parameter bernama: required tanpa nilai bawaan, opsional dengan nilai bawaan
void tampilkanData({
  required String nama,
  required double nilai,
  bool lulus = true,
}) {
  print('Nama: $nama');
  print('Nilai: ${formatNilai(nilai)}');
  print('Status lulus: $lulus');
}
text Keluaran
Nama: Citra
Nilai: 88.5 poin
Status lulus: true
Rata-rata kelas: 85.0

Fungsi rataRata menggunakan bentuk panah karena tubuhnya hanya satu ekspresi pembagian. Fungsi formatNilai menambahkan satu parameter posisi opsional untuk satuan, sedangkan tampilkanData menggunakan dua parameter required dan satu nilai bawaan. Tipe List<double> pada parameter rataRata menyatakan daftar bilangan pecahan, dan nilai kembaliannya bertipe double sehingga langsung dapat diinterpolasi ke dalam string.

Pemanggilan pada main() memperlihatkan manfaat gaya yang dipilih. Kalimat tampilkanData(nama: 'Citra', nilai: 88.5) terbaca utuh tanpa perlu membaca deklarasinya, dan pemanggilan yang kekurangan parameter wajib langsung ditolak analyzer. Ketegasan ini membuat penambahan parameter baru pada fungsi yang sudah digunakan banyak tempat menjadi perubahan yang terkontrol, karena setiap pemanggilan yang belum disesuaikan terdaftar sebagai error.

Ringkasan#

  • Sintaks panah => menuliskan tubuh fungsi satu ekspresi dan setara dengan return di dalam blok.
  • Parameter bernama dalam {} dipanggil dengan menyebut namanya, wajib dengan required, dan dapat diberi nilai bawaan.
  • Parameter posisi opsional dalam [] selalu berada di akhir daftar parameter dan tidak boleh dikombinasikan dengan parameter bernama.
  • Analyzer menolak pemanggilan yang kekurangan parameter required sebelum program dijalankan.

Referensi#