Apa saja fitur yang diperlukan untuk Orientasi Objek?

9

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 ?

ApprenticeHacker
sumber
2
OOP umumnya membutuhkan objek . Namun dimungkinkan untuk menulis kode yang terlihat OOP dalam sebagian besar bahasa (saya ragu Anda dapat mengatakan "majelis ini terlihat OOP")
Raynos
Kode di atas tidak menggunakan pernyataan if atau loop . Itu tidak menggunakan perkalian atau penambahan. Anda tidak dapat menggunakan dua baris kode, dan daftar hal-hal yang tidak ditampilkan, untuk membuat penilaian apa pun. Dari dua baris kode tersebut, saya dapat menyimpulkan bahwa itu adalah bahasa pemrograman fungsional yang sangat malas, bukan bahasa OO. Menggunakan dua baris kode sebagai bagian dari generalisasi bukanlah pertanyaan nyata.
S.Lott
The Link juga termasuk dalam kode di atas yang saya dihakimi atas. Perhatikan juga bahwa ini bukan penilaian , saya bertanya kepada Anda apakah ini dapat dianggap sebagai OOP.
ApprenticeHacker
Jawaban yang sepele adalah ya . Maksud saya adalah ini. Anda tidak dapat - dari contoh kode - membuat penilaian tentang OOP. Ini masalah sepele definisi. Entah bahasa tersebut didefinisikan sebagai bahasa OOP atau tidak. Sampel kode apa pun yang diberikan mungkin tidak memerlukan semua fitur OOP. Memang, kode OOP dapat menggunakan fitur yang sangat, sangat sedikit. Dalam Python, misalnya, 1+2benar-benar Berorientasi Objek. Ini adalah konstruktor yang membangun objek baru dari dua objek yang ada. Menggunakan sampel kode tidak mengungkapkan apa pun.
S.Lott
Apa yang salah dengan menggunakan definisi ini dan membandingkannya dengan bahasa (bukan dua sampel kode)? en.wikipedia.org/wiki/…
S.Lott

Jawaban:

11

Menurut Alan Kay, yang menemukan istilah "berorientasi objek",

OOP bagi saya hanya berarti pengiriman pesan, penyimpanan dan perlindungan lokal dan menyembunyikan proses negara, dan sangat mengikat semua hal. Ini dapat dilakukan di Smalltalk dan di LISP. Mungkin ada sistem lain di mana ini mungkin, tapi saya tidak menyadarinya.

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

Saya tidak suka cara Simula I atau Simula 67 mewarisi (meskipun saya pikir Nygaard dan Dahl hanya pemikir dan desainer yang luar biasa). Jadi saya memutuskan untuk meninggalkan warisan sebagai fitur bawaan sampai saya memahaminya dengan lebih baik

Michael Borgwardt
sumber
4
Persisnya bagaimana Java dan C # lebih dekat dengan pengikatan akhir daripada C ++?
fredoverflow
@ FredOverflow: Java dengan malas memuat definisi kelas saat runtime ketika mereka pertama kali digunakan, dan melakukannya secara implisit melalui mekanisme yang sangat fleksibel yang dengan mudah memungkinkan menambahkan kelas baru atau bahkan membuatnya dengan cepat. C ++ mengharuskan Anda untuk menghubungkan kembali pustaka yang dapat dieksekusi atau dimuat secara eksplisit. Situasi dengan C # tampaknya kurang jelas dari yang saya kira, jadi saya menghapus referensi ke ti.
Michael Borgwardt
5

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_surfaceuntuk 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 mengambil SDL_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 menangani SDL_surface, karena hanya itu yang Anda miliki. Ini adalah contoh yang bagus tentang bagaimana Anda akan melakukan OOP di C.

tammmer
sumber
Abstrak Tipe Data, pemodelan data dan enkapsulasi tidak unik untuk OO, (seperti yang Anda sebutkan secara singkat). Saya lebih suka menggambarkan OO berdasarkan fitur-fiturnya yang lebih unik (pengikatan dinamis pemanggilan metode, polimorfisme melalui pemanggilan metode tersebut, dll)
hugomg
4

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.

Tidak ada kesempatan
sumber
2

Ketika saya masih mahasiswa saya diajari bahwa pemrograman berorientasi objek berdiri di atas tiga pilar:

  • enkapsulasi ,
  • polimorfisme , dan
  • warisan .

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

type obj; // or type obj = new type;
obj.func(arg);

atau

type* ptr = create_type();
func(ptr, arg); 

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.

sbi
sumber
2
Mengajarkan "pilar-pilar" ini mungkin lebih banyak merusak daripada kebaikan bagi dunia. Enkapsulasi itu baik, tetapi itu saja.
Pelaku
1
Mereka ada dalam daftar ini, sehingga mereka tampaknya diterima secara luas: en.wikipedia.org/wiki/…
S.Lott
Bisakah Anda menjelaskan mengapa Polimorfisme dan Pewarisan buruk?
MathAttack
@MathAttack: Apakah Anda berbicara dengan saya? Karena saya tentu saja tidak mengatakannya.
sbi
1
@missingno: Sesuatu tidak harus unik untuk suatu paradigma yang dianggap penting untuk membedakan paradigma. Enkapsulasi tidak lagi harus unik untuk OOP karena fungsi harus unik untuk pemrograman terstruktur.
sbi
2

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.

Joonas Pulakka
sumber
2

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:

  • Enkapsulasi disediakan dengan sangat baik oleh Ada83;
  • Pewarisan disediakan oleh Oberon (Oberon menarik, Wirth ingin memberikan bahasa OO dengan sesedikit mungkin pukulan, tetapi harus meninjau kembali konsepsinya untuk mendapatkan satu - Oberon-2 adalah OO).
Pemrogram
sumber
1

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.

Makach
sumber
3
Didefinisikan oleh siapa?
Michael Borgwardt