Chapter 15: Object Oriented Programming (OOP)

Kasus Nyata: Membuat Sistem Manajemen Proyek Energi Keterbaruan Eco Techno Leader

Eco Techno Leader ingin membuat sistem untuk mengelola proyek energi keterbaruan, seperti panel surya atau turbin angin, menggunakan konsep OOP (Object-Oriented Programming). Sistem ini akan mencakup pembuatan class, method, inheritance, polymorphism, dan encapsulation untuk mengelola data proyek secara efisien.

Level Beginner: Membuat Class Sederhana

Class adalah blueprint untuk objek. Kita buat class untuk proyek energi.

class ProyekEnergi:
    def __init__(self, nama, kapasitas):
        self.nama = nama
        self.kapasitas = kapasitas

proyek1 = ProyekEnergi("Panel Surya Desa Makmur", 15000)
print(f"Nama proyek: {proyek1.nama}")
print(f"Kapasitas: {proyek1.kapasitas} watt")

Cara Copy-Paste ke VS Code:

  1. Klik tombol "Copy" di atas.
  2. Buka VS Code, buat file baru (Ctrl+N), lalu paste (Ctrl+V).
  3. Simpan file dengan nama proyek_energi.py (Ctrl+S, tambahkan ekstensi .py).
  4. Buka terminal di VS Code (Ctrl+`, atau klik Terminal > New Terminal).
  5. Ketik python proyek_energi.py lalu Enter untuk jalankan.

Hasil di Command Prompt:

Nama proyek: Panel Surya Desa Makmur
Kapasitas: 15000 watt

Do: Gunakan __init__ untuk inisialisasi atribut objek.

Don't: Jangan lupa pake self untuk akses atribut dalam class.

Level Intermediate: Menambahkan Method ke Class

Kita tambah method untuk menghitung efisiensi proyek.

class ProyekEnergi:
    def __init__(self, nama, kapasitas, energi_output):
        self.nama = nama
        self.kapasitas = kapasitas
        self.energi_output = energi_output
    
    def hitung_efisiensi(self):
        return (self.energi_output / self.kapasitas) * 100

proyek1 = ProyekEnergi("Panel Surya Desa Makmur", 15000, 12750)
efisiensi = proyek1.hitung_efisiensi()
print(f"Efisiensi {proyek1.nama}: {efisiensi}%")

Hasil di Command Prompt:

Efisiensi Panel Surya Desa Makmur: 85.0%

Do: Buat method dalam class untuk fungsi yang terkait dengan objek.

Don't: Jangan pake method untuk logika yang gak relevan dengan class, bikin fungsi biasa aja.

Level Advanced: Inheritance, Polymorphism, dan Encapsulation

Kita buat subclass untuk jenis proyek spesifik (panel surya dan turbin angin), terapkan polymorphism, dan gunakan encapsulation untuk melindungi data.

class ProyekEnergi:
    def __init__(self, nama, kapasitas, energi_output):
        self.nama = nama
        self.__kapasitas = kapasitas  # private attribute
        self.__energi_output = energi_output
    
    def hitung_efisiensi(self):
        return (self.__energi_output / self.__kapasitas) * 100
    
    def get_kapasitas(self):  # getter
        return self.__kapasitas
    
    def set_energi_output(self, energi_output):  # setter
        if energi_output < 0:
            print("Energi output tidak boleh negatif!")
        else:
            self.__energi_output = energi_output

class ProyekPanelSurya(ProyekEnergi):
    def __init__(self, nama, kapasitas, energi_output, jumlah_panel):
        super().__init__(nama, kapasitas, energi_output)
        self.jumlah_panel = jumlah_panel
    
    def hitung_efisiensi(self):  # polymorphism
        efisiensi = super().hitung_efisiensi()
        return efisiensi * 0.95  # efisiensi panel surya dikurangi 5% karena faktor lingkungan

class ProyekTurbinAngin(ProyekEnergi):
    def __init__(self, nama, kapasitas, energi_output, kecepatan_angin):
        super().__init__(nama, kapasitas, energi_output)
        self.kecepatan_angin = kecepatan_angin
    
    def hitung_efisiensi(self):  # polymorphism
        efisiensi = super().hitung_efisiensi()
        return efisiensi * (self.kecepatan_angin / 10)  # efisiensi bergantung pada kecepatan angin

# Membuat objek
proyek1 = ProyekPanelSurya("Panel Surya Desa Makmur", 15000, 12750, 50)
proyek2 = ProyekTurbinAngin("Turbin Angin Desa Sejahtera", 20000, 18000, 8)
print(f"Efisiensi {proyek1.nama}: {proyek1.hitung_efisiensi()}%")
print(f"Efisiensi {proyek2.nama}: {proyek2.hitung_efisiensi()}%")
print(f"Kapasitas {proyek1.nama}: {proyek1.get_kapasitas()} watt")
proyek1.set_energi_output(-100)  # mencoba set energi output negatif
proyek1.set_energi_output(13500)  # set energi output baru
print(f"Efisiensi baru {proyek1.nama}: {proyek1.hitung_efisiensi()}%")

Hasil di Command Prompt:

Efisiensi Panel Surya Desa Makmur: 80.75%
Efisiensi Turbin Angin Desa Sejahtera: 72.0%
Kapasitas Panel Surya Desa Makmur: 15000 watt
Energi output tidak boleh negatif!
Efisiensi baru Panel Surya Desa Makmur: 85.5%

Do: Gunakan super() untuk memanggil method dari parent class, dan gunakan getter/setter untuk encapsulation.

Don't: Jangan akses atribut private langsung (misalnya proyek1.__kapasitas), pake getter/setter aja.

"Setiap sistem yang kamu buat adalah langkah menuju dunia yang lebih berkelanjutan. Bersyukurlah kepada Tuhan atas kemampuan untuk terus berinovasi! 🌍"