#02 KARAKTERISTIK METODOLOGI PBO

Modul Ajar: Karakteristik & Metodologi Pemrograman Berorientasi Objek (PBO)

Daftar Isi

A. Pendahuluan: Mengapa PBO Disebut Metodologi?
B. Pilar 1: Abstraksi (Abstraction) - Seni Menyederhanakan
C. Pilar 2: Enkapsulasi (Encapsulation) - Benteng Pertahanan Data
D. Pilar 3: Pewarisan (Inheritance) - Warisan Sifat Digital
E. Pilar 4: Polimorfisme (Polymorphism) - Satu Perintah, Banyak Wajah
F. Pilar 5 & 6: Modularitas & Reusability - Kerja Cerdas Tim
G. Studi Kasus Terintegrasi: Sistem Kasir Toko PPLG Mart

A. Pendahuluan: Mengapa PBO Disebut Metodologi?

Halo para programmer masa depan! 👋

Jika sebelumnya kita belajar bahwa PBO adalah sebuah "Paradigma" (cara pandang), hari ini kita akan bedah PBO sebagai sebuah Metodologi (cara kerja).

Bayangkan kalian sedang membangun sebuah gedung pencakar langit. Kalian tidak mungkin langsung menumpuk batu bata sembarangan. Kalian butuh:

  • Blueprint (Rancangan/Abstraksi)
  • Tembok Pengaman (Enkapsulasi)
  • Struktur Lantai yang sama (Pewarisan)
  • Sistem Listrik yang fleksibel (Polimorfisme)

Tanpa metodologi ini, kode program kalian akan menjadi "Kode Spaghetti"—kusut, sulit diperbaiki, dan jika ditarik satu ujung, ujung lainnya putus. Mari kita pelajari 6 senjata utama seorang programmer Java!

B. Pilar 1: Abstraksi (Abstraction) - Seni Menyederhanakan

1. Konsep Mendalam

Abstraksi adalah proses menyembunyikan kerumitan latar belakang dan hanya menampilkan fitur-fitur penting kepada pengguna.

Dalam pemrograman, kita sering terjebak memikirkan detail teknis. Abstraksi memaksa kita bertanya: "Apa yang sebenarnya pengguna butuhkan?" bukan "Bagaimana mesin bekerja?".

2. Analogi Dunia Nyata: Mesin Kopi Otomatis 

Bayangkan sebuah mesin kopi canggih di minimarket.

  • Yang Kamu Lihat (Abstraksi): Tombol "Espresso", "Latte", "Cappuccino", dan lubang keluarnya kopi.
  • Yang Tersembunyi (Detail Rumit):

    • Suhu air pemanas (harus 93°C).
    • Tekanan pompa bar.
    • Mekanisme penggilingan biji kopi.
    • Algoritma pencampuran susu.

Sebagai pengguna, apakah kamu peduli bagaimana pompa air bekerja? Tidak. Kamu hanya ingin menekan tombol dan kopi keluar. Itulah Abstraksi.

3. Implementasi dalam Java

Di Java, abstraksi sering diwujudkan menggunakan Class, Interface, atau Abstract Class.

/**
 * Contoh Abstraksi: Class Produk
 * Kita fokus pada Nama dan Harga saja.
 * Kita sembunyikan detail seperti ID database, tanggal input, dll.
 */
public class Produk {
    
    // Kita deklarasikan atribut penting saja
    private String namaBarang;
    private double hargaBarang;

    // Constructor: Cara membuat objek Produk
    public Produk(String nama, double harga) {
        this.namaBarang = nama;
        this.hargaBarang = harga;
    }

    // Method Tampil Info: Ini adalah fitur yang kita tawarkan ke user
    public void tampilkanInfo() {
        System.out.println("=== INFO PRODUK ===");
        System.out.println("Nama  : " + namaBarang);
        System.out.println("Harga : Rp" + hargaBarang);
        System.out.println("===================");
    }
}

Poin Penting: Di class Main, programmer lain yang menggunakan class Produk ini tidak perlu tahu bagaimana cara kamu menyimpan variabel nama. Mereka cukup panggil produk.tampilkanInfo().


C. Pilar 2: Enkapsulasi (Encapsulation) - Benteng Pertahanan Data

1. Konsep Mendalam

Jika Abstraksi adalah tentang "menyederhanakan tampilan", maka Enkapsulasi adalah tentang "keamanan dan kontrol".

Enkapsulasi membungkus data (variabel) dan kode (method) menjadi satu unit. Poin kuncinya adalah Data Hiding (Penyembunyian Data). Kita membuat data menjadi private dan hanya bisa diakses lewat "pintu" resmi yang disebut Getter dan Setter.

2. Analogi Dunia Nyata: Dompet Digital 

Pikirkan aplikasi DANA atau GoPay kalian.

  • Apakah kalian bisa langsung membuka database server DANA dan mengubah saldo kalian menjadi Rp 1 Milyar? Tentu Tidak.
  • Saldo kalian bersifat PRIVATE.
  • Untuk mengubah saldo, kalian harus lewat method TopUp() atau Transfer().
  • Di dalam method TopUp, ada satpam (validasi): "Apakah uang yang dikirim asli? Apakah koneksi aman?". Jika lolos, baru saldo bertambah.

3. Implementasi dalam Java

Perhatikan bagaimana kita mencegah harga menjadi negatif.

public class ProdukAman {
    
    // 1. Data disembunyikan (PRIVATE)
    // Orang luar tidak bisa akses langsung: produk.harga = -5000 (ERROR)
    private String nama;
    private double harga;

    public ProdukAman(String nama, double harga) {
        this.nama = nama;
        this.setHarga(harga); // Gunakan setter bahkan di constructor!
    }

    // 2. Akses Pintu Masuk (SETTER) dengan VALIDASI
    public void setHarga(double hargaBaru) {
        if (hargaBaru > 0) {
            this.harga = hargaBaru;
        } else {
            System.out.println("ERROR: Harga tidak boleh negatif atau nol!");
            // Bisa tambahkan logika lain, misal set ke harga default
        }
    }

    // 3. Akses Pintu Keluar (GETTER)
    public double getHarga() {
        return this.harga;
    }
    
    public String getNama() {
        return this.nama;
    }
}

Mengapa ini penting? Tanpa enkapsulasi, program kasir kalian bisa kacau jika ada bug atau programmer iseng yang memasukkan harga = -10000. Toko bisa bangkrut karena malah membayar pembeli!

D. Pilar 3: Pewarisan (Inheritance) - Warisan Sifat Digital

1. Konsep Mendalam

Inheritance adalah mekanisme di mana sebuah class baru (Child/Subclass) mewarisi sifat (atribut) dan perilaku (method) dari class yang sudah ada (Parent/Superclass).

Prinsip utamanya adalah DRY (Don't Repeat Yourself). Jangan tulis kode yang sama berulang-ulang!

2. Analogi Dunia Nyata: Genetika Keluarga 👨‍👦

  • Bapak (Parent Class): Punya rambut keriting, kulit sawo matang.
  • Anak (Child Class): Secara otomatis punya rambut keriting dan kulit sawo matang (warisan).
  • Tapi: Anak bisa belajar coding (kemampuan baru yang Bapak tidak punya).

Dalam software Toko:

  • Produk adalah Bapak.
  • Makanan adalah Anak (Punya fitur Produk + fitur Kedaluwarsa).
  • Laptop adalah Anak (Punya fitur Produk + fitur Spesifikasi Processor).

3. Implementasi dalam Java

Kata kunci sakti: extends
// CLASS INDUK (PARENT)
public class ProdukDasar {
    protected String nama; // Protected: Bisa diakses oleh anak
    protected double harga;

    public ProdukDasar(String nama, double harga) {
        this.nama = nama;
        this.harga = harga;
    }

    public void info() {
        System.out.println("Produk: " + nama + " | Harga: " + harga);
    }
}

// CLASS ANAK (CHILD) - MAKANAN
public class Makanan extends ProdukDasar {
    private String tanggalExpired;

    public Makanan(String nama, double harga, String exp) {
        // super() memanggil constructor Bapak
        super(nama, harga); 
        this.tanggalExpired = exp;
    }

    // Menambah fitur baru yang Bapak tidak punya
    public void cekKondisi() {
        System.out.println("Cek Expired: " + tanggalExpired);
    }
}
 

E. Pilar 4: Polimorfisme (Polymorphism) - Satu Perintah, Banyak Wajah

1. Konsep Mendalam

Dari bahasa Yunani: Poly (Banyak) + Morph (Bentuk). Ini adalah kemampuan objek yang berbeda-beda untuk merespons perintah (method) yang sama dengan cara yang berbeda.

Ada dua jenis Polimorfisme:

  • Overloading: Nama method sama, tapi parameter beda (di class yang sama).
  • Overriding: Nama method sama, parameter sama, tapi isinya diubah ulang (di class anak).

2. Analogi Dunia Nyata: Tombol "Start" 🔘

Pikirkan tombol START di kendaraan.

  • Di Motor Matic: Tekan Start -> Mesin menyala halus.
  • Di Mobil Sport: Tekan Start -> Mesin menderu kencang.
  • Di Pesawat Jet: Tekan Start -> Turbin berputar, suara bising.

Perintahnya satu kata: START. Tapi setiap kendaraan punya cara merespons yang unik.

3. Implementasi dalam Java (Overriding)

Kita gunakan contoh Diskon. Semua produk punya method hitungDiskon(), tapi rumusnya beda.

// Parent
class Produk {
    public double hitungDiskon() {
        return 0; // Default tidak ada diskon
    }
}

// Child 1: Makanan (Diskon 5%)
class Makanan extends Produk {
    @Override
    public double hitungDiskon() {
        return 0.05; 
    }
}

// Child 2: Elektronik (Diskon 10% + Promo)
class Elektronik extends Produk {
    @Override
    public double hitungDiskon() {
        return 0.10; 
    }
}

// Main Program
public class MainPolimorfisme {
    public static void main(String[] args) {
        Produk p1 = new Makanan();
        Produk p2 = new Elektronik();
        
        // Perintahnya SAMA: hitungDiskon()
        // Hasilnya BEDA
        System.out.println("Diskon Makanan: " + p1.hitungDiskon()); // Output 0.05
        System.out.println("Diskon Elektro: " + p2.hitungDiskon()); // Output 0.10
    }
}

 

F. Pilar 5 & 6: Modularitas & Reusability - Kerja Cerdas Tim

Dua hal ini bukan fitur bahasa seperti class atau extends, tapi lebih ke dampak dari penggunaan PBO yang baik.

Modularitas (Memecah Masalah Besar)

Bayangkan membuat aplikasi Gojek sendirian. Mustahil, kan? Dengan modularitas, kita pecah aplikasi jadi modul-modul kecil:

  • Modul User (Login, Profil)
  • Modul Map (Lokasi, GPS)
  • Modul Payment (Gopay, History)

Setiap modul bisa dikerjakan oleh orang berbeda. Jika fitur Gopay error, fitur Map tidak akan ikut rusak. Ini membuat debugging (mencari error) jauh lebih cepat.

Reusability (Daur Ulang Kode)

Pernahkah kalian membuat method konversiRupiah()? Jika kalian menulisnya dalam bentuk Class PBO yang rapi (misal Utility.java), class itu bisa kalian:

  1. Pakai di Project Kasir Kelas X.

  2. Copy-paste ke Project Perpustakaan Kelas XI.

  3. Pakai lagi di Project Skripsi nanti.

Kalian tidak perlu menulis kode dari nol seumur hidup kalian. Inilah efisiensi PBO!


G. Studi Kasus Terintegrasi: Sistem Kasir Toko PPLG Mart

Mari kita gabungkan semua konsep di atas dalam satu kode program Java yang utuh. Kode ini bisa kalian salin ke NetBeans.

Skenario: Kita butuh sistem kasir yang bisa menghitung harga akhir untuk berbagai jenis barang. Barang elektronik kena pajak, barang sembako bebas pajak. 

/*
 * PROGRAM KASIR PPLG MART
 * Demonstrasi: Abstraksi, Enkapsulasi, Inheritance, Polimorfisme
 */

// 1. ABSTRAKSI & ENKAPSULASI
class Barang {
    private String nama;
    protected double hargaDasar; // Protected agar bisa diakses anak

    public Barang(String nama, double harga) {
        this.nama = nama;
        this.hargaDasar = harga;
    }

    // Method umum yang akan di-Override (Polimorfisme)
    public double hitungHargaAkhir() {
        return hargaDasar;
    }

    public void cetakStruk() {
        System.out.println("Barang : " + nama);
        System.out.println("Harga  : Rp" + (int)hitungHargaAkhir());
    }
}

// 2. INHERITANCE (Barang Elektronik mewarisi Barang)
class Televisi extends Barang {
    
    public Televisi(String nama, double harga) {
        super(nama, harga);
    }

    // 3. POLIMORFISME (Overriding)
    // Televisi ada pajak barang mewah 10%
    @Override
    public double hitungHargaAkhir() {
        return hargaDasar + (hargaDasar * 0.1); 
    }
}

// 2. INHERITANCE (Beras mewarisi Barang)
class Beras extends Barang {
    
    public Beras(String nama, double harga) {
        super(nama, harga);
    }

    // 3. POLIMORFISME
    // Beras disubsidi, jadi ada diskon 5% (Tidak kena pajak)
    @Override
    public double hitungHargaAkhir() {
        return hargaDasar - (hargaDasar * 0.05);
    }
}

// MAIN CLASS (Tempat Eksekusi)
public class PPLGMart {
    public static void main(String[] args) {
        System.out.println("=== SISTEM KASIR PPLG MART ===");
        
        // Membuat objek (Modularitas: Objek terpisah-pisah)
        Barang tv = new Televisi("Samsung TV 32 Inch", 2000000);
        Barang beras = new Beras("Beras Pandan Wangi", 100000);
        
        // Menampilkan hasil
        System.out.println("\n--- Transaksi 1 ---");
        tv.cetakStruk(); 
        // Logika: 2jt + 10% pajak = 2.200.000
        
        System.out.println("\n--- Transaksi 2 ---");
        beras.cetakStruk(); 
        // Logika: 100rb - 5% diskon = 95.000
    }
}

Penjelasan Alur Code di Atas:

  1. Abstraksi: User (Kasir) hanya panggil cetakStruk(). Dia tidak perlu tahu rumus pajak TV atau diskon Beras.
  2. Enkapsulasi: Nama dan Harga dibungkus dalam class.
  3. Inheritance: Televisi dan Beras adalah anak dari Barang.
  4. Polimorfisme: Method hitungHargaAkhir() bekerja berbeda. Pada TV dia menambah pajak, pada Beras dia mengurangi harga (diskon).

Penutup: Pesan untuk Siswa PPLG

Menguasai 6 karakteristik ini bukan hanya soal menghafal definisi untuk ujian. Ini adalah soal merapikan cara berpikir.

Saat nanti kalian PKL (Praktik Kerja Lapangan) atau bekerja sebagai Software Engineer, kalian tidak akan dinilai dari seberapa cepat kalian mengetik, tapi seberapa rapi, aman, dan mudah dikembangkan kode yang kalian buat.

Selamat ngoding di NetBeans! Jangan takut error, karena error adalah guru terbaik programmer. 🚀 

Posting Komentar

Lebih baru Lebih lama

Formulir Kontak