Ngoding Tanpa OOP Itu Kayak Nyetir Tanpa Setir

0
Fundamentals
Ditulis 24 June 2025 Baca ± 15 menit
Ngoding Tanpa OOP Itu Kayak Nyetir Tanpa Setir

Adi sudah mulai nyaman dengan dunia ngoding.
Fungsi? Bisa.
If-else? Hafal luar kepala.
Looping? Kayak lagu favorit—diputar terus.

Dia bahkan sempat merasa percaya diri. “Ngoding itu ternyata nggak sesulit itu ya,” katanya suatu malam sambil menyeduh kopi sachet yang udah mulai jadi ritual sebelum ngoding.

Tapi suatu hari, semuanya berubah.
Tugas kuliah datang seperti hujan di pagi hari—tidak diminta, tidak dihindari, tapi tetap bikin malas gerak:

"Buatlah program dengan pendekatan Object-Oriented Programming."

Adi membacanya seperti membaca resep masakan dengan bahan yang gak ada di dapur.
Tidak ada kata print(), tidak ada while True, dan tidak ada contoh nyata yang bikin dia klik.

“Object... Oriented... Programming?” gumamnya sambil menatap terminal yang kosong.
“Bikin objek? Ngapain bikin objek? Emang saya tukang plastik?”

Dia pun memulai perjalanan gelisahnya:
Googling sampai jari pegal, nonton video YouTube yang awalnya semangat tapi lima menit kemudian udah kayak nonton dokumenter tanpa subtitle.
Ia buka forum-forum lama yang judulnya ‘Belajar OOP untuk Pemula’, tapi isinya malah berdebat soal Single Responsibility Principle dan abstract factory pattern—yang malah bikin tambah pening.

  • Semua penjelasan terdengar teknis banget:
  • “Class adalah blueprint”
  • “Object adalah instance dari class”
  • “Gunakan inheritance untuk reusability”
  • “Encapsulation menyembunyikan data”
  • “Polymorphism membuat kode lebih fleksibel”

Terdengar seperti mantra yang harus dihafalkan, bukan dipahami.

Alih-alih tercerahkan, Adi malah merasa tersesat.
Ia coba mengimplementasikan yang ia pahami seadanya, tapi hasilnya? Malah makin ribet.

"Padahal kodenya yang lama jalan-jalan aja," pikirnya.
"Ya emang sih, agak acak-acakan. Tapi kan tetep bisa jalan.
Lah kenapa harus repot-repot ngubah ke OOP? Toh, hasil akhirnya sama aja, kan?"

Itu yang ia pikir.
Sampai akhirnya, di tengah rasa frustrasi dan nyaris pasrah, Adi bertemu dengan seseorang yang tidak menjelaskan OOP dengan textbook, tapi dengan cerita.

Dan sejak saat itu, semuanya mulai masuk akal.

Ketemu dengan Pak Bagas

Pak Bagas bukan dosen biasa. Ia bukan tipe yang suka menatap layar presentasi sambil membaca slide yang bahkan mahasiswanya udah hafal di luar kepala.
Ia lebih sering terlihat duduk di sudut kafe kampus, ngoding sambil menyeruput kopi hitam tanpa gula, lengkap dengan laptop yang stiker Linux-nya mulai mengelupas.

Ia dikenal karena analogi-analogi anehnya—tapi anehnya hal itu justru nyangkut di kepala.
Pernah suatu kali ia menjelaskan konsep recursion pakai cerita anak kecil yang nanya terus, “Habis itu gimana?”
Atau waktu bahas debugging pakai perumpamaan cari kunci rumah yang ketinggalan, padahal kamu gak yakin tadi masukin ke tas atau nggak.

Dan yang paling legendaris:

“Kode yang jalan belum tentu bener… apalagi kalau cuma kamu yang ngerti.”

Bagi sebagian mahasiswa, kalimat itu sekilas terdengar bijak tapi membingungkan. Tapi bagi Adi, kalimat itu mulai terasa relevan—karena kodenya memang jalan, tapi makin lama makin sulit dipahami, bahkan oleh dirinya sendiri.

Satu sore, setelah berkutat dengan tugas OOP yang makin bikin stres, Adi akhirnya mendekat ke meja Pak Bagas yang dikelilingi aroma espresso dan tumpukan buku teknik yang tampak tidak tersentuh.

Dengan wajah lelah dan jari yang masih bekas tekanan keyboard, Adi bertanya:

“Pak, kenapa sih kita harus pake OOP? Emangnya def sama if doang gak cukup? Saya udah bisa bikin program pakai itu semua. Dan jalan.”

Pak Bagas tidak langsung menjawab. Ia hanya tersenyum seperti orang yang tahu bahwa ini pertanyaan yang akan muncul cepat atau lambat.
Ia menyandarkan tubuh, menutup laptopnya perlahan, lalu menatap Adi.

“Adi, kamu bisa nyetir mobil?”

Adi agak bingung, tapi menjawab, “Bisa, Pak.”

“Kalau aku copotin setirnya, kamu masih bisa nyetir gak?”

Adi tertawa kecil, “Ya… gak bisa dong, Pak. Mau belok gimana?”

Pak Bagas mengangguk, lalu berkata sambil mengetuk meja dengan jarinya:

“Nah. Kode kamu itu ibarat mobil. Tanpa OOP, kamu nyetir mobil tanpa setir. Bisa jalan sih… tapi ngacau. Kamu gak tahu arahnya mau ke mana. Dan yang lebih parah, orang lain yang naik mobil itu bisa nabrak tembok karena gak ngerti sistemnya.”

Ia lalu menambahkan,

“Ngoding tanpa OOP mungkin bikin kamu ngerasa serba bisa. Tapi ketika programmu tumbuh, dan kamu harus kerja bareng orang lain—tanpa OOP, kode itu jadi monster yang kamu ciptakan sendiri, dan gak ada yang bisa jinakkan, termasuk kamu.”

Adi terdiam.
Itu mungkin analogi paling aneh yang pernah dia dengar…
...tapi entah kenapa, justru itu yang pertama kali masuk akal.

OOP Itu Kayak Merancang, Bukan Sekadar Nulis

“Ngoding procedural itu kayak numpuk bata sembarangan biar cepet jadi tembok,” lanjut Pak Bagas sambil menggambar kotak-kotak acak di tisu kafe.
“Kamu emang bisa punya bangunan, tapi coba kalau temboknya retak—kamu bingung yang mana harus dibongkar. Mau pasang jendela aja, bisa jadi satu sisi roboh semua.”

Ia lalu menggambar ulang:
Garis-garis lurus, ruang-ruang dengan label: dapur, ruang tamu, kamar tidur.

“Ngoding pakai OOP itu kayak jadi arsitek. Rancangannya jelas, tiap bagian punya tugas, dan gampang diperbaiki kalau ada yang rusak. Kalau kamar mandi bocor, kamu gak perlu bongkar ruang tamu.”

Adi memperhatikan gambar itu dengan saksama. Rasanya baru sekarang ia melihat koding seperti menyusun rumah, bukan hanya ngetik baris demi baris yang panjang dan ribet.

Pak Bagas melanjutkan:

“Kita sering mikir ngoding itu soal ‘gimana biar bisa jalan’. Padahal yang penting itu bukan cuma jalan, tapi bisa dibaca, dirawat, dikembangkan, bahkan dibagi ke tim. Nah, OOP hadir buat bantu kamu mikir kayak desainer sistem, bukan cuma tukang ketik kode.”

Object-Oriented Programming (OOP) bukan sekadar teknik.
Ia adalah cara memecah dunia nyata menjadi bagian-bagian kecil yang bisa direpresentasikan dalam kode—yang masing-masing punya tanggung jawab sendiri dan bisa bekerja sama dalam sistem yang lebih besar.

Alih-alih bikin daftar panjang perintah dari atas ke bawah, kamu membentuk sistem yang lebih seperti ekosistem:

  • Ada objek yang menyimpan data,
  • Ada yang memproses,
  • Ada yang menampilkan,
  • Dan semuanya berkomunikasi satu sama lain seperti manusia yang saling bicara lewat peran masing-masing.

“Kamu tahu kenapa banyak kode spaghetti itu muncul?” tanya Pak Bagas.
“Karena semuanya dicampur. Variabel global, fungsi tumpang tindih, logika loncat-loncat. Tanpa OOP, kamu kayak chef yang nyampur semua bahan ke dalam satu panci tanpa urutan. Hasilnya? Bubur rasa buncis saus cokelat.”

Adi ngakak kecil. Analogi itu aneh, tapi ngena banget.

“Kalau OOP?” tanya Adi.

“Kalau OOP, kamu kayak punya dapur profesional. Ada bagian yang motong bahan, ada yang masak, ada yang plating. Semuanya punya tugas, dan kalau ada masalah, kamu tahu harus cek di bagian mana. Lebih tenang, lebih elegan.”

Dan sejak percakapan itu, Adi mulai melihat kode dari sudut pandang yang berbeda.
Ia tak lagi sekadar nulis kode yang bisa dieksekusi, tapi mulai belajar merancang kode yang bisa dipahami, disusun ulang, dan diwariskan.

Karena ngoding itu bukan sprint—itu maraton.
Dan OOP? Itu seperti sepasang sepatu lari yang bikin kamu tetap kuat sampai garis akhir.

Kenapa Harus Pakai “Objek”?

Coba kamu pikirin deh: kamu diminta bikin program untuk toko buku kecil-kecilan.
Tanpa OOP, pendekatannya biasanya begini:

  • judul_buku1 = "Laskar Pelangi"
  • harga_buku1 = 50000
  • stok_buku1 = 12
  • judul_buku2 = "Bumi"
  • harga_buku2 = 78000
  • stok_buku2 = 7
    ...dan seterusnya.

Kalau kamu punya 100 buku? Selamat, kamu sedang membuat neraka variabel.
Dan ketika nanti ada diskon besar-besaran atau perubahan harga massal? Kamu bakal scroll ratusan baris kode, berharap gak typo satu pun.

Di sinilah OOP bikin hidup jadi lebih manusiawi.

Alih-alih membuat ratusan variabel global yang rawan tumpang tindih, kamu cukup buat satu cetakan, satu "class" bernama Buku.

classBuku:
    def__init__(self, judul, pengarang, harga, stok):<
        self.judul = judul
        self.pengarang = pengarang
        self.harga = harga<
        self.stok = stok
    deftampilkan_info(self):
        print(f"{self.judul} oleh {self.pengarang}, harga: {self.harga}, stok: {self.stok}")
    defubah_harga(self, harga_baru):

self.harga = harga_baru

defstok_berkurang(self, jumlah):
        self.stok -= jumlah
Lalu, kalau kamu ingin menambahkan buku ke sistem?
buku1 = Buku("Laskar Pelangi", "Andrea Hirata", 50000, 12)
buku2 = Buku("Bumi", "Tere Liye", 78000, 7)

Jadi jauh lebih elegan, kan?

Sekarang setiap Buku yang kamu buat adalah objek, seperti "benda virtual" yang hidup dalam dunia programmu.
Setiap objek punya data (judul, pengarang, harga, stok) dan perilaku (menampilkan informasi, mengubah harga, mengurangi stok).

Mau nambah ratusan buku? Gampang.
Mau bikin semua buku diskon 10%? Tinggal buat satu metode baru.
Mau ekspor semua buku ke file CSV? Tinggal looping objek-objek itu dan akses atributnya satu per satu.

Ini bukan cuma soal gaya penulisan—tapi soal cara berpikir.

Dengan OOP, kamu diajak untuk memodelkan dunia nyata ke dalam logika program.
Buku itu bukan sekadar judul_buku3 dan stok_buku3.
Tapi benar-benar jadi entitas utuh yang bisa diperlakukan seperti tokoh dalam cerita—bisa berubah, bisa diakses, dan bisa berinteraksi.

Dan yang paling penting: kamu bisa fokus ke ide utama, bukan ke detail teknis kecil yang bikin capek.

Gimana kalau program toko bukumu nanti berkembang: Ada kasir, pelanggan, diskon, nota, retur, laporan bulanan…
Kalau semua itu ditulis tanpa objek, kamu akan menciptakan tumpukan kode yang menjulang lebih tinggi dari semangatmu ngoding.

Tapi kalau semua entitas itu kamu jadikan objek dengan class-nya masing-masing?
Programmu akan terasa seperti organisasi yang rapi—masing-masing tahu tugasnya, dan saling berkomunikasi dengan tertib.

Empat Pilar OOP

(a.k.a. Setir, Rem, Gas, dan Dashboard di Dunia Pemrograman)

Kalau kamu anggap program seperti kendaraan, maka empat pilar OOP ini adalah bagian vitalnya. Tanpa salah satunya, programmu mungkin tetap bisa jalan...
...tapi siap-siap oleng, sulit dikendalikan, dan bikin penumpangnya mabuk logika.

1. Encapsulation – Rahasiakan yang Perlu Dirahasiakan

“Kamu nggak perlu tahu gimana mesin ATM kerja, kamu cuma perlu tekan tombol.”

Ini prinsip yang melindungi data dari tangan-tangan usil.
Coba bayangkan kamu bikin program keuangan, dan semua orang bisa langsung mengakses atau mengubah saldo user seenaknya. Ngeri, kan?

Dengan encapsulation, kamu membungkus data dan hanya memberikan akses lewat pintu resmi—alias metode yang kamu sediakan.

classATM:
    def__init__(self):
        self.__saldo = 0  # disembunyikan
    defsetor(self, jumlah):
        self.__saldo += jumlah
    defcek_saldo(self):
        return self.__saldo

Perhatikan: variabel __saldo diawali dengan dua garis bawah. Itu tandanya: "ini rahasia dalam rumah, jangan diobrak-abrik dari luar."

Mau tahu saldo? Harus lewat cek_saldo().
Mau nambah uang? Harus lewat
setor().

Coba kamu pikirkan, gimana kalau saldo bisa diubah dari luar dengan atm.__saldo = 9999999—satu baris, dan sistemmu hancur.
Itulah kenapa encapsulation penting: untuk membatasi akses, menjaga integritas data, dan memaksa pengguna kode untuk lewat jalur yang benar.

2. Abstraction – Sembunyikan Kerumitan, Tampilkan Kesederhanaan

“Kalau bisa cukup satu tombol, kenapa harus buka kabel-kabel?”

Abstraction itu seperti menyembunyikan dapur kotor di balik pintu restoran.
Pengunjung cukup lihat makanan datang ke meja. Mereka gak perlu lihat panci-panci, api, atau adonan yang berantakan.

Dalam pemrograman, abstraction artinya menyembunyikan detail teknis dan hanya menampilkan antarmuka yang mudah digunakan.

classKamera:
    defambil_foto(self):
        print("Klik! Foto diambil.")

Kamu tinggal panggil ambil_foto(), dan selesai.
Kamu gak perlu tahu cara kerja sensor, shutter speed, atau pengaturan ISO.

Abstraction bikin kode:

  • Lebih mudah digunakan
  • Lebih mudah dibaca
  • Lebih gak bikin stres

Intinya: kamu kasih hasil, bukan keribetan.
Dan itu penting banget kalau kamu bikin program buat orang lain, atau bahkan... diri kamu sendiri beberapa minggu ke depan.

3. Inheritance – Turunkan Sifat, Jangan Ulangi Kode

“Kalau punya banyak anak kelas, ngapain ajarin dari nol semua hal yang sama?”

Misalnya kamu bikin sistem hewan. Semua hewan bisa makan dan tidur, tapi masing-masing punya suara yang beda-beda.

Dengan inheritance, kamu cukup bikin satu class Hewan, lalu class Kucing dan class Anjing tinggal warisi sifatnya.
Gak perlu nulis ulang fungsi
makan() dan tidur() di setiap class.

classHewan:
    defmakan(self):
        print("Makan...")

classKucing(Hewan):
    defsuara(self):
        print("Meong~")

classAnjing(Hewan):
    defsuara(self):
        print("Guk!")

Sekarang Kucing dan Anjing otomatis bisa makan(), karena mereka anak dari Hewan.

Ini sesuai prinsip DRY: Don’t Repeat Yourself.
Jangan ngoding kayak kaset rusak yang muter kalimat sama terus.

Dengan inheritance, kamu tinggal warisi fitur umum, dan fokus bikin fitur yang unik.

4. Polymorphism – Satu Perintah, Banyak Perilaku

“Kata ‘jalan’ artinya beda kalau yang jalan itu manusia, mobil, atau kucing.”

Polymorphism adalah tentang fleksibilitas.
Kamu punya satu metode yang sama—tapi ketika dipanggil oleh objek berbeda, hasilnya juga beda.

Contoh:

classManusia:
    defjalan(self):
        print("Manusia berjalan.")

classMobil:
    defjalan(self):
        print("Mobil melaju.")

defjalankan(objek):
    objek.jalan()

Sekarang kamu bisa panggil:

jalankan(Manusia())  # Output: Manusia berjalan.
jalankan(Mobil())    # Output: Mobil melaju.

Metode jalan() tetap satu nama, tapi tiap objek menafsirkan dengan caranya sendiri.

Ini bikin kode terstruktur tapi lentur—bisa diubah dan dikembangkan tanpa mengacak-acak fungsi utama.

Kalau nanti kamu tambahkan class Robot, kamu cukup buat fungsi jalan() di sana—dan jalankan() tetap bisa pakai robot tanpa perubahan.

Studi Kasus Mini: Keranjang Belanja

Setelah tercerahkan, Adi iseng bikin aplikasi belanja kecil:

classProduk:
    def__init__(self, nama, harga):
        self.nama = nama
        self.harga = harga

classKeranjang:
    def__init__(self):
        self.isi = []

    deftambah(self, produk):
        self.isi.append(produk)

    deftotal(self):
        returnsum(p.harga for p in self.isi)

Dan hasil penggunaannya:

p1 = Produk("Kopi", 18000)
p2 = Produk("Susu", 15000)

k = Keranjang()
k.tambah(p1)
k.tambah(p2)

print("Total belanja:", k.total())

Simple, rapi, dan scalable. Mau tambah diskon? Mau simpan ke database? Tinggal kembangkan tanpa pusing bongkar semua.

Pertanyaan klasik dari banyak pemula—dan Adi pun pernah menanyakannya:

“Kalau programnya masih kecil, ngapain repot-repot mikirin OOP segala?”

Dan ya, itu bukan pertanyaan bodoh. Bahkan itu pertanyaan yang sehat.
Karena pada dasarnya, kita semua ingin solusi yang praktis dan gak ribet.

Tapi begini kata Pak Bagas waktu Adi nanya hal itu:

“Kalau programmu masih 50 baris ya nggak terlalu terasa. Tapi coba nanti ketika udah ribuan baris.
Tanpa OOP, kamu bakal tenggelam di lautan variabel dan fungsi acak.”

Kamu akan mulai merasa:

  • Kok nama variabelnya sama?
  • Ini fungsi buat apa ya tadi?
  • Kalau aku ganti di sini, bagian lain rusak nggak?
  • Ini kenapa semua file saling nyangkut kayak kabel headset?

Kalau kamu pernah buka proyek lama dan butuh waktu sejam buat ngerti kode kamu sendiri…
Maka kamu udah merasakan gejala awal dari “teknikal utang” akibat nggak pakai struktur yang jelas.

Dan di sinilah OOP bersinar.
Bukan karena dia keren, bukan karena dia tren—tapi karena dia membantu kamu berpikir dalam unit-unit kecil yang masuk akal.
Setiap objek mewakili satu bagian nyata dalam sistemmu.
Setiap class punya tanggung jawab sendiri.
Dan kalau ada bug, kamu tahu harus periksa siapa, bukan nebak-nebak dari mana asalnya.

Framework modern seperti Laravel, Django, Spring, Flask (versi OOP), Unity, Flutter—semuanya berdiri di atas pondasi OOP.
Bahkan library Python seperti
pandas, requests, atau matplotlib pun pakai pendekatan berbasis objek.

Coba aja ketik df.head() di pandas.
df adalah objek. head() adalah metode milik objek itu.
Tanpa sadar, kamu udah pakai OOP meskipun belum belajar formalnya.

Dan ketika kamu pakai library pihak ketiga, mereka gak nyuruh kamu copas ribuan baris fungsi.
Mereka kasih kamu objek siap pakai—yang bisa kamu panggil, kombinasikan, dan kendalikan.
Artinya: dunia nyata pemrograman modern udah default-nya pakai OOP.

Ngoding tanpa OOP? Bisa.
Tapi seperti nyetir mobil manual tanpa power steering. Bisa juga. Tapi coba pakai itu di tengah macet, pas jalan menanjak, sambil nahan rem tangan karena rem utama agak ngadat.
Capek. Berat. Frustrasi.

Sementara ngoding dengan OOP itu seperti nyetir mobil matic, setir enteng, semua fitur ada di tempatnya.
Ketika kamu mau belok, kamu cukup gerakkan tangan—bukan putar setir tiga putaran penuh sambil ngelawan gravitasi.

OOP itu bukan aturan kaku. Tapi alat bantu.
Dia bukan wajib—tapi kalau kamu serius mau bikin program yang tumbuh besar,
dia jadi kebutuhan.

Karena pada akhirnya, kamu bukan cuma sedang menulis kode.
Kamu sedang membangun sistem, yang mungkin suatu hari harus kamu kembangkan, serahkan ke tim lain, atau debug dalam waktu mepet deadline.

Dan percaya deh, saat itu tiba…
...kamu bakal bersyukur pernah kenal OOP.

Karena Kode Bukan Sekadar Jalan, Tapi Perlu Arah dan Kendali

Setelah ngobrol panjang di kafe, ditemani aroma kopi hitam dan coretan-coretan di tisu yang entah kenapa justru lebih masuk akal daripada buku tebal pegangan kuliah, Adi pulang dengan satu kesadaran baru.

Selama ini, ia merasa "asal kodenya jalan, ya udah cukup."
Tapi ternyata... nggak sesederhana itu.

Ngoding itu bukan soal banyaknya baris kode yang kamu ketik,
Tapi gimana kamu menyusunnya.

Karena pada akhirnya, kode bukan cuma untuk komputer.
Komputer sih nggak peduli kamu pakai nama variabel x, y, atau data_final_final_fix123.
Tapi manusia peduli. Termasuk kamu sendiri, tiga minggu dari sekarang, saat harus revisi sistem yang kamu bangun dengan mata setengah ngantuk dan deadline mepet.

Dengan OOP, kamu gak cuma ngoding buat hari ini.
Kamu sedang menanam struktur—fondasi—yang bisa kamu bangun pelan-pelan.
Yang bisa kamu ajak tumbuh.
Yang bisa kamu wariskan ke rekan timmu, atau bahkan ke dirimu sendiri di masa depan.

OOP ngajarin kamu berpikir sebagai arsitek sistem, bukan tukang tambal kode.

Kamu jadi tahu siapa bertanggung jawab atas apa.
Kamu gak lagi bingung, "fungsi ini ngapain ya?"
Kamu bisa lihat struktur programmu kayak rumah yang kamu desain sendiri—rapi, teratur, dan punya alur logika yang enak diikuti.

Dan satu hal penting lagi:
OOP bukan cuma alat teknis. Dia mengubah cara kamu berpikir.
Kamu mulai membayangkan masalah dalam bentuk objek nyata.
Kamu mulai fokus pada peran, bukan cuma proses.

Adi kini tahu: ngoding bukan hanya soal menyuruh komputer melakukan sesuatu.
Tapi soal membangun dunia logika yang masuk akal.

Karena ngoding tanpa OOP, itu kayak nyetir tanpa setir:

Bisa sih… tapi mau belok ke mana?
Dan kalau tiba-tiba harus ngerem mendadak atau ganti rute—kamu siap?

Dan pada akhirnya, Adi sadar:
Bukan seberapa cepat kamu bisa menulis kode,
Tapi seberapa jauh dan stabil kamu bisa melaju dengannya.

Karena kode yang baik bukan yang cepat selesai—
Tapi yang bisa terus berjalan, bahkan saat kamu nggak lagi jadi satu-satunya pengemudi.

Diperbarui pada 24 June 2025