🐍 📝 Bagian 3 (Jobsheet Praktikum Terstruktur) • Modul JS-05 100% Standar Industri & Vokasi

Jobsheet 05: Desain Berorientasi Objek (OOP)

Praktikum terstruktur: Merancang sistem rekening perbankan (Bank Account & Savings Account), enkapsulasi saldo privat, dan pewarisan fitur transaksi.

1. Kompetensi Dasar & Indikator

Tujuan Praktikum:
  • Mampu merancang Class dengan atribut private dan method proteksi saldo.
  • Menerapkan prinsip Pewarisan (Inheritance) dan pemanggilan super().__init__().
  • Menerapkan Method Overriding dan Dunder Method __str__ untuk representasi objek.

2. Aktivitas Terbimbing: Core Engine Rekening Tabungan & Deposito

Ketik dan jalankan file lab5_perbankan.py:

python (lab5_perbankan.py)
class Rekening:
    def __init__(self, no_rek: str, nasabah: str, saldo_awal: float = 0.0):
        self.no_rek = no_rek
        self.nasabah = nasabah
        self._saldo = saldo_awal  # Protected Attribute

    def setor(self, jumlah: float):
        if jumlah > 0:
            self._saldo += jumlah
            print(f"[+] {self.no_rek}: Setor Rp {jumlah:,.0f} sukses.")
        else:
            print("[-] Jumlah setoran tidak valid!")

    def tarik(self, jumlah: float) -> bool:
        if 0 < jumlah <= self._saldo:
            self._saldo -= jumlah
            print(f"[-] {self.no_rek}: Tarik Rp {jumlah:,.0f} sukses.")
            return True
        print(f"[X] {self.no_rek}: Penarikan gagal (Saldo tidak mencukupi)!")
        return False

    def get_saldo(self) -> float:
        return self._saldo

    def __str__(self):
        return f"Rekening #{self.no_rek} [{self.nasabah}] - Saldo: Rp {self._saldo:,.0f}"

# Class Turunan: Rekening Deposito (Bunga berjangka)
class Deposito(Rekening):
    def __init__(self, no_rek: str, nasabah: str, pokok: float, bunga_persen: float = 6.0):
        super().__init__(no_rek, nasabah, pokok)
        self.bunga_persen = bunga_persen

    def hitung_proyeksi_keuntungan(self, bulan: int) -> float:
        bunga_bulanan = (self.bunga_persen / 100) / 12
        return self._saldo * bunga_bulanan * bulan

# Uji Coba Objek
tabungan_budi = Rekening("TAB-001", "Budi Santoso", 500000)
deposito_budi = Deposito("DEP-888", "Budi Santoso", 10000000, 6.5)

tabungan_budi.setor(200000)
tabungan_budi.tarik(100000)
print(tabungan_budi)

profit_1th = deposito_budi.hitung_proyeksi_keuntungan(12)
print(f"\nProyeksi Bunga Deposito 1 Tahun ({deposito_budi.bunga_persen}%): Rp {profit_1th:,.0f}")

3. Tugas Mandiri: Sistem Manajemen Reservasi Hotel

Studi Kasus: Sistem Manajemen Kamar Hotel OOP

Rancang arsitektur kelas sistem hotel pada file hotel_manager.py:

Struktur Kelas yang Dibutuhkan:
  • Class Kamar: Atribut no_kamar, tarif_per_malam, status_terisi (bool). Method check_in(nama_tamu), check_out().
  • Class KamarVIP(Kamar): Mewarisi Kamar, menambahkan fasilitas sarapan gratis dan diskon menginap > 3 malam.
  • Class Hotel: Memiliki list koleksi objek kamar, method tambah_kamar(kamar), tampilkan_kamar_kosong(), dan total_pendapatan().
Kriteria Keberhasilan: Pengguna dapat melakukan check-in pada kamar yang masih kosong, dan sistem menolak check-in jika kamar sedang terisi.

4. Rubrik Evaluasi & Penilaian

Aspek Penilaian Bobot Kriteria Sempurna
Desain Enkapsulasi & Konstruktor 30% Atribut terlindungi rapi, inisialisasi state objek presisi.
Inheritance & Pemanggilan super() 30% Class turunan memperluas fungsionalitas Parent tanpa merusak kode lama.
Implementasi Magic Method __str__ 20% Objek dapat dicetak langsung ke konsol dengan format yang bersih.
Validasi State (State Consistency) 20% Status kamar konsisten saat check-in dan check-out.