Dari blog Anda, tampaknya Anda terbiasa dengan pemrograman imperatif dan fungsional, dan bahwa Anda terbiasa dengan konsep dasar yang terlibat dalam pemrograman berorientasi objek, tetapi Anda tidak pernah benar-benar memilikinya "klik" untuk apa membuatnya bermanfaat. Saya akan mencoba menjelaskan dalam hal pengetahuan itu, dan berharap itu membantu Anda.
Pada intinya, OOP adalah cara untuk menggunakan paradigma imperatif untuk mengelola kompleksitas tingkat tinggi dengan lebih baik dengan menciptakan struktur data "pintar" yang memodelkan domain masalah. Dalam program (berorientasi prosedural non-objek) standar, Anda punya dua hal dasar: variabel, dan kode yang tahu apa yang harus dilakukan dengan mereka. Kode mengambil input dari pengguna dan berbagai sumber lain, menyimpannya dalam variabel, beroperasi di atasnya, dan menghasilkan data keluaran yang masuk ke pengguna atau berbagai lokasi lainnya.
Pemrograman berorientasi objek adalah cara untuk menyederhanakan program Anda dengan mengambil pola dasar itu dan mengulanginya dalam skala yang lebih kecil. Sama seperti sebuah program adalah kumpulan besar data dengan kode yang tahu apa yang harus dilakukan dengannya, setiap objek adalah sepotong kecil data yang terikat pada kode yang tahu apa yang harus dilakukan dengannya.
Dengan memecah domain masalah menjadi potongan-potongan kecil dan memastikan sebanyak mungkin data terikat langsung ke kode yang tahu apa yang harus dilakukan dengan itu, Anda membuatnya lebih mudah untuk alasan tentang proses secara keseluruhan dan juga tentang sub- masalah yang membentuk proses.
Dengan mengelompokkan data ke dalam kelas objek, Anda dapat memusatkan kode yang terkait dengan data itu, membuat kode yang relevan lebih mudah ditemukan dan di-debug. Dan dengan merangkum data di belakang penentu akses dan hanya mengaksesnya melalui metode, (atau properti, jika bahasa Anda mendukungnya), Anda sangat mengurangi potensi korupsi data atau pelanggaran invarian.
Dan dengan menggunakan warisan dan polimorfisme, Anda dapat menggunakan kembali kelas yang sudah ada, menyesuaikannya agar sesuai dengan kebutuhan spesifik Anda, tanpa harus memodifikasi yang asli atau menulis ulang semuanya dari bawah ke atas. (Itu adalah hal yang tidak boleh kamu lakukan , jika kamu bisa menghindarinya.) Berhati-hatilah kamu mengerti objek dasar kamu, atau kamu bisa berakhir dengan kanguru pembunuh .
Bagi saya, ini adalah prinsip dasar pemrograman berorientasi objek: manajemen kompleksitas, pemusatan kode dan pemodelan masalah-domain yang ditingkatkan melalui penciptaan kelas objek, pewarisan dan polimorfisme, dan peningkatan keamanan tanpa mengorbankan kekuatan atau kontrol melalui penggunaan enkapsulasi dan properti. Saya harap ini membantu Anda memahami mengapa begitu banyak programmer menganggapnya berguna.
EDIT: Menanggapi pertanyaan Joel di komentar,
Bisakah Anda menjelaskan apa yang mengandung "program berorientasi objek" (selain definisi mewah yang telah Anda uraikan) yang secara fundamental berbeda dari program imperatif? Bagaimana Anda "membuat bola bergulir?"
Penafian kecil di sini. Model "program berorientasi objek" saya pada dasarnya adalah model Delphi, yang sangat mirip dengan model C # /. NET karena dibuat oleh mantan anggota tim Delphi. Apa yang saya katakan di sini mungkin tidak berlaku, atau tidak berlaku banyak, dalam bahasa OO lainnya.
Program berorientasi objek adalah program di mana semua logika disusun di sekitar objek. Tentu saja ini harus di-boot di suatu tempat. Program Delphi khas Anda berisi kode inisialisasi yang membuat objek singleton yang disebut Application. Pada awal program, ia memanggil Application.Initialize, lalu panggilan ke Application.CreateFormuntuk setiap bentuk yang ingin Anda muat ke dalam memori dari awal, dan kemudian Application.Run,yang menampilkan formulir utama di layar dan memulai input / event loop yang membentuk inti dari setiap program komputer interaktif.
Aplikasi dan polling formulir Anda untuk acara yang masuk dari OS dan menerjemahkannya menjadi panggilan metode pada objek Anda. Satu hal yang sangat umum adalah penggunaan event handler, atau "delegate" di .NET-speak. Objek memiliki metode yang mengatakan, "lakukan X dan Y, tetapi juga periksa untuk melihat apakah event handler khusus ini ditugaskan, dan panggil jika ada." Event handler adalah penunjuk metode - penutupan yang sangat sederhana yang berisi referensi ke metode dan referensi ke instance objek - yang digunakan untuk memperluas perilaku objek. Misalnya, jika saya memiliki objek tombol pada formulir saya, saya menyesuaikan perilakunya dengan melampirkan pengendali event OnClick, yang menyebabkan beberapa objek lain mengeksekusi metode ketika tombol diklik.
Jadi dalam program berorientasi objek, sebagian besar pekerjaan dilakukan dengan mendefinisikan objek dengan tanggung jawab tertentu dan menghubungkannya bersama-sama, baik melalui pointer metode atau dengan satu objek secara langsung memanggil metode yang didefinisikan dalam antarmuka publik objek lain. (Dan sekarang kita kembali ke enkapsulasi.) Ini adalah gagasan bahwa saya tidak memiliki konsep kembali sebelum saya mengambil kelas OOP di perguruan tinggi.