Apa yang membuat pemrograman berorientasi objek berhasil? [Tutup]

17

Apa fitur itu menurut Anda yang membuat pemrograman berorientasi objek jauh lebih sukses?

  1. Pesan Berlalu
  2. Warisan
  3. Polimorfisme
  4. Enkapsulasi

Atau fitur lain yang mungkin ingin Anda perkenalkan.

Juga saya ingin tahu bahwa apa hubungan antara tipe data abstrak dan pemrograman berorientasi objek?

Tony
sumber
populer dan sukses tidak sama
kevin cline

Jawaban:

76

Saya menyarankan bahwa karakteristik paling penting dari pemrograman berorientasi objek adalah manajemen kompleksitas .

Otak manusia hanya dapat memiliki begitu banyak konsep dalam satu waktu - batas yang sering dikutip untuk mengingat 7 +/- 2 item independen muncul di pikiran.

Ketika saya bekerja pada sistem 600kloc di tempat kerja, saya tidak bisa menyimpan semuanya di kepala saya sekaligus. Jika saya harus melakukan itu, saya akan dibatasi untuk bekerja pada sistem yang jauh lebih kecil.

Untungnya, saya tidak harus melakukannya. Berbagai pola desain dan struktur lain yang telah kami gunakan pada proyek itu berarti bahwa saya tidak harus berurusan dengan seluruh sistem sekaligus - saya dapat mengambil masing-masing bagian dan mengerjakannya, mengetahui bahwa mereka cocok dengan aplikasi yang lebih luas dengan cara yang jelas.

Semua konsep OO penting menyediakan cara untuk mengelola kompleksitas.

Enkapsulasi - izinkan saya berurusan dengan API eksternal yang memberi saya berbagai layanan, tanpa khawatir bagaimana layanan itu diterapkan.

Abstraksi - izinkan saya berkonsentrasi pada karakteristik esensial dan mengabaikan yang tidak relevan.

Komposisi - izinkan saya menggunakan kembali komponen yang telah dibangun dalam kombinasi baru

Polimorfisme - izinkan saya meminta layanan tanpa khawatir tentang bagaimana benda yang berbeda dapat menyediakannya dengan cara yang berbeda.

Warisan - izinkan saya menggunakan kembali antarmuka atau implementasi, hanya menyediakan bagian-bagian yang berbeda dari apa yang telah terjadi sebelumnya.

Prinsip Tanggung Jawab Tunggal - menjaga agar tujuan setiap objek tetap jelas dan ringkas, sehingga mudah untuk dipikirkan

Prinspitusi Substitusi Liskov - jangan saling perangkap dengan memperkenalkan dependensi ganjil

Prinsip Terbuka / Tertutup - mari izinkan ekstensi dan modifikasi dengan cara yang tidak mengharuskan kita mengambil risiko melanggar kode yang ada

Ketergantungan Injeksi - mari kita komposisi ke tingkat berikutnya dan merakit komponen bersama-sama nanti.

Pengembangan berorientasi antarmuka - mari kita abstraksi ke tingkat berikutnya dan hanya bergantung pada abstraksi, tidak pernah pada implementasi konkret.

Bevan
sumber
6
+1. Saya hanya bisa memilih sekali, yang memalukan ini lebih pantas.
Richard
1
Ada akibatnya, ini memalukan saya tidak dapat menemukan referensi sekarang tapi saya akan mencoba untuk mengingat untuk mencari dan mengedit komentar. Jadi sebuah studi praktik tinjauan kode menemukan bahwa tinjauan kode cenderung memakan waktu lebih lama untuk menemukan bug dalam kode OO daripada kode prosedural, karena alirannya lebih banyak berputar dalam kode OO. Praktik seperti TDD dan pemrograman pasangan mengurangi itu, tapi itu masih merupakan hasil yang menarik (dan bagi saya, tidak terduga).
5
Ini mungkin jawaban yang sempurna - informasi lengkap, namun cukup singkat sehingga pembaca tidak perlu membaca novel. Bravo
Tim Claason
@ Graham Lee: Saya akan tertarik membaca studi itu.
Frank Shearar
13

Antarmuka pengguna grafis. Pada akhir tahun delapan puluhan, awal tahun sembilan puluhan, ketika Mac, Amigas, Atari STs, Windows dan GEM mulai mengganti antarmuka pengguna berbasis karakter, menjadi jelas bahwa bahasa seperti C tidak cocok untuk menulis program GUI. Sementara pemrosesan data tradisional dianggap sebagai skema "input data -> pemrosesan -> data keluaran", yang dapat dilakukan dalam bahasa prosedural juga, fitur OO berguna untuk menangani kompleksitas yang melekat pada GUI.

pengguna281377
sumber
1
+1 untuk menyebutkan aplikasi GUI. Orientasi objek adalah alat yang memungkinkan untuk mengimplementasikan GUI, yang sebaliknya (dengan kode prosedural) cukup sulit untuk dikelola.
Giorgio
7

Menyembunyikan Data disediakan oleh Enkapsulasi.


sumber
Ini jawabannya? ADT menyediakan penyembunyian data (itulah sebabnya mereka disebut "abstraksi data")
Frank Shearar
@ Terus terang, Dia meminta fitur spesifik dan ketika saya menulis jawaban ini, hanya ada satu yang lain dan saya berusaha untuk tidak menggandakan.
Cukup adil, tetapi enkapsulasi tidak persis khusus untuk OO. Saya harus memeriksanya sendiri, tetapi saya cukup yakin kami melakukan enkapsulasi jauh sebelum OO.
Frank Shearar
1
@ Sejujurnya, saya setuju itu tidak khusus untuk OO, itu hanya salah satu fitur utamanya.
Itu berlaku untuk sebagian besar OOPL, tetapi tidak semua. CLOS adalah pengecualian penting.
Frank Shearar
7

Fitur yang belum disebutkan oleh jawaban lain: pemodelan domain . Karena orang cenderung berpikir tentang melakukan sesuatu dengan atau ke objek, dan tentang objek yang memiliki sifat intrinsik, sangat mudah untuk memodelkan masalah atau alur kerja menggunakan perangkat lunak berorientasi objek. Pada dasarnya, ini memungkinkan kita untuk menggunakan kemampuan yang ada untuk menangani kata benda, kata kerja, dan kata sifat dalam kode.


sumber
6

Saya pikir warisan adalah poin terpenting dari OOP.

[dari pengembangan game] Anda dapat membuat sesuatu seperti kelas Drawable, dengan merender metode dan atribut, dan membuat kelas Spaceship dan Planet, yang diturunkan dari Drawable. Ambil semua objek dari [dan anak Sprite lainnya] lainnya, masukkan drawableObjArray dan panggil metode draw untuk setiap objek. Anda hanya perlu tahu bahwa itu Drawable.

JulioC
sumber
2
Betulkah?? Polimorfisme WAY lebih penting dan tidak memerlukan warisan (dari sudut pandang teoritis).
Thomas Eding
Bahkan tidak memerlukan fungsi virtual cukup gunakan pointer fungsi.
Calmarius
1
Konsep asli Alan Kay tentang OO bahkan tidak memasukkan warisan karena dia tidak suka bagaimana itu diterapkan dalam sistem sebelumnya.
Michael Borgwardt
3

Abstraksi

Memberikan layanan yang diperlukan menyembunyikan hal-hal yang tidak perlu. Lihat penjelasan saya di sini- Apa itu abstraksi?

Gulshan
sumber
Typo: "Absraction" seharusnya "Abstraction"
Vetle
2

Ini agak sukses karena mendorong penggunaan organisasi pikiran manusia menjadi benda. Orang umumnya pandai melihat hubungan hal-hal - hal-hal seperti perbedaan, persamaan dan perilaku. OO mendorong pengembangan perangkat lunak untuk meniru konseptualisasi manusia di dunia.

Membuat pengembangan perangkat lunak mirip dengan cara kita memandang dunia membuatnya lebih mudah bagi pikiran kita untuk menangani kerumitan.

Tim
sumber
Mungkin itu karena lebih banyak pengalaman dengan prosedural, tetapi setelah menggunakan kedua metode, saya masih menemukan prosedural lebih intuitif untuk dilakukan daripada OOP. Saya masih suka bagian yang baik dari kedua gaya.
Juha Untinen
1

" ADT vs objek " telah diminta beberapa kali di sini. Jawaban satu-baris adalah "ADT dan objek adalah kebalikan dari satu sama lain - apa yang satu abstrak tidak bisa dengan yang lain; masing-masing memungkinkan fleksibilitas dengan cara yang berbeda."

Untuk jawaban yang lebih lama, lihat Abstraksi Data Pemahaman William Cook , Diperoleh Kembali . Secara singkat, objek memungkinkan Anda untuk dengan mudah menggunakan beberapa implementasi / representasi dari beberapa datum (sesuatu yang terlihat seperti daftar bisa berupa array, atau pohon penyeimbang sendiri, atau ...) tetapi membuatnya sulit untuk menambahkan operasi baru (karena Anda harus menambahkan operasi baru ke masing-masing representasi Anda), sementara ADT memudahkan untuk menambahkan operasi baru pada tipe data Anda, tetapi membuatnya sulit untuk memiliki beberapa implementasi.

Sunting: Saya telah mengatakan bahwa pesan yang lewat adalah yang membuat OO sukses. Berdasarkan komentar Jonas, itu tidak benar, karena sebagian besar bahasa yang orang anggap OO tidak menggunakan passing pesan. Karena itu tidak benar, saya mengambilnya dari jawaban saya.

Frank Shearar
sumber
1
Melewati pesan tidak bisa menjadi jawaban karena tidak ada bahasa OOP sukses yang menggunakannya.
Jonas
OO Anda belum tentu menjadi OO saya. Dan sebagian besar bahasa yang disebut OO tidak, menurut definisi Alan Kay. Saya lupa kutipan yang tepat, tetapi Kay mengatakan bahwa objek bukan yang penting tentang Smalltalk, tetapi pesan-lewat (dan yang paling tidak terjawab saat ini).
Frank Shearar
@Jonas Saya kira, setelah membaca ulang pertanyaan dan jawaban saya, bahwa saya setengah mengatakan "OO tidak berhasil, karena begitu sedikit bahasa yang melakukannya dengan benar." Tapi aku hanya mengatakan hal-hal seperti itu ketika aku mengenakan setelan tahan api.
Frank Shearar
0

Tiga fitur teratas saya. Komposisi Objek - memungkinkan objek untuk berkolaborasi. Polimorfisme - mendukung perilaku dinamis saat runtime. Warisan - dengan menggunakan kembali kode dan memodifikasi perilaku melalui metode yang menimpa.

ADT - Anda dapat memilikinya bahkan dalam bahasa yang tidak berorientasi objek seperti Pascal. Tumpukan atau antrian adalah contoh ADT.

StartClass0830
sumber
"ADT - Anda dapat memilikinya bahkan dalam bahasa yang tidak berorientasi objek seperti Pascal. Tumpukan atau antrian adalah contoh dari ADT.": True. Tetapi OOP membuatnya lebih mudah untuk mendefinisikan antarmuka dari ADT dan menyediakan implementasi yang berbeda dan dapat dipertukarkan (kelas antarmuka / abstrak <---> subkelas / kelas beton). Sejauh yang saya tahu itu tidak semudah di Pascal.
Giorgio
0

dengan kata sederhana OOP adalah kunci untuk re-usability dan enkapsulasi yang menghasilkan produksi kerangka kerja besar yang membuat hidup lebih mudah bagi programmer di era ini karena hanya dapat memanggil API dan melakukan hari apa yang paling sering diinginkan.

karena pertanyaan Anda adalah tentang 4 fitur OOP sehingga Anda dapat mengatakan

  1. Warisan dan 4. Enkapsulasi adalah fitur yang paling penting dan dua lainnya sangat diperlukan untuk mencapai dua yang pertama

jadi 1. Passing Pesan dan 3. Polimorfisme sebenarnya mendukung 2. Warisan dan 4. Enkapsulasi.

  1. Warisan dan 4. Enkapsulasi adalah kunci keberhasilan OOP
Badr uz Zaman
sumber
pewarisan tidak diperlukan, komponen yang menentukan, atau bahkan bagian yang sangat diinginkan dari OOP sebagian besar waktu. enkapsulasi adalah prinsip yang baik untuk pemrograman secara umum. itu tidak ditemukan oleh OOP dan itu tidak hanya digunakan dalam OOP.
sara
-1

Menurut pendapat saya, tiga fitur terakhir adalah yang paling penting yang mempengaruhi penggunaan OOP secara luas:

2. Inheritance
3. Polymorphism
4. Encapsulation

Sunting: Poin lain adalah IDE dan lingkungan pengembangan antarmuka grafis seperti Visual studio dan Eclipse. Karena mereka merangkul bahasa OOP, maka semakin banyak desain cenderung ke arah OOP.

Dan tentu saja Prinsip SOLID adalah yang pernah membuat produk-produk perangkat lunak ROCK solid disampaikan :)

Yusubov
sumber