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?
Jawaban:
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.
sumber
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.
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 disebutAnimal
" , dan mereka bahkan mungkin berakhir dengan lainnya entitas perantara sepertiMammal
danAmphibian
dalam 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.
sumber
Istilah "Orientasi Objek" diciptakan oleh Dr. Alan Kay, jadi dia adalah sumber yang berwenang tentang apa artinya, dan dia mendefinisikannya sebagai berikut :
Mari kita jabarkan:
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):
(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" .
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.)
sumber
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.
sumber