Tentang Pemrograman Berorientasi Objek

Pemrograman berorientasi objek diyakini didasarkan pada tiga pilar yang memberikan programmer dengan keunggulan dibandingkan pendekatan prosedural. Mereka adalah enkapsulasi, pewarisan, dan polimorfisme.Warisan memungkinkan Anda untuk secara signifikan menyingkirkan duplikasi kode saat menggunakan pendekatan berorientasi objek. Tetapi dengan menggunakannya, Anda harus selalu ingat tentang salah satu prinsip SOLID, yang disebut Pergantian Liskov, yang, kecuali jika Anda merinci, menyatakan bahwa pewarisan harus digunakan hanya sebagai implementasi dari hubungan "apa adanya". Artinya, kelas keturunan harus "menjadi" subspesies induk. Misalnya, Anda mungkin memiliki kelas Burung dan subkelasnya Sparrow (burung pipit) dan Raven (gagak), yang, misalnya, mewarisi (dan dapat memperluas atau memodifikasi) metode terbang. Namun, jika Anda membuat keturunan Burung yang disebut Penguin (penguin) dan metode lalatnya, misalnya, melempar pengecualian (karena penguin tidak terbang), ini akan melanggar prinsip Pergantian Liskov. Berbicara tentang warisan,Perlu juga disebutkan satu prinsip penting yang dianut oleh Geng Empat (Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides) dalam bukunya Pola Desain: Elemen Perangkat Lunak Berorientasi Objek yang Dapat Digunakan Kembali (1994), yang menyatakan bahwa Anda harus mencoba gunakan komposisi (ketika satu objek "mengandung" objek lain) alih-alih mewarisi sebanyak mungkin. Sebenarnya, banyak dari pola desain yang ditemukan oleh "Geng Empat" justru didasarkan pada prinsip ini.Sebenarnya, banyak dari pola desain yang ditemukan oleh "Geng Empat" justru didasarkan pada prinsip ini.Sebenarnya, banyak dari pola desain yang ditemukan oleh "Geng Empat" justru didasarkan pada prinsip ini.

Secara umum, dalam praktiknya, pewarisan digunakan untuk tidak mengatakannya terlalu sering, walaupun pada kenyataannya kebanyakan programmer yang baik menggantinya dengan komposisi. Lebih sering ada beberapa implementasi dari satu antarmuka, yang ditetapkan sebagai dependensi di kelas klien. Yang pada gilirannya memungkinkan Anda untuk menggunakan pilar kedua OOP - polimorfisme. Yang memungkinkan Anda untuk melewati implementasi dependensi berbeda ke kode klien. Karena kenyataan bahwa dependensi yang ditransmisikan memiliki antarmuka yang sama, klien (tergantung pada antarmuka) tidak peduli objek apa yang datang kepadanya dan ini memungkinkan programmer untuk mengubah, selama pelaksanaan program, dengan cara apa (implementasi antarmuka) tugas akhir apa yang akan diselesaikan. Berbicara tentang OOP, orang tidak bisa tidak menyebutkan enkapsulasi. Ini adalah elemen penting dari OOP,yang menyediakan kemampuan untuk membuat abstraksi untuk menyembunyikan detail implementasi tingkat rendah sambil mengurangi kompleksitas pengembangan. Detail implementasi disembunyikan oleh pengubah akses ke metode seperti pribadi dan dilindungi. Saat membuat kelas, Anda perlu membuatnya sehingga antarmuka mereka (metode publik yang dapat diakses) memberikan abstraksi yang konsisten,selain itu tidak lagi OOP (!) . Sebagai contoh, mari kita asumsikan bahwa kita sedang mengembangkan program yang mengontrol sistem pendingin reaktor nuklir. Maka abstraksi yang disepakati dari antarmuka dapat terlihat sebagai berikut.

CoolingSystem::getTemperature()
CoolingSystem::SetCirculationRate($rate)
CoolingSystem::OpenValve($valveNumber)
CoolingSystem::CloseValve($valveNumber)

Berkat antarmuka ekspresif pendek yang membentuk abstraksi yang koheren, kami dapat bekerja dengan sistem pendingin reaktor tanpa memiliki sedikit pun gagasan tentang detail implementasi tingkat rendah yang merupakan karakteristik dari teknologi yang dipilih. Penggunaan abstraksi dapat secara signifikan mengurangi kompleksitas sistem yang dikembangkan. Dan perjuangan melawan kompleksitas adalah keharusan teknis utama pembangunan. Berikut adalah beberapa contoh abstraksi yang konsisten:

Sistem kontrol kecepatan:

  • Atur kecepatan
  • Dapatkan pengaturan saat ini
  • Kembalikan nilai kecepatan sebelumnya
  • Nonaktifkan sistem

Penggiling kopi:

  • Memungkinkan
  • Mematikan
  • Atur kecepatan
  • Mulai menggiling kopi
  • Berhenti menggiling kopi

Tangki bahan bakar:

  • Isi tangki bahan bakar
  • Tiriskan bahan bakar
  • Dapatkan kapasitas tangki bahan bakar
  • Dapatkan status tangki bahan bakar

Lampu:

  • Memungkinkan
  • Mematikan

Saat mendesain antarmuka suatu objek, nyatakan publik hanya metode yang perlu dikelola klien, sembunyikan yang lainnya. Akibatnya, Anda harus mendapatkan kotak hitam, perangkat yang bisa Anda lupakan setelah kode kelas ditambahkan. Pendekatan ini dapat secara signifikan mengurangi kompleksitas sistem yang dikembangkan.

All Articles