Saya hanya ingin tahu, apa sebenarnya fitur yang harus disediakan oleh bahasa atau perpustakaan agar didefinisikan sebagai 'Berorientasi Objek'. Apakah Object Orientasi sesuatu yang bisa, lebih atau kurang, akan dicapai dalam setiap bahasa pemrograman tujuan umum dengan fitur yang layak? Atau apakah itu sesuatu yang hanya dapat dicapai dalam bahasa yang secara khusus mengiklankan bahwa mereka mendukung Pemrograman Berorientasi Objek?
Misalnya, lihat kode C berikut:
SDL_Surface* screen = SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE);
SDL_FreeSurface( screen );
atau kode yang dibahas di sini .
Sekarang kode di atas tidak menggunakan pewarisan, runtime-polymorphism (?), Fungsi virtual dll. Tapi sepertinya cukup banyak OOP bagi saya.
Apakah Object-Orientation hanya menulis kode yang didasarkan pada struktur data yang dapat diciptakan dan dihancurkan seperti objek, kelas, struct, dll. Yang tidak memerlukan pola atau fitur khusus apa pun yang disediakan oleh Bahasa Pemrograman atau perpustakaan ?
sumber
1+2
benar-benar Berorientasi Objek. Ini adalah konstruktor yang membangun objek baru dari dua objek yang ada. Menggunakan sampel kode tidak mengungkapkan apa pun.Jawaban:
Menurut Alan Kay, yang menemukan istilah "berorientasi objek",
Pesan (seperti yang diterapkan dalam Smalltalk) adalah konsep yang sebanding dengan polimorfisme, tetapi lebih kuat (setidaknya daripada jenis polimorfisme yang didukung oleh C ++ atau Java). Ini dapat dilakukan dalam semua bahasa, tetapi agak menyakitkan jika tidak didukung langsung oleh bahasa tersebut. Pada dasarnya itu berarti objek dapat saling mengirim pesan yang mengandung sesuatu, dan dapat bereaksi namun mereka ingin pesan yang mereka terima. Untuk sepenuhnya mendukung pengiriman pesan, harus ada cara agar objek bereaksi secara fleksibel terhadap pesan tanpa menyebutkannya dalam kode sumber (yang pada dasarnya adalah definisi metode / fungsi).
retensi dan perlindungan lokal dan menyembunyikan proses negara - enkapsulasi AKA - dapat dilakukan dengan konvensi dalam semua bahasa, tapi itu agak curang. Retensi lokal pada tingkat bahasa sebenarnya tampaknya menjadi satu fitur semua bahasa yang mengklaim sebagai OO (dan banyak yang tidak) berbagi - umumnya ada cara untuk membuat tipe data majemuk dengan banyak contoh. Perlindungan dan persembunyian, di sisi lain, seringkali hanya dilakukan dengan konvensi.
mengikat semua hal - skala geser di mana C benar - benar jauh dari visi Kay (Seperti halnya C ++, sementara Jawa jauh lebih dekat). Dapat dipalsukan (lihat COM), tetapi itu akan merepotkan untuk digunakan.
Perhatikan bagaimana Kay tidak menyebutkan warisan . Dalam email yang sama ia menulis
sumber
Pemrograman berorientasi objek bukan tentang fitur sintaks, ini adalah coding dan desain filosofi. Pada intinya berdiri konsep objek , yang merupakan konstruksi yang dikelompokkan negara dengan rutinitas untuk menindaklanjutinya (atau, tergantung pada sudut pandang Anda, tanggapan terhadap pesan). Aspek penting lainnya dari OOP adalah enkapsulasi : membungkus detail implementasi ke dalam struktur yang buram dan menghubungkannya melalui antarmuka yang terdefinisi dengan baik. Hampir semua hal lain dalam teori OOP kembali ke dua dasar ini.
Jadi, bahasa apa pun yang dapat memodelkan objek (entitas yang berisi data dan kode) dan enkapsulasi dapat digunakan untuk melakukan OOP. Misalnya, di C Anda dapat menggunakan pointer fungsi untuk menyimpan fungsi dalam struct, dan Anda dapat menggunakan sistem file header / sumber untuk mewujudkan enkapsulasi. Ini tidak nyaman, tetapi cukup untuk melakukan OOP. Anda mungkin bahkan dapat membengkokkan sesuatu seperti Haskell atau ML untuk melakukan OOP, dan saya tidak akan terkejut jika seseorang dapat menemukan cara melakukan OOP dalam perakitan.
Secara praktis, bahasa dapat disebut 'berorientasi objek' jika ia menyediakan serangkaian fitur sintaksis lengkap untuk pemrograman berorientasi objek eksplisit. Biasanya, ini berarti bahwa bahasa tersebut harus memiliki: * gagasan tentang objek * gagasan tentang pemanggilan metode atau pesan yang lewat * cara yang nyaman dan mudah untuk mengontrol akses ke anggota objek * cara yang nyaman dan mudah mendefinisikan antarmuka
Akibatnya, saya akan memanggil sepotong kode berorientasi objek jika mematuhi prinsip-prinsip OOP dan menggunakan sintaks OOP yang tersedia.
BTW., Contoh kode Anda mungkin memang menggunakan polimorfisme dan fungsi virtual, meskipun sintaks C tidak membuatnya jelas. Saya bukan ahli SDL, tetapi saya berharap
SDL_surface
untuk dapat mewakili berbagai jenis permukaan yang berbeda, masing-masing dengan set implementasinya yang spesifik - memadukan sesuatu ke dalam bitmap memori dan memadukannya ke permukaan layar memerlukan perbedaan yang sangat berbeda. kode, tetapi antarmuka (fungsi yang mengambilSDL_surface*
sebagai argumen) tetap sama. Sama seperti itu, ia juga mengimplementasikan enkapsulasi: Anda tidak dapat mengakses representasi yang mendasari permukaan secara langsung, Anda harus melalui fungsi yang tahu cara menanganiSDL_surface
, karena hanya itu yang Anda miliki. Ini adalah contoh yang bagus tentang bagaimana Anda akan melakukan OOP di C.sumber
Pemahaman saya tentang OO adalah bahwa OO adalah cara berpikir dan implementasi yang didasarkan pada gagasan bahwa tugas komputasi dapat dicapai oleh satu pekerja (objek) atau dengan kolaborasi pekerja individu (objek) melalui pesan yang disampaikan di antara para pekerja tersebut ( objek) saat run-time. Perilaku run-time ini memerlukan konstruksi statis dan dinamis yang solid untuk mengaktifkannya.
Sintaks spesifik untuk menerapkan OO bukan kunci yang menentukan apakah suatu bahasa adalah OO atau tidak. Sebagai contoh, Smalltalk dan C # memiliki sintaks yang berbeda tetapi keduanya adalah bahasa OO (dengan derajat yang berbeda-beda). Kuncinya adalah apakah bahasa yang diberikan mempertahankan filosofi (di atas) dan menyediakan cara implantasi yang diperlukan.
sumber
Ketika saya masih mahasiswa saya diajari bahwa pemrograman berorientasi objek berdiri di atas tiga pilar:
Suatu bahasa harus mendukung fitur-fitur tersebut agar dianggap sebagai bahasa yang berorientasi objek.
Perhatikan bahwa ini menjelaskan serangkaian fitur, bukan sintaks . Makanya, apakah Anda harus menulis
atau
tidak masalah.
Jadi Anda memang bisa memprogram sesuai dengan paradigma berorientasi objek di C. Tetapi bahasa tidak menawarkan dukungan untuk ini, yang membuatnya menjadi latihan yang agak menyakitkan. Inilah sebabnya mengapa C tidak dianggap sebagai bahasa berorientasi objek.
sumber
Anda dapat melakukan OO dalam bahasa serba guna yang layak.
Lebih mudah melakukannya dalam bahasa "OO", karena Anda memiliki konstruksi idiomatis yang tersedia dan tidak harus menggunakan sesuatu seperti OO dalam C - yang mungkin, tetapi mengerikan.
Apakah konstruk OO disediakan oleh bahasa itu sendiri, oleh pustaka standarnya, atau oleh pustaka lain, tidak masalah, karena beberapa bahasa (misalnya Scala) memungkinkan pustaka untuk menambahkan konstruksi bahasa sehingga dari sudut pandang programmer hampir tidak mungkin untuk membedakan mana yang disediakan oleh bahasa inti dan yang oleh perpustakaan.
sumber
Jika Anda melihat rentang bahasa yang telah diterima secara luas sebagai OO dan yang belum, tes tersebut tampaknya menjadi dukungan untuk polimorfisme inklusi (alias polimorfisme sub-tipe, tetapi polimorfisme inklusi adalah istilah yang digunakan oleh Cardelli di kertas yang memperkenalkan saya, dan saya pikir cukup banyak orang lain, untuk klasifikasi jenis polimorfisme). Yaitu kemungkinan untuk beberapa variabel untuk memiliki nilai dari tipe yang berbeda dan kemungkinan untuk beberapa panggilan untuk mengirim ke rutinitas yang berbeda tergantung pada tipe dari satu atau beberapa nilai. Segala sesuatu yang lain telah hadir dalam bahasa yang tidak diterima sebagai OO atau hilang dari bahasa diterima dengan baik sebagai OO.
Dua karakteristik utama lainnya yang terkait dengan bahasa OO telah disediakan oleh bahasa non OO:
sumber
Orientasi objek didefinisikan sebagai
lihat juga entri wikipedia. itu adalah fitur yang harus disediakan oleh suatu bahasa agar dapat didefinisikan sebagai berorientasi objek.
pertimbangkan kode Anda berorientasi objek jika dalam bahasa pemrograman berorientasi objek. bahkan jika Anda menulis sesuatu yang tampaknya prosedural itu akan bertindak atas metode dalam objek dari kelas menggunakan polimorfisme melalui enkapsulasi [mungkin] :)
mengenai pertanyaan terakhir Anda jawabannya mungkin. Iya. berorientasi objek pada dasarnya hanya bertindak pada metode pada objek dan memberikan objek tersebut sebagai parameter.
sumber