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.
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;81
81Kedua 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.
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');
}Citra: rata-rata 88.5, lulus true
Budi: rata-rata 76.0, lulus falsePemanggilan 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.
# 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 analyzeAnalyzing 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.
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.';
}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.
// 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');
}Nama: Citra
Nilai: 88.5 poin
Status lulus: true
Rata-rata kelas: 85.0Fungsi 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 denganreturndi dalam blok. - Parameter bernama dalam
{}dipanggil dengan menyebut namanya, wajib denganrequired, 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
requiredsebelum program dijalankan.
Referensi#
- Functions — dart.dev — Dokumentasi resmi fungsi Dart, termasuk parameter opsional, nilai bawaan, dan sintaks panah.
- Language — dart.dev — Peta fitur bahasa Dart untuk menelusuri fungsi beserta fitur terkait.
- Variables — dart.dev — Kaitan deklarasi variabel dengan tipe yang menjadi bagian tanda tangan fungsi.