Mengapa warisan, enkapsulasi, dan polimorfisme bukan pilar OOP? [Tutup]

16

Suatu hari saya pergi ke obrolan Stack Overflow dan melihat frasa, yang menyatakan bahwa warisan, inkapsulasi dan polimorfisme adalah pilar OOP (dalam arti bahwa mereka fundamental, satu-satunya konstruksi).

Juga, ada pertanyaan serupa, yang sering saya tanyakan pada ujian perguruan tinggi dan wawancara kerja, dan jawaban yang benar selalu adalah pernyataan yang diucapkan dalam judul pertanyaan ("Ya, warisan, enkapsulasi, dan polimorfisme adalah pilar OOP ).

Tetapi dalam obrolan Stack Overflow saya sangat diejek, peserta sangat tidak setuju dengan pernyataan seperti itu. Jadi, apa yang salah dengan pernyataan ini?

Apakah programmer tampaknya dilatih dalam hal-hal yang berbeda di perguruan tinggi pasca-Soviet dan Amerika Serikat?

Apakah warisan, enkapsulasi, dan polimorfisme tidak dianggap sebagai pilar OOP oleh programmer AS / Inggris?

PaulD
sumber
7
Pertanyaan Anda tidak memiliki konteks; kami tidak tahu apa yang dipikirkan orang-orang dalam obrolan SO, atau apa yang mereka tanggapi. Mungkin Anda dapat menautkan ke percakapan di ruang obrolan, sehingga kami dapat melihatnya? Yang mengatakan, saya pikir ini paling baik diselesaikan di ruang obrolan, daripada di sini.
Robert Harvey
1
@ Robert, sudah terlalu banyak waktu berlalu. Saya ragu apakah saya dapat menemukan tautan ke percakapan sama sekali. Tetapi saya setuju bahwa konteks itu penting. Bukan untuk menyalahkan seseorang, atau untuk menampilkan diri sebagai korban tidak bersalah dari agresi obrolan, saya hanya ingin tahu yang sebenarnya.
PaulD
5
Lobi. Apakah Anda mengenakan setelan tahan api Anda terlebih dahulu?
Robert Harvey
1
Satu-satunya makna yang dapat saya berikan untuk kalimat adalah "Anda dapat memiliki OOP tanpa salah satu dari mereka" (benar, tetapi tidak masuk akal setidaknya untuk enkapsulasi) atau "Anda dapat menggunakannya di luar OOP juga", atau sesuatu seperti itu.
SJuan76
2
Imo OO hanya memiliki satu pilar dan itu adalah: "Negara". Begitu otak Anda berpikir dalam keadaan Anda mendapatkan OO.
Pieter B

Jawaban:

40

Apakah warisan, enkapsulasi, dan polimorfisme tidak dianggap sebagai pilar OOP oleh programmer AS / Inggris?

Mereka dianggap sebagai pilar oleh banyak programmer, dan banyak perguruan tinggi mengajarkan OO seperti itu.

Sayangnya, ini juga merupakan pandangan picik.

  • Warisan hanyalah satu mekanisme yang digunakan untuk mengimplementasikan OOP dan dapat disalahgunakan untuk tidak melakukan OOP.
  • Enkapsulasi adalah konsep, berguna untuk pemrograman segala macam, OOP dan tidak.
  • Polimorfisme adalah ... sifat (?) Untuk menggambarkan bagaimana komputasi berperilaku. Ada banyak cara untuk mencapai polimorfisme, tidak semuanya spesifik OO.

OOP memiliki sedikit fondasi, karena pada kenyataannya, ini sangat konseptual: "Pendekatan desain program Anda dengan memikirkan sesuatu sebagai objek - kumpulan data dan fungsionalitas yang kohesif."

Dan sementara desain program modern mengambil pandangan buruk melakukan hal-hal dalam "mode OO murni", sebagian besar programmer terampil akan setuju bahwa prinsip-prinsip SOLID (atau beberapa bagian) adalah kandidat yang lebih baik untuk "pilar Pemrograman Berorientasi Objek" (meskipun mereka berlaku baik untuk non-OOP). Ini sama sekali tidak bekerja dengan ketentuan-ketentuan ini. Alih-alih mereka menggunakan konsep entitas perangkat lunak (yang objeknya satu), antarmuka (yang C # / Java / dll interfaceadalah satu), abstraksi dan sub-pengetikan (yang, pewarisan adalah satu bentuk).

Telastyn
sumber
10
Jawaban yang layak untuk pertanyaan yang pada dasarnya tidak dapat dijawab.
Robert Harvey
3
Apakah OOP ada?
Tulains Córdova
5
Saya berpendapat bahwa hanya enkapsulasi adalah "pilar" OOP. Perbedaan terbesar antara OOP dan pemrograman struktural adalah gagasan bahwa objek mengandung kode dan data, bukan hanya data (misalnya, struct C klasik). Dua konsep lainnya terutama digunakan dalam bahasa OO, tetapi tidak terbatas pada OO atau diminta olehnya.
3
@Snowman Enkapsulasi juga tidak terbatas pada OOP. Orang-orang mengimplementasikan tipe data abstrak dalam bahasa C dan fungsional setiap saat.
Doval
2
Dan @ JörgWMittag memiliki jawaban yang bagus sehubungan dengan pengiriman pesan. Ide perpesanan tentu membutuhkan enkapsulasi. Pesan biasanya diteruskan ke fungsi atau metode pada objek, yang kemudian bertindak pada keadaan yang diringkas di dalamnya. Itu bukan untuk mengatakan bahwa bahasa non-OO tidak dapat memiliki penyampaian pesan atau enkapsulasi juga, hanya bahwa ini adalah ide-ide dasar dari OOP.
23

tl; dr: Anda dapat memiliki warisan tanpa OO, Anda dapat memiliki enkapsulasi tanpa OO, Anda dapat memiliki polimorfisme tanpa OO, Anda bahkan dapat memiliki ketiganya sekaligus tanpa OO. Di flipside, Anda dapat memiliki OO tanpa warisan. Plus, ada berbagai jenis enkapsulasi (berorientasi ADT dan OO), TKI tidak semua enkapsulasi adalah OO.

Versi panjang:

Istilah "Pemrograman Berorientasi Objek" diciptakan oleh Alan Kay, jadi dia harus memutuskan apa artinya. Dan dia mendefinisikannya seperti ini :

OOP bagi saya hanya berarti pengiriman pesan, penyimpanan lokal dan perlindungan dan menyembunyikan proses negara, dan sangat mengikat semua hal.

Dari segi implementasi, olahpesan adalah panggilan prosedur yang terikat akhir, dan jika panggilan prosedur terlambat, maka Anda tidak dapat mengetahui pada waktu desain apa yang akan Anda panggil, sehingga Anda tidak dapat membuat asumsi tentang representasi konkret negara. Jadi, sebenarnya ini tentang pesan, keterlambatan mengikat adalah implementasi dari pesan dan enkapsulasi adalah konsekuensi dari itu.

Dia kemudian mengklarifikasi bahwa " Gagasan besar adalah 'pesan' ", dan menyesal telah menyebutnya "berorientasi objek" daripada "berorientasi pesan", karena istilah "berorientasi objek" menempatkan fokus pada hal yang tidak penting (objek ) dan mengalihkan perhatian dari apa yang benar-benar penting (olahpesan):

Hanya pengingat lembut bahwa saya bersusah payah di OOPSLA terakhir untuk mencoba mengingatkan semua orang bahwa Smalltalk bukan hanya BUKAN sintaks atau perpustakaan kelas, bahkan bukan tentang kelas. Saya minta maaf karena saya telah lama menciptakan istilah "objek" untuk topik ini karena itu membuat banyak orang untuk fokus pada ide yang lebih rendah.

Gagasan besarnya adalah "pesan" - itulah inti dari Smalltalk / Squeak (dan itu adalah sesuatu yang tidak pernah sepenuhnya selesai dalam fase Xerox PARC kami). Orang Jepang memiliki kata kecil - ma - untuk "apa yang ada di antara" - mungkin padanan bahasa Inggris terdekat adalah "pengantara". Kunci dalam membuat sistem yang hebat dan dapat ditumbuhkan jauh lebih banyak untuk merancang bagaimana modul-modulnya berkomunikasi daripada apa sifat dan perilaku internal mereka. Pikirkan internet - untuk hidup, itu (a) harus memungkinkan berbagai jenis ide dan realisasi yang melampaui standar tunggal dan (b) untuk memungkinkan berbagai tingkat interoperabilitas yang aman antara ide-ide ini.

(Tentu saja, hari ini, kebanyakan orang bahkan tidak fokus pada objek tetapi pada kelas, yang bahkan lebih salah.)

Pesan adalah hal mendasar bagi OO, baik sebagai metafora maupun sebagai mekanisme.

Jika Anda mengirim pesan kepada seseorang, Anda tidak tahu apa yang mereka lakukan dengannya. Satu- satunya hal yang dapat Anda amati, adalah respons mereka. Anda tidak tahu apakah mereka memproses pesan itu sendiri (yaitu jika objek memiliki metode), jika mereka meneruskan pesan tersebut ke orang lain (delegasi / proxy), jika mereka memahaminya. Itulah enkapsulasi tentang semua, itulah tujuan dari OO. Anda bahkan tidak dapat membedakan proksi dari yang asli, asalkan merespon seperti yang Anda harapkan.

Istilah yang lebih "modern" untuk "pengiriman pesan" adalah "metode pengiriman dinamis" atau "panggilan metode virtual", tetapi itu kehilangan metafora dan berfokus pada mekanisme.

Poin-poin serupa juga dibuat dalam On Understanding Data Abstraction, ditinjau kembali oleh William R. Cook dan juga Proposal untuk Definisi Modern "Obyek" dan "Berorientasi Objek" .

Pengiriman operasi yang dinamis adalah karakteristik penting dari objek. Ini berarti bahwa operasi yang akan dipanggil adalah properti dinamis dari objek itu sendiri. Operasi tidak dapat diidentifikasi secara statis, dan secara umum tidak ada cara tepat untuk operasi apa yang akan dijalankan sebagai tanggapan terhadap permintaan yang diberikan, kecuali dengan menjalankannya. Ini persis sama dengan fungsi kelas satu, yang selalu dikirim secara dinamis.

Di Smalltalk-72, bahkan tidak ada benda! Ada hanya aliran pesan yang mendapat diurai, ditulis ulang dan dialihkan. Pertama datang metode (cara standar untuk mengurai dan mengubah rute aliran pesan), kemudian datang objek (pengelompokan metode yang berbagi beberapa keadaan pribadi). Warisan datang jauh kemudian, dan kelas hanya diperkenalkan sebagai cara untuk mendukung warisan. Seandainya kelompok riset Kay sudah tahu tentang prototipe, mereka mungkin tidak akan pernah memperkenalkan kelas sejak awal.

Setiap programmer harus membaca Tentang Memahami Abstraksi Data, Revisited . Ini menjelaskan secara rinci apa perbedaan sebenarnya antara Objek dan Tipe Data Abstrak. Dia memberikan contoh menggunakan Java, dan yang sangat relevan dengan pertanyaan ini, karena di kedua contoh ADT dan contoh Object ia menggunakan pewarisan, enkapsulasi dan polimorfisme, tetapi hanya satu contoh adalah object-oriented! Dengan kata lain: Anda dapat memiliki warisan, enkapsulasi, dan polimorfisme, Anda bahkan dapat memiliki ketiganya sekaligus dan masih belum memiliki OO.

Di sisi lain, Anda dapat memiliki OO tanpa warisan. Seperti yang saya sebutkan di atas: versi asli Smalltalk (bahasa yang dirancang oleh Alan Kay, penemu istilah "Pemrograman Berorientasi Objek") tidak memiliki warisan.

Terakhir, tetapi tentu tidak kalah pentingnya, The Treaty of Orlando membahas delegasi sebagai alternatif pewarisan dan bagaimana berbagai bentuk pendelegasian dan pewarisan mengarah pada titik desain berbeda dalam ruang desain bahasa yang berorientasi objek. (Perhatikan bahwa sebenarnya bahkan dalam bahasa yang mendukung warisan, seperti Java, orang sebenarnya diajarkan untuk menghindarinya, sekali lagi menunjukkan bahwa itu tidak perlu untuk OO.)

Jörg W Mittag
sumber
Anda dapat memiliki "warisan", "polimorfisme" dan "warisan" ... methinks ada kesalahan ketik di sana di suatu tempat :)
slebetman
1
Jawaban ini membuat saya berharap kita dapat jawaban 'favorit' juga.
Chan-Ho Suh
Definisi Alan Kay sudah usang. OO membutuhkan pewarisan, dan jika Anda dapat melakukan penjilidan run-time dan compile-time seperti pada C ++, Anda mendapatkan kinerja yang setara dengan C juga.
Erik Alapää
Tidak, definisinya adalah yang benar. Anda sama sekali tidak membutuhkan warisan untuk menjadi OO. Bahasa prototipe tidak menggunakan pewarisan seperti C ++ dan mereka masih OO. Warisan hanya digunakan untuk mengimplementasikan penggunaan kembali kode, itu bahkan bukan cara terbaik, ada banyak bahasa yang lebih baik yang memiliki mixin, misalnya. Ini juga tidak ada hubungannya dengan penjilidan, karena Anda dapat memiliki pengiriman dinamis, bahkan dalam C ++ ketika Anda dapat menggunakan metode virtual. Kinerja tidak ada hubungannya dengan semua ini, itu adalah konsep tingkat tinggi, mereka tidak memiliki kinerja. Bahkan, Anda bisa mengimplementasikan pesan lewat C dan menjadi OO
Luiz Felipe