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?
sumber
Jawaban:
Mereka dianggap sebagai pilar oleh banyak programmer, dan banyak perguruan tinggi mengajarkan OO seperti itu.
Sayangnya, ini juga merupakan pandangan picik.
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
interface
adalah satu), abstraksi dan sub-pengetikan (yang, pewarisan adalah satu bentuk).sumber
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 :
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):
(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" .
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.)
sumber