BAB 4: Fungsi dan Method

BAB 4: Fungsi dan Method

4.1 Pengenalan Fungsi

Apa itu Fungsi?

Fungsi adalah blok kode yang dapat digunakan kembali dan dirancang untuk melakukan tugas tertentu. Fungsi membantu mengorganisir kode menjadi bagian-bagian yang lebih kecil dan dapat dikelola.

Struktur Dasar Fungsi

tipeReturn namaFungsi(parameter) {
  // blok kode
  return nilai;
}

Contoh Fungsi Sederhana

void sayHello() {
  print('Hello World!');
}

void main() {
  sayHello(); // Memanggil fungsi
}

Fungsi dengan Return Value

int tambah() {
  int a = 5;
  int b = 3;
  return a + b;
}

void main() {
  int hasil = tambah();
  print('Hasil: $hasil'); // Output: Hasil: 8
}

4.2 Parameter dan Return Value

Parameter Posisional

// Parameter wajib
void perkenalan(String nama, int umur) {
  print('Halo, nama saya $nama dan saya berumur $umur tahun');
}

// Parameter opsional (dalam kurung [])
void biodata(String nama, [int? umur, String? alamat]) {
  print('Nama: $nama');
  print('Umur: ${umur ?? 'Tidak disebutkan'}');
  print('Alamat: ${alamat ?? 'Tidak disebutkan'}');
}

void main() {
  perkenalan('Budi', 20);
  biodata('Ani', 25); // alamat opsional
  biodata('Citra'); // umur dan alamat opsional
}

Parameter dengan Nama (Named Parameters)

// Parameter dengan nama bersifat opsional secara default
void printBiodata({
  String? nama,
  int? umur,
  String? alamat,
}) {
  print('Nama: ${nama ?? 'Tidak disebutkan'}');
  print('Umur: ${umur ?? 'Tidak disebutkan'}');
  print('Alamat: ${alamat ?? 'Tidak disebutkan'}');
}

// Parameter dengan nama yang required
void dataSiswa({
  required String nama,
  required int umur,
  String? kelas,
}) {
  print('Nama: $nama');
  print('Umur: $umur');
  print('Kelas: ${kelas ?? 'Tidak disebutkan'}');
}

void main() {
  printBiodata(nama: 'Budi', umur: 20);
  dataSiswa(nama: 'Ani', umur: 15, kelas: 'X-A');
}

Parameter Default Value

void sayHello({
  required String nama,
  String sapaan = 'Halo',
  String? title,
}) {
  print('$sapaan ${title ?? ''} $nama');
}

void main() {
  sayHello(nama: 'Budi', title: 'Bapak');
  sayHello(nama: 'Ani'); // menggunakan default sapaan
}

Multiple Return Values menggunakan Record

// Mengembalikan multiple values
(int, String) getPersonInfo() {
  return (25, 'Budi');
}

void main() {
  var (umur, nama) = getPersonInfo();
  print('Nama: $nama, Umur: $umur');
}

4.3 Arrow Function

Arrow function (=>) adalah cara singkat untuk menulis fungsi yang hanya memiliki satu ekspresi.

// Fungsi biasa
int tambah(int a, int b) {
  return a + b;
}

// Arrow function
int tambahArrow(int a, int b) => a + b;

// Arrow function dengan String
String getName() => 'Budi';

// Arrow function dengan conditional
bool isAdult(int age) => age >= 18;

void main() {
  print(tambahArrow(5, 3));      // Output: 8
  print(getName());              // Output: Budi
  print(isAdult(20));           // Output: true
}

4.4 Anonymous Function

Anonymous function adalah fungsi yang tidak memiliki nama dan bisa disimpan dalam variabel.

void main() {
  // Anonymous function disimpan dalam variabel
  var sayHello = () {
    print('Hello!');
  };
  
  // Anonymous function dengan parameter
  var tambah = (int a, int b) {
    return a + b;
  };
  
  // Anonymous function sebagai arrow function
  var kali = (int a, int b) => a * b;
  
  // Menggunakan anonymous function
  sayHello();                  // Output: Hello!
  print(tambah(5, 3));        // Output: 8
  print(kali(4, 2));          // Output: 8
  
  // Anonymous function sebagai parameter
  var numbers = [1, 2, 3, 4, 5];
  numbers.forEach((number) {
    print(number * 2);
  });
  
  // Atau dengan arrow function
  numbers.forEach((number) => print(number * 3));
}

4.5 Praktek: Program Management Kontak

import 'dart:io';

// Mendefinisikan tipe data untuk kontak
typedef Contact = ({
  String nama,
  String nomor,
  String? email
});

// List untuk menyimpan kontak
List<Contact> contacts = [];

// Fungsi untuk menambah kontak
void addContact() {
  stdout.write('Masukkan nama: ');
  String nama = stdin.readLineSync() ?? '';
  
  stdout.write('Masukkan nomor: ');
  String nomor = stdin.readLineSync() ?? '';
  
  stdout.write('Masukkan email (opsional): ');
  String? email = stdin.readLineSync();
  
  contacts.add((
    nama: nama,
    nomor: nomor,
    email: email
  ));
  
  print('\nKontak berhasil ditambahkan!');
}

// Fungsi untuk menampilkan semua kontak
void showContacts() {
  if (contacts.isEmpty) {
    print('Daftar kontak kosong');
    return;
  }
  
  print('\n=== Daftar Kontak ===');
  for (var i = 0; i < contacts.length; i++) {
    var contact = contacts[i];
    print('\nKontak ke-${i + 1}:');
    print('Nama: ${contact.nama}');
    print('Nomor: ${contact.nomor}');
    if (contact.email != null) {
      print('Email: ${contact.email}');
    }
  }
}

// Fungsi untuk mencari kontak
void searchContact(String keyword) {
  var results = contacts.where(
    (contact) => contact.nama.toLowerCase().contains(keyword.toLowerCase())
  ).toList();
  
  if (results.isEmpty) {
    print('Kontak tidak ditemukan');
    return;
  }
  
  print('\n=== Hasil Pencarian ===');
  for (var contact in results) {
    print('\nNama: ${contact.nama}');
    print('Nomor: ${contact.nomor}');
    if (contact.email != null) {
      print('Email: ${contact.email}');
    }
  }
}

// Fungsi untuk menghapus kontak
bool deleteContact(int index) {
  if (index >= 0 && index < contacts.length) {
    contacts.removeAt(index);
    return true;
  }
  return false;
}

// Fungsi utama
void main() {
  while (true) {
    print('\n=== Menu Manajemen Kontak ===');
    print('1. Tambah Kontak');
    print('2. Lihat Semua Kontak');
    print('3. Cari Kontak');
    print('4. Hapus Kontak');
    print('5. Keluar');
    
    stdout.write('\nPilih menu (1-5): ');
    String? input = stdin.readLineSync();
    
    switch(input) {
      case '1':
        addContact();
      case '2':
        showContacts();
      case '3':
        stdout.write('Masukkan nama yang dicari: ');
        String keyword = stdin.readLineSync() ?? '';
        searchContact(keyword);
      case '4':
        stdout.write('Masukkan nomor urut kontak yang akan dihapus: ');
        int index = int.tryParse(stdin.readLineSync() ?? '') ?? -1;
        if (deleteContact(index - 1)) {
          print('Kontak berhasil dihapus!');
        } else {
          print('Nomor urut tidak valid!');
        }
      case '5':
        print('Terima kasih telah menggunakan program ini!');
        return;
      default:
        print('Menu tidak valid!');
    }
  }
}

Latihan Mandiri

  1. Tambahkan fitur edit kontak pada program management kontak

  2. Buat program kalkulator dengan fungsi-fungsi terpisah untuk setiap operasi

  3. Buat program konversi mata uang dengan fungsi arrow

  4. Implementasikan sistem login sederhana menggunakan anonymous function untuk validasi

Tips dan Best Practices

  1. Berikan nama fungsi yang deskriptif dan menggunakan camelCase

  2. Usahakan satu fungsi hanya melakukan satu tugas spesifik

  3. Gunakan parameter dengan nama untuk fungsi dengan banyak parameter

  4. Manfaatkan arrow function untuk fungsi sederhana

  5. Dokumentasikan fungsi yang kompleks

  6. Validasi input parameter jika diperlukan

  7. Gunakan return type yang eksplisit untuk kejelasan kode

Last updated