Saya tidak bisa memikirkan tempat yang lebih baik di antara saudara kandung untuk mengajukan pertanyaan seperti itu. Awalnya saya ingin bertanya, "Apakah python bahasa OO murni?" tetapi mempertimbangkan masalah dan semacam ketidaknyamanan yang dialami orang saat mencoba mendefinisikan istilah saya memutuskan untuk memulai dengan mendapatkan definisi yang jelas untuk istilah itu sendiri.
Akan lebih adil untuk memulai dengan korespondensi oleh Dr. Alan Kay, yang telah menciptakan istilah (perhatikan inspirasi dalam analogi biologis terhadap sel atau benda hidup lainnya).
Ada beberapa cara berikut untuk mendekati tugas:
- Berikan analisis komparatif dengan mendaftarkan bahasa pemrograman yang dapat menunjukkan (atau gagal melakukannya) properti tertentu yang unik dan cukup untuk mendefinisikan istilah (meskipun Smalltalk, Scala,
Java, dan sebagainya - adalah contoh yang mungkin tetapi IMO cara ini tampaknya tidak benar-benar lengkap tidak berbuah ) - Berikan definisi formal (atau dekat dengan itu, misalnya dalam gaya akademik atau matematika).
- Berikan definisi filosofis yang benar-benar akan bergantung pada konteks semantik bahasa konkret atau pengalaman pemrograman apriori (harus ada peluang penjelasan yang berhasil oleh masyarakat).
Versi saya saat ini: "Jika bahasa pemrograman ( formal ) tertentu yang dapat (secara tata bahasa ) membedakan antara operasi dan operan serta menyimpulkan tentang jenis setiap operan apakah jenis ini adalah objek (dalam arti OOP) atau tidak maka kita sebut bahasa seperti itu bahasa OO selama ada setidaknya satu jenis dalam bahasa ini yang merupakan objek. Akhirnya, jika semua jenis bahasa juga objek, kami mendefinisikan bahasa tersebut sebagai bahasa OO murni (kuat). "
Akan menghargai setiap peningkatan yang mungkin terjadi. Seperti yang Anda lihat, saya baru saja membuat definisi bergantung pada istilah "objek" (sering sepenuhnya dirujuk sebagai kelas objek).
[EDIT]
Selain itu, saya menggunakan gagasan (untungnya dipahami dengan baik) tentang jenis seperti dalam bahasa yang diketik. Pemrograman tipe data atau pemrograman berorientasi tipe bukan hanya interpretasi sintaksis (dari teks program, yaitu bagaimana memperlakukan nilai-nilai literal dan variabel data tertentu - sesuatu yang berevolusi menjadi tipe keamanan) tetapi dapat dikaitkan dengan tata bahasa dan dipelajari secara formal (Menggunakan logika matematika) seperti yang disebut sistem tipe . Perhatikan bahwa membutuhkan sistem tipe tertentu untuk memiliki tipe universal yang disebut adalah salah satu cara mendefinisikan kemurnian bahasa OO (ada cara untuk memperluas ini secara semantik).
NB
bagaimana menjawab :
- ini membantu jika Anda menentukan buku atau referensi yang mendukung / menjelaskan pemahaman Anda tentang terminologi dan konsep (biasanya definisi yang baik mencakup atau referensi semua konsep tergantung kecuali dasar).
- jika mungkin tunjukkan kategori indentasi dari jawaban / definisi Anda jika tidak jelas sebaliknya (lihat di atas: 1 - dengan contoh bahasa, 2 - logika matematika, 3 - deskripsi teknis dan filosofi pemrograman)
- Klasifikasi itu penting (dan juga karena istilah pure-OO dimasukkan ke dalam istilah OO) ketika menjawab pertanyaan mencoba untuk mencampur unsur-unsur paradigma OO dari metodologi terkenal lainnya (dan sama sekali tidak membingungkan / tumpang tindih mereka, misalnya biasanya elemen pemrograman modular dapat dibahas. / diwujudkan dengan pemrograman OO): mencoba membedakan OOP dari (termasuk atau menjadi bagian dari) pemrograman fungsional, pemrograman logis (terutama sangat khusus), Jenis Data Abstarct (ADT), Modular, Metaprogramming (generik dan ekspansi-waktu makro LISP), Kontrak (misalnya Eiffel), Berorientasi aspek (AO), (perbedaan antara klasifikasi deklaratif dan fungsional serta definisi historis struktur Dijkstra jelas)
pada kesulitan memberikan definisi formal : cukup mengejutkan sangat mudah untuk memberikan deskripsi matematis tentang OOP dalam bentuk sistem logis (formal) tertentu (berdasarkan tipe yang paling mungkin) dan mendefinisikan satu konsep setelah yang lain. Seseorang bahkan dapat mencoba untuk melakukan sesuatu yang lebih praktis dengan menerapkan formalisme itu untuk mengetik pemeriksaan keselamatan atau aspek desain bahasa baru dari sekadar hiburan atau olahragaabstrak(juga mencari formulasi OOP dalam Teori Tipe Intuitionistic , tipe Dependent , secara mandiri, dalam formalisme FOL sebagai lambda kalkulus dan hanya dengan menggunakan teori kategori). Poin utama di sini adalah tidak mengejutkanformulasi seperti itu IMO sangat bias (cacat) oleh kemungkinan besar pada awalnya tidak lengkap pemahaman tentang OOP (dalam teknik komputer) dan akhirnya menjadi hampir tidak dapat diakses setelah itu (sehingga sulit berkontribusi ke belakang ke dunia pemrograman - mungkin kecuali persentase tertentu menemukan aplikasi kembali dari dunia formal dengan menjadi diintegrasikan ke dalam bahasa populer ).
Jadi ya, sulit untuk memberikan definisi yang "baik", bukan hanya definisi. Tapi saya yakin menanyakan ini di sini karena pengalaman dan keterlibatan langsung Anda, teman-teman.
sumber
Jawaban:
OO, menurut Alan Kay adalah tentang menyampaikan pesan, dan hanya itu. Anda akan melihat bahwa kualitas seperti polimorfisme dan enkapsulasi sebenarnya berasal dari penyampaian pesan.
Sekarang sikap itu sebenarnya sangat ekstrem, karena pada dasarnya berarti hanya Smalltalk dan bahasa yang akan memenuhi syarat.
Saya pikir Anda dapat mendefinisikan OO sebagai membangun sistem Anda pada entitas, yang sepenuhnya merangkum keadaan mereka, dan yang dapat ditukar karena kualitas polimorf yang melekat. Dengan demikian orang dapat berargumen bahasa OO murni memastikan dua kualitas inti ini selalu terpenuhi. Apa yang membuat bahasa OO "tidak murni" akan menjadi mekanisme yang memungkinkan pembuatan konstruk yang tidak memenuhi kriteria ini, seperti kemungkinan untuk:
Kemudian lagi, kemurnian bahasa IMHO lebih merupakan kelemahan daripada kekuatan. OO bukan peluru perak. Tidak ada paradigma tunggal.
sumber
Saya akan mendekati ini dengan mendefinisikannya sebagai bahasa yang menggunakan konstruksi OOP dan tidak ada yang lain (dengan cara yang sama bahwa bahasa FP murni menggunakan fungsi murni dengan data tidak berubah dan tidak ada yang lain).
Khususnya:
functionObject.call(param1,param2)
environment.getValue("myThing")
atau meletakkan variabel dalam objek kelasPerhatikan bahwa ini masih menyisakan beberapa opsi terbuka:
sumber
globalVariableName
untuk mengakses variabel global adalah semantik yang berbeda dari pemanggilan metode pada objek, yang akan menjadi satu-satunya cara untuk mengakses nilai non-lokal di OOP murni.Diskusi tentang apa yang disebut bahasa OO selalu sedikit di sisi otak-dicuci. Yaitu:
Istilah desain berorientasi objek bermuara pada 3 hal:
1) adalah desain program murni, dapat dicapai dalam bahasa pemrograman apa pun. Namun, beberapa bahasa memiliki fitur bermanfaat seperti kelas / struct dan kata kunci pribadi.
2) terutama desain program, meskipun tidak dapat sepenuhnya dicapai tanpa dukungan bahasa, karena Anda memerlukan mekanisme bahasa seperti privat / statis untuk melindungi dari penggunaan yang tidak disengaja.
3) terutama desain program. Biasanya ada tiga dependensi berbeda: "objek X berisi objek Y", "objek X adalah semacam Y" dan "objek X berinteraksi dengan objek Y". Ada banyak fitur bahasa untuk membantu dengan dependensi ini: warisan / polimorfisme, kelas dasar abstrak dan sebagainya.
Sekarang, jika kita melihat di atas kita dapat melihat bahwa Anda hampir tidak memerlukan fitur bahasa untuk menulis program OO. Fitur-fiturnya hanya membuatnya jauh lebih mudah.
Sasaran di atas tidak dapat dicapai dengan menggunakan beberapa logika berlatar belakang: hanya karena Anda menggunakan kata kunci kelas, program Anda tidak secara otomatis mendapatkan desain modular. Hanya karena Anda menggunakan warisan, itu tidak secara otomatis berarti bahwa dependensi objek Anda masuk akal. Bahasa dengan fitur OO masih memungkinkan hal-hal seperti
class TheWholeBloodyProgram
atau "Hewan mewarisi Kucing".Sayangnya, topik desain program berorientasi objek yang baik jarang disebutkan dalam diskusi semacam ini. Programmer yang dicuci otak hanya melihat sintaks dan hal-hal seperti misalnya "C ++ memiliki tipe data primitif sehingga program C ++ Anda bukan OO", lalu mereka menulis program yang benar-benar mengerikan dalam bahasa favorit mereka sendiri, tanpa menggunakan petunjuk apa pun dari desain program apa-begitu-pernah.
Untuk menjawab pertanyaan: sangat sedikit, jika ada bahasa yang memiliki dukungan untuk desain program OO yang tepat. Untuk mengetahui bahasa mana yang memiliki fitur terkait OO tertentu tidak relevan selama programmer tidak tahu apa arti desain berorientasi objek. Seorang programmer yang mengklaim bahwa bahasa-bahasa tertentu berorientasi objek kemungkinan besar tidak memahami konsep OO secara keseluruhan. Tanyakan calon programmer OO bagaimana mereka merancang program OO. Jika hal pertama yang mereka lakukan adalah mulai berteriak kata kunci bahasa, maka Anda dapat dengan aman menganggap mereka tidak tahu desain OO.
Mungkin ada beberapa alat UML-ish mewah tingkat tinggi yang jauh di atas kode sumber mentah, yang memaksa programmer untuk hanya menulis program dengan desain berorientasi objek yang bagus, tapi saya ragu. Alat desain terbaik untuk pemrograman OO kemungkinan besar masih otak manusia dan akal sehat.
sumber
Tidak, tidak ada definisi formal atau bahkan berguna, dan tidak akan pernah ada. Bagi sebagian orang, OOP berarti "kelas dasar Universal" dan "Harus menggunakan semantik referensi, terbaik dengan pengumpul sampah" - dan Anda bahkan bisa mendapatkan pertengkaran tentang sintaks, salah satu hal paling tidak relevan yang pernah ditemukan.
Pada akhirnya, pertama, Anda harus menjawab pertanyaan "Apa itu objek?" Semakin berpikiran sempit akan bersikeras mewarisi dari beberapa kelas dasar universal yang tidak berguna dan tidak perlu dialokasikan pada pemulung untuk memenuhi syarat. Tapi saya lebih suka definisi yang jauh lebih berguna. Tujuan dari OOP adalah untuk memiliki beberapa data, dan beberapa fungsi yang Anda dapat memanggil data itu. Begitu
Dalam hal ini, bahkan
int
memenuhi syarat. Lagi pula, ketika Anda menulis kode templat dalam C ++ yang dapat menerima primitif atau objek, maka menjadi sulit untuk berpendapat bahwa primitif berbeda dengan cara substansial apa pun. Tidak ada yang berbeda bermaknaVector v1, v2; v1 + v2;
daripadaint v1, v2; v1 + v2;
(kecuali semantik inisialisasi jelek, kita harus mengakui). Juga, ini memungkinkan lambda dan benda-benda semacam itu menjadi objek, karena mereka memegang negara - tangkapan mereka - dan menawarkan fungsi pada negara itu, untuk memanggil lambda.Untungnya, kita juga dapat mengklasifikasikan pointer ke fungsi bebas sebagai objek, karena keduanya memiliki status (alamat) dan fungsi pada status tersebut (untuk memanggilnya). Jadi fungsi bebas harus diizinkan - bahkan jika Anda mengatakan bahwa semua fungsi bebas sebenarnya adalah pointer fungsi global.
sumber
Anda dapat memikirkannya dengan contoh negatif. Java bukan bahasa berorientasi objek murni karena ada juga tipe primitif yang bukan objek. Ini adalah bilangan bulat, ganda, array dan sebagainya. Dalam bahasa objek murni, semantik objek tersedia untuk semuanya.
Ada juga pertanyaan tentang seberapa banyak bahasa ditutup untuk modifikasi, bahkan dalam kerangka objek. Di java, Anda tidak bisa mendefinisikan subclass baru untuk beberapa kelas, seperti String atau Kelas.
Bahasa mana yang murni? Satu-satunya kandidat yang muncul dalam pikiran adalah smalltalk.
sumber