Mengapa tidak ada definisi yang konsisten tentang konsep-konsep penting untuk OOP?

12

Saya sangat baru dalam pemrograman dan agak bingung membaca \ mendengar konvensi yang berbeda dari sumber yang berbeda:

Apakah pemrograman berorientasi objek memiliki 4 atau 5 konsep?

Sebagai pendatang baru, saya mengerti ini adalah 5 konsep:

  • Abstraksi
  • Warisan
  • Enkapsulasi
  • Polimorfisme
  • Modularitas

Jadi kenapa saya tidak menemukan definisi yang lebih "ketat" dan sepertinya ada beberapa pengaturan konsep-konsep ini di luar sana?


sumber
7
Mungkin karena itu tidak seperti matematika (beberapa konsep dalam CS adalah, tapi saya pikir OOP tidak termasuk dalam kategori ini), jadi tidak ada definisi yang ketat untuk memulai. Jadi misalnya seberapa penting 'modularitas'? Apakah benar-benar istimewa untuk OOP sehingga kita harus menyebutkannya atau akankah itu hanya sesuatu yang terjadi dengan sendirinya jika kita menerapkan empat lainnya dengan benar? Beberapa daftar menambahkan 'hierarki', tetapi apakah ini benar-benar sesuatu yang ekstra atau hanya mengikuti dari pewarisan dan polimorfisme?
thorsten müller
6
Kata nasihat: Sebagai seorang programmer yang sangat baru Anda tidak harus begitu memahami terminologi dan teori. Kumpulkan pengalaman pemrograman langsung terlebih dahulu, dan akan jauh lebih jelas apa yang dibicarakan orang-orang ini.
Philipp
9
Hal lain adalah bahwa OOP berubah seiring waktu. Banyak fokus di awal C ++ hari (saya tahu OOP lebih jauh dari itu) adalah pada Warisan dan Polimorfisme. Fokus Todays jauh lebih pada Abstraksi dan Enkapsulasi.
Bent
3
Beberapa diskusi menarik tentang kurangnya ketepatan dalam definisi OO dapat ditemukan di sini: c2.com/cgi/wiki?NobodyAgreesOnWhatOoIs
MichelHenrich

Jawaban:

26

Alasan Anda menemukan penjelasan berbeda tentang arti pemrograman berorientasi objek adalah karena tidak ada orang atau organisasi yang memiliki wewenang untuk merumuskan definisi ketat yang berlaku secara universal.

Pemrograman berorientasi objek bukanlah standar ISO atau hukum ilmiah. Itu adalah filosofi. Dan seperti semua filosofi, ada semua jenis interpretasi yang berbeda dan tidak ada interpretasi yang berlaku secara universal. Ketika Anda membaca teks yang memberi tahu Anda konsep apa yang harus Anda ikuti saat merancang arsitektur perangkat lunak, Anda harus melihat ini sebagai pedoman berdasarkan pendapat yang penulis buat selama pengalaman profesional mereka, dan bukan sebagai kebenaran universal.

Philipp
sumber
12

Apakah pemrograman berorientasi objek memiliki 5 atau 4 komponen?

Seperti yang disebutkan orang lain, "OO" tidak benar-benar memiliki komponen , karena ini adalah cara berpikir tentang memodelkan solusi untuk masalah dan bukan toolkit atau serangkaian proses yang jelas.

Sebagai pendatang baru, saya mengerti ini adalah 5 komponen:

Abstraksi, Warisan, Enkapsulasi, Polimorfisme, dan Modularitas?

Warisan dan Polimorfisme adalah fitur bahasa pemrograman. Ada baiknya Anda memahami ini, tetapi ingat itu adalah alat (yang berarti, seperti halnya alat lain, mereka hanya boleh digunakan untuk memecahkan masalah tertentu, dan tidak diperlakukan sebagai tujuan atau sesuatu untuk diupayakan). Anda dapat (dan seringkali harus) menulis kode "OO" tanpa menggunakan salah satunya. Beberapa kode "OO" terbaik yang pernah saya lihat sangat sedikit menggunakan pewarisan atau polimorfisme.

Abstraksi, Enkapsulasi, dan Modularitas kurang berkaitan dengan kode dan lebih banyak tentang cara Anda melihat masalah, cara Anda mencoba memahami masalah itu, dan cara Anda merancang dan menyusun solusi Anda dalam kode.

Juga, ide-ide desain itu tidak eksklusif untuk "OO". Kemungkinannya adalah bahwa Anda mungkin memahaminya sekarang pada tingkat dasar, yang dapat mencakup kemampuan untuk menjelaskan definisi buku teks yang sempurna, dan menerapkannya pada masalah yang agak non-pribadi; Meskipun tes pemahaman yang lebih dalam diberikan masalah kompleks yang sangat besar, dan seberapa banyak kompleksitas yang bisa Anda tangani.

Tes pemahaman lainnya adalah pendekatan yang Anda gunakan untuk memecahkan masalah; dan pendatang baru ke "OO", yang sering diajarkan tentang OO dalam hal pemodelan data (karena itulah kebanyakan orang terbiasa memahaminya pada 1990-an), dan sering kali akhirnya berfokus pada aspek-aspek masalah yang salah - yaitu mereka fokus terlalu banyak pada data, dan mereka tidak cukup fokus pada perilaku.

Misalnya, contoh klasik sering menyebut entitas seperti Dog, Cat, Elephant, Seagull, Shark, dll Pendatang baru "OO" sering melihat contoh-contoh tersebut dan langsung berpikir "Oh, aku butuh sebuah entitas dasar yang disebut Animal" , dan mereka bahkan mungkin berakhir dengan lainnya entitas perantara seperti Mammaldan Amphibiandalam warisan pusaka yang rapi, dengan atribut yang berbeda di masing-masing entitas .

Sementara cara berpikir itu menunjukkan pemahaman yang sangat mendasar tentang beberapa konsep OO, seorang programmer OO yang berpengalaman tidak akan pernah mendekati seperti itu atau melompat ke kesimpulan itu (Dan benar-benar akan mengeluh bahwa mereka tidak memiliki informasi yang cukup), karena pendekatan itu menunjukkan Entity pemodelan daripada pemodelan OO, dan karena contoh yang dibuat tidak mengatakan apa-apa tentang perilaku hewan-hewan itu (Dan banyak orang akan berpendapat hari ini bahwa esensi OO adalah semua dalam perilaku dan fungsi).

Jalan untuk belajar tentang "OO" secara tradisional melibatkan menghabiskan waktu membangun abstraksi yang salah ketika Anda tidak tahu apa-apa (atau terlalu sedikit) tentang perilaku masalah yang Anda modelkan, atau ketika Anda membuat kesalahan dengan memfokuskan perhatian Anda pada entitas daripada fungsionalitas, meskipun bagian dari itu adalah karena begitu banyak buku, kursus dan tutorial online yang ditulis selama bertahun-tahun telah (salah) membimbing peserta didik di jalur itu untuk waktu yang lama (air pasang berubah meskipun).

Secara keseluruhan, banyak pemahaman Anda akan turun ke pengalaman. Konsep-konsep yang telah Anda pelajari sejauh ini adalah awal yang baik, ada lebih banyak konsep yang perlu Anda pelajari di sepanjang jalan (misalnya, prinsip-prinsip "SOLID" dan "KERING"), dan Anda harus menghabiskan waktu yang lama teori dipraktekkan dengan masalah yang sangat kompleks sebelum semuanya cenderung "klik" pada tempatnya.

Ben Cottrell
sumber
2
Seekor hiu dan katak sama-sama berenang, tetapi yang satu adalah ikan, yang lain adalah amfibi. Saya pikir contoh itu menggambarkan poin Anda dengan baik.
RubberDuck
10

Istilah "Orientasi Objek" diciptakan oleh Dr. Alan Kay, jadi dia adalah sumber yang berwenang tentang apa artinya, dan dia mendefinisikannya sebagai berikut :

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

Mari kita jabarkan:

  • olahpesan ("pengiriman metode virtual", jika Anda tidak terbiasa dengan Smalltalk)
  • proses negara seharusnya
    • dipertahankan secara lokal
    • terlindung
    • tersembunyi
  • 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 tentang pesan, keterlambatan mengikat adalah implementasi dari pesan dan enkapsulasi adalah konsekuensi dari itu.

Dia kemudian mengklarifikasi bahwa " Ide besarnya 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 membuat banyak orang fokus pada ide yang lebih rendah.

Gagasan besarnya adalah "pengiriman 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 seseorang pesan, 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), apakah mereka meneruskan pesan tersebut ke orang lain (delegasi / proxying), 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.

Jadi, ada dua cara untuk melihat definisi Alan Kay: jika Anda melihatnya berdiri sendiri, Anda mungkin mengamati bahwa pesan pada dasarnya adalah panggilan prosedur yang terikat akhir dan ikatan yang mengikat menyiratkan enkapsulasi, sehingga kita dapat menyimpulkan bahwa # 1 dan # 2 sebenarnya redundan, dan OO adalah tentang pengikatan akhir.

Namun, ia kemudian mengklarifikasi bahwa yang penting adalah olahpesan, sehingga kami dapat melihatnya dari sudut yang berbeda: olahpesan terlambat. Sekarang, jika olahpesan adalah satu - satunya hal yang mungkin, maka # 3 akan sepele benar: jika hanya ada satu hal, dan hal itu adalah keterlambatan, maka semua hal terikat terlambat. Dan sekali lagi, enkapsulasi mengikuti dari olahpesan.

Poin-poin serupa juga dibuat dalam On Understanding Data Abstraction, Revisited oleh William R. Cook dan juga Proposalnya 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.

Benjamin Pierce dalam Jenis dan Bahasa Pemrograman berargumen bahwa fitur penentu Orientasi Objek adalah Open Recursion .

Jadi: menurut Alan Kay, OO adalah tentang pesan. Menurut William Cook, OO adalah tentang pengiriman metode dinamis (yang sebenarnya adalah hal yang sama). Menurut Benjamin Pierce, OO adalah tentang Open Recursion, yang pada dasarnya berarti referensi-diri diselesaikan secara dinamis (atau setidaknya itu cara untuk memikirkannya), atau, dengan kata lain, pengiriman pesan.

Seperti yang Anda lihat, orang yang menciptakan istilah "OO" memiliki pandangan yang agak metafisik pada objek, Cook memiliki pandangan yang agak pragmatis, dan Pierce memiliki pandangan matematika yang sangat ketat. Tetapi yang penting adalah: filsuf, pragmatis, dan teoretikus semuanya setuju! Pesan adalah satu pilar OO. Titik.

Perhatikan bahwa tidak disebutkan pewarisan di sini! Warisan tidak penting untuk OO. Secara umum, sebagian besar bahasa OO memiliki beberapa cara implementasi digunakan kembali tetapi itu tidak harus warisan. Bisa juga berupa beberapa bentuk delegasi, misalnya. Bahkan, The Treaty of Orlando membahas delegasi sebagai alternatif pewarisan dan bagaimana berbagai bentuk pendelegasian dan pewarisan mengarah pada titik desain yang 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
1
@DavidArno Komentar Anda sama sekali tidak konstruktif. Alan Kay sendiri mengklaim bahwa dia menciptakan istilah "objek" untuk konsep ini (meskipun, saya kira, bukan konsep itu sendiri). Jika Anda akan bertentangan dengan otoritas terkenal tentang masalah ini, setidaknya tulislah komentar yang lebih konstruktif.
Andres F.
1
@ Davidvido Juga, apakah downvote milikmu? Jadi seseorang meluangkan waktu untuk menulis daftar komprehensif dari pandangan yang berbeda, dari para ahli terkenal, tentang apa arti OOP, dan Anda menurunkannya karena Anda tidak setuju dengan satu kalimat? Oookay.
Andres F.
2
@AndresF. Jawaban ini dapat disimpulkan sebagai "ada dua sekolah, Alan Kay, dan semua orang. Karena yang pertama menciptakan istilah dia otomatis benar dan semua orang yang tidak setuju dengan dia salah". Ini merupakan seruan untuk jawaban kekeliruan otoritas. Demikianlah downvote.
David Arno
2
Sebenarnya, jawaban ini dapat disimpulkan sebagai "ada tiga aliran pemikiran, yang berasal dari tiga sudut yang sama sekali berbeda dan tidak ada yang tidak setuju dengan siapa pun, pada kenyataannya, mereka semua sepakat." Ahli bahasa linguistik akan mengatakan, Alan Kay menciptakan istilah, dia harus mengatakan apa artinya, dan dia mengatakan itu berarti mengirim pesan. Ahli bahasa linguistik akan mengatakan, tidak, Alan Kay tidak bisa mengatakan apa-apa, kita harus melihat bagaimana istilah itu sebenarnya digunakan , dan itulah yang dilakukan Cook: dia mempelajari bahasa apa yang biasanya digambarkan sebagai OO (Java, C ++ , C #, dll.) Memiliki kesamaan, dan ia menemukan
Jörg W Mittag
3
satu hal: olahpesan. Dia mempelajari bahasa apa yang umumnya digambarkan sebagai bukan OO yang kurang memiliki bahasa yang digambarkan sebagai OO, dan dia menemukan satu hal: olahpesan. Ahli teori menara gading mengambil kalkulus λ dan melihat sekumpulan fitur terkecil yang harus ditambahkan seseorang untuk mendapatkan sesuatu yang biasanya digambarkan sebagai OO, dan ia tiba di rekursi terbuka , yang pada dasarnya merupakan blok penyusun pesan. .
Jörg W Mittag
3

Sebagai @Philipp menyatakan, akar masalahnya adalah bahwa tidak ada definisi resmi tentang apa yang membuat bahasa pemrograman berorientasi objek. Memang, ini mungkin hal yang baik. Ada banyak cara untuk mendukung pemrograman OO, masing-masing dengan kelebihan dan kekurangan mereka sendiri. Diskusi tentang bahasa mana yang lebih "murni OO" tidak benar-benar mencapai banyak hal.

Namun, melihat 5 atribut yang Anda daftarkan, menurut saya Modularitas jelas yang aneh. Modularitas sebenarnya adalah atribut dari program, bukan bahasa pemrograman. Pada tingkat linguistik, atributnya adalah "dukungan untuk modularisasi", dan yang biasanya mengambil bentuk mekanisme "modul" pr "paket".

Tetapi keberatan saya yang sebenarnya terhadap Modularitas adalah bahwa itu bukan kunci untuk pemrograman OO atau bahasa pemrograman OO, sejauh bahasa pemrograman pola dasar Smalltalk-80 tidak mendukung modul sama sekali. Dan ketika Anda memikirkannya, dukungan linguistik untuk modul di banyak OOPL banyak digunakan adalah "lemah".

Modul dirancang untuk mendukung "pemrograman dalam skala besar" ... di mana basis kode Anda menjadi terlalu besar untuk dipahami oleh satu orang. Dan Anda tidak perlu modul dalam bahasa pemrograman untuk memodulasi kode Anda.


Saya juga tidak masuk ke perdebatan tentang 4 atribut lainnya, dan apakah (misalnya) model "pewarisan" apa yang murni OO. Juga, sementara Alan Kay dikreditkan karena telah menemukan pemrograman OO, itu tidak selalu berarti bahwa definisinya tentang OO / dan OOPL memiliki keunggulan. Sudah jelas ini bukanlah kasusnya. Dia adalah seorang sumber otoritatif, tetapi ada sumber lain yang memberikan definisi lain untuk OO & OOPLs yang (dalam praktek) membawa bobot yang lebih besar.

Stephen C
sumber
2
+1 Modularitas sebenarnya diterima secara luas sebagai atribut yang diinginkan dari sebagian besar sistem perangkat lunak, terlepas dari bahasa pemrograman dan paradigma yang digunakan. Banyak bahasa yang bukan OO memiliki dukungan untuk modularisasi.
Andres F.
+1 @AndresF. komentar. Memang, "pemrograman terstruktur" dan "penyempurnaan langkah-bijaksana" (teknik untuk berpikir struktur kode) keluar dari wadah "peningkatan kompleksitas yang mengakibatkan perangkat lunak yang bahkan lebih buruk". Seandainya mendahului COBOL bahwa bahasa tidak akan memiliki reputasi negatif seperti IMHO. Dan saya memandang OO secara pragmatis sebagai struktur tingkat tinggi. Dan maksud saya tanpa struktur yang mendasari OO tidak lebih baik dari COBOL terburuk.
radarbob