Fungsi #
Fungsi adalah blok kode yang dapat digunakan kembali yang melakukan tugas tertentu. Dalam Dart, fungsi memainkan peran penting dalam pengorganisasian kode dan memungkinkan modularitas serta pengurangan pengulangan kode. Pemahaman mendalam tentang fungsi dalam Dart akan membantu Anda menulis kode yang lebih efisien, terstruktur, dan mudah dipelihara.
Dasar-dasar Fungsi #
Fungsi dalam Dart dideklarasikan menggunakan kata kunci void
(jika fungsi tidak mengembalikan nilai) atau dengan tipe pengembalian (jika fungsi mengembalikan nilai).
Sintaks:
void namaFungsi() {
// Kode yang dijalankan oleh fungsi
}
TipePengembalian namaFungsi() {
// Kode yang dijalankan oleh fungsi
return nilai;
}
Contoh:
void cetakPesan() {
print("Halo, Dunia!");
}
int tambah(int a, int b) {
return a + b;
}
void main() {
cetakPesan(); // Memanggil fungsi cetakPesan
int hasil = tambah(3, 4); // Memanggil fungsi tambah
print(hasil); // Output: 7
}
Pada contoh di atas, cetakPesan
adalah fungsi yang tidak mengembalikan nilai (void
), sedangkan tambah
adalah fungsi yang mengembalikan nilai int
.
Parameter pada Fungsi #
Fungsi dalam Dart bisa memiliki parameter yang memungkinkan Anda mengirim nilai ke dalam fungsi saat memanggilnya. Ada beberapa jenis parameter yang didukung Dart: positional parameters, optional positional parameters, named parameters, dan default parameters.
Positional Parameters #
Positional parameters adalah parameter yang posisinya tetap dan harus diisi ketika memanggil fungsi.
Contoh:
void cetakNama(String nama, int umur) {
print("Nama: $nama, Umur: $umur");
}
void main() {
cetakNama("Alice", 25); // Output: Nama: Alice, Umur: 25
}
Optional Positional Parameters #
Optional positional parameters dideklarasikan menggunakan tanda kurung siku ([]
). Parameter ini opsional, artinya tidak harus diisi ketika memanggil fungsi. Jika tidak diisi, nilainya akan null
secara default atau sesuai dengan nilai default yang ditentukan.
Contoh:
void cetakNama(String nama, [int? umur]) {
if (umur != null) {
print("Nama: $nama, Umur: $umur");
} else {
print("Nama: $nama");
}
}
void main() {
cetakNama("Alice"); // Output: Nama: Alice
cetakNama("Bob", 30); // Output: Nama: Bob, Umur: 30
}
Named Parameters #
Named parameters memberikan fleksibilitas lebih dalam pemanggilan fungsi karena Anda dapat menyebutkan nama parameter saat memanggil fungsi, sehingga urutan tidak penting. Named parameters dideklarasikan menggunakan tanda kurung kurawal ({}
).
Contoh:
void cetakNama({required String nama, int? umur}) {
if (umur != null) {
print("Nama: $nama, Umur: $umur");
} else {
print("Nama: $nama");
}
}
void main() {
cetakNama(nama: "Alice"); // Output: Nama: Alice
cetakNama(nama: "Bob", umur: 30); // Output: Nama: Bob, Umur: 30
}
Catatan: Kata kunci required
digunakan untuk memastikan bahwa parameter tersebut harus diisi.
Default Parameters #
Anda bisa memberikan nilai default pada parameter optional. Jika nilai parameter tidak diisi saat pemanggilan fungsi, nilai default akan digunakan.
Contoh:
void cetakNama(String nama, {int umur = 18}) {
print("Nama: $nama, Umur: $umur");
}
void main() {
cetakNama("Alice"); // Output: Nama: Alice, Umur: 18
cetakNama("Bob", umur: 25); // Output: Nama: Bob, Umur: 25
}
Fungsi Anonim dan Fungsi Panah #
Selain fungsi biasa, Dart juga mendukung fungsi anonim dan fungsi panah (arrow function), yang lebih ringkas dan sering digunakan dalam callback atau operasi sederhana.
Fungsi Anonim #
Fungsi anonim adalah fungsi yang tidak memiliki nama dan biasanya digunakan dalam konteks di mana fungsi perlu segera dideklarasikan dan dipanggil.
Contoh:
void main() {
var daftarAngka = [1, 2, 3, 4, 5];
daftarAngka.forEach((angka) {
print(angka); // Output: 1, 2, 3, 4, 5
});
}
Pada contoh di atas, fungsi anonim digunakan sebagai callback untuk forEach
.
Fungsi Panah (Arrow Function) #
Fungsi panah adalah bentuk singkat dari fungsi biasa, terutama digunakan untuk fungsi yang memiliki satu ekspresi. Ini menggunakan tanda =>
sebagai pengganti return
.
Contoh:
int tambah(int a, int b) => a + b;
void main() {
print(tambah(3, 4)); // Output: 7
}
Pada contoh di atas, tambah
dideklarasikan sebagai fungsi panah yang mengembalikan hasil penjumlahan a
dan b
.
Fungsi sebagai First-Class Object #
Dalam Dart, fungsi adalah first-class object, yang berarti Anda bisa memperlakukan fungsi seperti nilai lain—misalnya, Anda bisa menyimpan fungsi dalam variabel, melewatkan fungsi sebagai argumen, atau mengembalikan fungsi dari fungsi lain.
Contoh:
int kaliDua(int x) => x * 2;
void main() {
var f = kaliDua;
print(f(5)); // Output: 10
}
Pada contoh di atas, fungsi kaliDua
disimpan dalam variabel f
dan kemudian dipanggil melalui variabel tersebut.
Fungsi Rekursif #
Fungsi rekursif adalah fungsi yang memanggil dirinya sendiri. Fungsi ini berguna untuk menyelesaikan masalah yang dapat dipecah menjadi sub-masalah yang lebih kecil dan serupa, seperti menghitung faktorial atau memecahkan masalah pencarian dalam struktur data.
Contoh: Faktorial
int faktorial(int n) {
if (n <= 1) {
return 1;
} else {
return n * faktorial(n - 1);
}
}
void main() {
print(faktorial(5)); // Output: 120
}
Pada contoh di atas, fungsi faktorial
memanggil dirinya sendiri hingga mencapai kondisi dasar (n <= 1
).
Lexical Closure #
Dart mendukung konsep lexical closure, yang berarti fungsi dapat mengakses variabel dalam lingkup di mana fungsi tersebut didefinisikan, bahkan setelah lingkup itu tidak lagi aktif.
Contoh:
Function pembuatFungsiPenambah(int tambah) {
return (int angka) => angka + tambah;
}
void main() {
var tambahSepuluh = pembuatFungsiPenambah(10);
print(tambahSepuluh(5)); // Output: 15
}
Pada contoh di atas, fungsi pembuatFungsiPenambah
mengembalikan fungsi anonim yang dapat mengakses nilai tambah
dari lingkup luarnya, meskipun pembuatFungsiPenambah
sudah selesai dieksekusi.
Function Composition #
Function composition adalah teknik di mana Anda bisa menggabungkan beberapa fungsi untuk menciptakan fungsi baru yang lebih kompleks.
Contoh:
int kaliDua(int x) => x * 2;
int tambahTiga(int x) => x + 3;
int komposisiFungsi(int x) => kaliDua(tambahTiga(x));
void main() {
print(komposisiFungsi(5)); // Output: 16
}
Pada contoh di atas, komposisiFungsi
adalah hasil dari menggabungkan kaliDua
dan tambahTiga
.
Fungsi Generator #
Dart mendukung fungsi generator yang memungkinkan Anda menghasilkan serangkaian nilai secara bertahap menggunakan sync*
dan yield
untuk generator sinkron, atau async*
dan yield
untuk generator asinkron.
Contoh:
Iterable<int> generateNumbers(int n) sync* {
for (int i = 0; i < n; i++) {
yield i;
}
}
void main() {
var angka = generateNumbers(5);
angka.forEach(print); // Output: 0, 1, 2, 3, 4
}
Pada contoh di atas, fungsi generator generateNumbers
menghasilkan angka dari 0 hingga n-1 satu
per satu ketika diperlukan.
Kesimpulan #
Fungsi dalam Dart adalah komponen penting untuk menulis kode yang modular, reusable, dan mudah dipelihara. Dengan memahami berbagai jenis fungsi, parameter, dan konsep lanjutan seperti lexical closure dan function composition, Anda dapat menulis kode Dart yang lebih efisien dan ekspresif. Fungsi dalam Dart juga sangat fleksibel dengan dukungan untuk fungsi anonim, fungsi panah, dan fungsi sebagai objek first-class, memungkinkan penggunaan dan kombinasi fungsi yang sangat dinamis.