Salah satu elemen kunci dalam Dart, seperti pada bahasa pemrograman lainnya, adalah functions. Functions memungkinkan kita untuk menulis kode yang modular, terorganisir, dan dapat digunakan kembali. Kali ini kita akan menjelaskan dasar-dasar functions dalam Dart, termasuk definisi, penggunaan, jenis-jenis fungsi, dan contoh implementasinya.
Sadar atau tidak, sebenarnya kita telah mengimplementasikan beberapa functions pada kode kita. Semua program Dart dimulai dari fungsi main()
. main()
adalah contoh fungsi utama yang selalu kita gunakan. Selain itu, print()
juga termasuk fungsi.
print('Hello Dart!');
Fungsi print()
akan mengambil nilai String atau objek lainnya dan menampilkannya ke konsol. Untuk mencetak sesuatu ke konsol sebenarnya dibutuhkan beberapa instruksi yang lebih low-level, namun kita menjadi sangat terbantu dengan adanya fungsi print()
ini dan dapat menggunakannya secara berulang.
Fungsi dalam Dart adalah blok kode yang dapat dipanggil dan dijalankan dari berbagai bagian program. Fungsi dapat mengambil parameter, mengembalikan nilai, atau melakukan tindakan tertentu tanpa mengembalikan apa pun. Berikut adalah cara mendefinisikan fungsi dasar dalam Dart:
void main() {
greet(); // Memanggil fungsi greet
}
void greet() {
print('Hello, World!');
}
Dalam contoh di atas, greet
adalah fungsi tanpa parameter dan tanpa nilai kembali (void). Fungsi ini hanya mencetak "Hello, World!" ke konsol.
Parameter Fungsi dalam Dart
Dalam pemrograman, fungsi sering kali memerlukan input untuk bekerja dengan baik. Input tersebut disebut parameter. Dart mendukung dua jenis parameter: parameter posisi dan parameter bernama. Memahami perbedaan antara keduanya sangat penting untuk menulis kode yang bersih dan efisien.
Parameter posisi adalah parameter yang urutannya penting. Saat memanggil fungsi, kita harus memberikan argumen dalam urutan yang sama seperti yang didefinisikan dalam deklarasi fungsi.
void main() { greet('Alice'); // Memanggil fungsi greet dengan argumen 'Alice' } void greet(String name) { print('Hello, $name!'); }
Dalam contoh di atas, fungsi
greet
memiliki satu parameter posisi yaituname
. saatgreet('Alice')
dipanggil, nilai'Alice'
dikirim ke parametername
. Kemudian fungsi mencetak "Hello, Alice!". Parameter posisi sederhana digunakan saat jumlah argumen sedikit dan urutannya mudah diingat.Parameter bernama lebih fleksibel dibanding parameter posisi. Anda dapat menyebutkan parameter secara eksplisit saat memanggil fungsi, dan urutannya tidak penting. Parameter bernama juga dapat memiliki nilai default, yang digunakan jika tidak ada nilai yang diberikan saat fungsi dipanggil.
void main() { describe('Alice', age: 25); // Memanggil fungsi describe dengan argumen 'Alice' dan age 25 describe('Bob'); // Memanggil fungsi describe dengan argumen 'Bob' saja } void describe(String name, {int age = 0}) { print('$name is $age years old.'); }
Dalam contoh di atas, fungsi
describe
memiliki satu parameter posisiname
dan satu parameter bernamaage
. Kemudian, parameterage
memiliki nilai default 0. Saatdescribe('Alice', age: 25)
dipanggil, nilai25
dikirim ke parameterage
. Saatdescribe('Bob')
dipanggil tanpaage
, nilai default 0 digunakan. Parameter bernama sangat berguna ketika fungsi memiliki banyak parameter, beberapa parameter bersifat opsional dan kita ingin membuat pemanggilan fungsi lebih mudah dibaca dan dipahami.Dart memungkinkan penggunaan parameter posisi dan bernama dalam fungsi yang sama. Parameter posisi ditentukan terlebih dahulu, diikuti oleh parameter bernama.
void main() { describePerson('Alice', age: 25, city: 'Wonderland'); describePerson('Bob', city: 'Nowhere'); } void describePerson(String name, {int age = 0, String city = 'Unknown'}) { print('$name is $age years old and lives in $city.'); }
Dalam contoh di atas
name
adalah parameter posisi.age
dancity
adalah parameter bernama dengan nilai default. Kemudian,describePerson('Alice', age: 25, city: 'Wonderland')
akan mencetak "Alice is 25 years old and lives in Wonderland." LaludescribePerson('Bob', city: 'Nowhere')
akan mencetak "Bob is 0 years old and lives in Nowhere."Dalam Dart, parameter bernama dan parameter posisi dapat dibuat opsional. Parameter bernama dibuat opsional dengan kurung kurawal
{}
dan dapat memiliki nilai default. Parameter posisi dapat dibuat opsional dengan kurung siku[]
dan dapat memiliki nilai default juga.void main() { printMessage('Hello'); printMessage('Hello', 'John'); } void printMessage(String message, [String name = '']) { if (name.isEmpty) { print(message); } else { print('$message, $name!'); } }
Dalam contoh di atas
name
adalah parameter posisi opsional dengan nilai default''
.printMessage('Hello')
akan mencetak "Hello".printMessage('Hello', 'John')
akan mencetak "Hello, John!".
Parameter posisi dan parameter bernama adalah fitur penting dalam Dart yang memberikan fleksibilitas dalam cara kita mendefinisikan dan memanggil fungsi. Parameter posisi baik untuk argumen yang selalu diperlukan dan memiliki urutan tetap. Parameter bernama sangat berguna untuk argumen opsional dan untuk meningkatkan keterbacaan kode.
Nilai Kembali dari Fungsi
Fungsi dalam Dart dapat mengembalikan nilai menggunakan kata kunci return
. Nilai yang dikembalikan dapat dari berbagai tipe data seperti int
, String
, bool
, List
, dan sebagainya. Tipe data dari nilai yang dikembalikan harus ditentukan dalam deklarasi fungsi. Fungsi yang tidak mengembalikan nilai apapun menggunakan tipe void
.
void main() {
int sum = add(5, 3);
print('Sum: $sum'); // Output: Sum: 8
}
int add(int a, int b) {
return a + b;
}
Dalam contoh di atas, fungsi add
memiliki dua parameter int
(a
dan b
) dan mengembalikan hasil penjumlahan mereka. Kemudian tipe data kembalian (int
) ditentukan sebelum nama fungsi. Lalu kata kunci return
digunakan untuk mengembalikan hasil penjumlahan.
Fungsi dapat mengembalikan berbagai tipe data dan menggunakan ekspresi yang lebih kompleks dalam pernyataan return
.
String concatenate(String str1, String str2) {
return str1 + str2;
}
bool isEven(int number) {
return number % 2 == 0;
}
Dalam contoh diatas, fungsi concatenate
mengembalikan hasil penggabungan dua string. Lalu fungsi isEven
mengembalikan nilai true
jika angka genap dan false
jika ganjil.
Fungsi Lambda (Anonim)
Fungsi lambda atau fungsi anonim adalah fungsi yang tidak memiliki nama dan sering digunakan untuk operasi sederhana atau sebagai parameter untuk fungsi lain. Dart mendukung penulisan fungsi lambda menggunakan tanda panah (=>
).
void main() {
var numbers = [1, 2, 3, 4, 5];
var doubled = numbers.map((n) => n * 2);
print(doubled); // Output: (2, 4, 6, 8, 10)
}
Dalam contoh di atas fungsi anonim (n) => n * 2
digunakan sebagai parameter untuk metode map
. Kemudian, fungsi ini akan menggandakan setiap elemen dalam daftar numbers
.
Berikut contoh lain dalam penggunaan Lambda lainnya :
void main() {
var names = ['Alice', 'Bob', 'Charlie'];
var uppercasedNames = names.map((name) => name.toUpperCase());
print(uppercasedNames); // Output: (ALICE, BOB, CHARLIE)
}
Dalam contoh ini fungsi lambda (name) => name.toUpperCase()
digunakan untuk mengubah setiap nama menjadi huruf besar.
Fungsi sebagai Parameter
Dart memungkinkan fungsi untuk diteruskan sebagai parameter ke fungsi lain. Ini memberikan fleksibilitas dalam mendesain fungsi yang lebih dinamis dan modular. Fungsi yang diteruskan dapat dipanggil di dalam fungsi penerima.
void main() {
var result = applyOperation(5, 3, add);
print('Result: $result'); // Output: Result: 8
}
int add(int a, int b) => a + b;
int applyOperation(int a, int b, int Function(int, int) operation) {
return operation(a, b);
}
Dalam contoh di atas, fungsi applyOperation
menerima dua bilangan (a
dan b
) dan satu fungsi (operation
). Kemudian int Function(int, int)
adalah tipe fungsi yang mengambil dua int
dan mengembalikan int
. Lalu applyOperation
memanggil operation(a, b)
dan mengembalikan hasilnya.
Fungsi adalah elemen fundamental dalam Dart yang memungkinkan pengorganisasian kode yang lebih baik dan modular. Dengan memahami cara kerja fungsi, termasuk parameter, nilai kembali, dan fungsi anonim, kita dapat menulis kode Dart yang lebih efisien dan mudah dipelihara. Dart memberikan fleksibilitas besar dalam cara kita mendefinisikan dan menggunakan fungsi, sehingga kita dapat memilih pendekatan yang paling sesuai dengan kebutuhan kita.