Saya membaca di suatu tempat di salah satu jawaban untuk pertanyaan di sini (tidak ingat yang mana) bahwa C ++ tidak cocok untuk pemrograman berorientasi objek. Ada beberapa yang menyebutkan bahwa Anda dapat menggunakan fitur atau sesuatu seperti itu, tetapi tidak dalam arti OOP murni (saya sebenarnya tidak benar-benar mengerti apa yang dimaksud orang itu).
Apakah ada kebenaran dalam hal ini; jika demikian, mengapa?
c++
object-oriented
Gablin
sumber
sumber
Jawaban:
Seperti yang dijelaskan di Jadi, apa * yang * Alan Kay maksud dengan istilah "berorientasi objek"? , Alan Kay berpikir bahwa penyampaian pesan adalah bagian penting dari OOP, tetapi sedikit yang tidak dimiliki oleh "C dengan kelas" (yang kemudian menjadi C ++). C ++ hanyalah struct dengan sedikit perilaku, sedangkan objek di Smalltalk atau Objective-C "cerdas" karena mereka dapat memutuskan apa yang mereka lakukan dengan pesan yang mereka kirim. Jika objek Smalltalk-esque menerima pesan yang tidak memiliki implementasinya, ia dapat dengan malas menambahkannya, meneruskan pesan ke objek lain, atau melakukan hal yang sewenang-wenang.
Apa yang ditawarkan C ++ dengan cara orientasi-objek adalah
virtual
metode dan polimorfisme yang melibatkan cara metode-metode tersebut dipanggil. Ketika kompilator melihat tipe data (atauclass
) yang memiliki metode virtual, itu membangun vtable dengan slot untuk setiap metode virtual. Subkelas yang menerapkan metode virtual akan menempatkan implementasinya dalam slot yang benar, sehingga kode klien hanya perlu tahu di mana dalam tabel virtual untuk mencari kode yang akan dijalankan daripada menyelesaikannya sampai ke fungsi tertentu. Apakah ini berarti bahwa C ++ secara efektif memang memiliki bentuk pengiriman ganda, meskipun semuanya diimplementasikan dalam kompiler dan tidak mampu seperti sistem Smalltalk-esque.Jika Anda menganggap penyampaian pesan sebagai hal mendasar bagi OOP, maka selagi Anda bisa melakukannya dengan C ++ itu jauh dari mudah. OTOH jika Anda menggunakan OOP untuk mengaitkan data dengan fungsi yang bekerja pada data itu, C ++ tidak masalah.
sumber
Diskusi semacam ini menggangguku karena kedengarannya seperti penafsiran, orang-orang memperdebatkan makna Kitab Suci, atau Konstitusi Amerika, dan apa arti penulis asli, seolah-olah apa yang kita pikir tidak penting.
Begini, Alan Kay adalah orang yang cerdas, dan dia punya ide bagus, yang berhadapan dengan banyak ide bagus lainnya, dan menemukan realisasinya dalam bahasa Smalltalk dan bahasa lainnya.
Dia bukan Mesias, dan OOP bukan Paradigma Pemrograman Sejati.
Itu adalah ide yang bagus, di antara banyak. Apakah C ++ memiliki ide bagus di dalamnya, berasal dari pola pikir OOP? Tentu saja.
sumber
C ++ mendukung OOP, jika Anda mendefinisikan OOP berarti enkapsulasi, pewarisan dan polimorfisme.
Namun, C ++ tidak benar-benar unggul di OOP. Salah satu alasannya adalah bahwa polimorfisme sering bergantung pada objek yang dialokasikan tumpukan, yang (walaupun menggunakan smart pointer), lebih alami untuk digunakan dalam bahasa yang dikumpulkan sampah.
Di mana C ++ unggul, bagaimanapun, adalah dalam pemrograman generik. C ++ memungkinkan Anda untuk dengan mudah membuat kode generik yang sangat efisien melalui teknik pemrograman fungsional berbasis template.
sumber
C ++ meminjam fitur OOP dari Simula. Satu atau lebih pengembang Simula IIRC berkomentar bahwa C ++ bukan yang mereka pikirkan.
C ++ memiliki alat yang bagus untuk abstraksi, tetapi lebih merupakan bahasa paradigma campuran daripada bahasa berorientasi objek. Fitur berorientasi objek ada di sana, tetapi Anda memiliki pilihan yang bukan "OOP ketat".
Salah satu "penyisih" nakal yang Anda dapatkan di C ++ adalah menggunakan metode mengikat lebih awal daripada terlambat. Tidak hanya ini mungkin - ini adalah standarnya. Di Jawa, "final" terkait, tetapi lebih bersih dalam beberapa hal (ini menentukan maksud dengan cara yang tidak hanya tentang menghindari overhead kinerja yang sepele), dan itu bukan default.
Dalam beberapa hal, C ++ menunjukkan tanda-tanda menjadi eksperimen awal yang masih ada di sini. Meski begitu, itu masih alat yang bagus, dengan banyak keuntungan yang tidak Anda dapatkan dalam bahasa OOP lainnya.
sumber
Memaksa semuanya menjadi bagian dari kelas tidak selalu menghasilkan kode OO yang hebat.
Mintalah programmer prosedural yang buruk untuk memprogram di Jawa dan mereka mungkin akan mengambil kelas di suatu tempat, berikan metode utama statis dan tempelkan 1000 baris kode di dalamnya. Saya tahu saya telah melihatnya.
Java memiliki pernyataan switch. Saya telah melihat
switch( type ) { case typeA: bundles_of_code; break; case typeB: bundles_of_other_code; break }
dll di C ++ dan kode Java.C ++ mendukung banyak konsep OO tetapi standarnya tidak ditentukan olehnya, namun saya kira banyak tergantung pada apa tujuan Anda.
Semantik "miskin" utama dalam C ++ adalah memungkinkan penyalinan konstruksi kelas-kelas di mana objek mentransmisikan ke objek lain. Anda dapat menonaktifkan ini tetapi kemudian Anda tidak dapat mengembalikannya dari suatu fungsi. Untungnya ini dibahas dalam C ++ 0x.
sumber
OOP bukan hanya tentang memastikan semuanya dari atau berada di kelas. Sangat mungkin untuk menulis kode non-OO dalam bahasa "murni OO". Sebagai contoh, "main" sering ditunjukkan sebagai fungsi global, tetapi menciptakan kelas yang hanya berisi metode utama statis sama non-OO.
C ++ bekerja paling baik dengan campuran berbagai hal; ini seharusnya tidak mengejutkan, karena itulah cara sebagian besar hal terbaik bekerja terbaik. Seringkali OOP adalah salah satu alat yang sangat berguna.
sumber
C ++ dapat digunakan untuk OOP tetapi tidak semurni sesuatu seperti Smalltalk. C ++ juga memungkinkan Anda melakukan non-OOP yang mungkin dibicarakan orang.
sumber
Meskipun saya tidak setuju dengan sentimen, memang benar bahwa sistem tipe C ++ bukan murni OOP - bukan "semuanya adalah objek." Angka (khususnya) tidak dapat diperpanjang semudah mereka dalam, katakanlah, Smalltalk. Misalnya, Anda tidak dapat mendefinisikan kembali arti "2 + 2" (meskipun Anda dapat mendefinisikan kembali arti "dua + dua").
Tapi apa yang kebanyakan orang mungkin berarti adalah bahwa banyak orang menulis kode non-object oriented di C ++ tapi percaya bahwa karena mereka menggunakan "OOP" bahasa, mereka berorientasi objek. Itu tidak benar. Namun menurut pendapat saya, Anda dapat menulis kode imperatif mengerikan di Smalltalk dan tidak bisa lebih unggul dari desain OOP yang layak di C ++.
sumber
Keberatan Alan Kay untuk C ++ adalah bahwa itu adalah bahasa makro di atas C.
Gagasan "message passing" hanyalah gagasan bahwa instance kelas disimpan dalam memori dan bahwa mereka mengekspos metode yang dapat dipanggil. Pesan lewat * disimulasikan "dalam C ++ menggunakan vtables yang memegang pointer ke fungsi.
Untuk mengatakan bahwa pesan yang lewat tidak ada di C ++ tidak akurat, yang lebih akurat untuk mengatakan bahwa pesan yang lewat adalah bagian integral dari bahasa lain seperti smalltalk dan Java karena bahasa tersebut tidak memproses ulang konstruksi asing dan mencangkoknya pada C secara langsung.
Ini adalah argumen desain bahasa yang sangat semantik yang saya duga sedikit di luar tingkat pengalaman si penanya.
Yang sedang berkata ada seribu alasan untuk membenci C ++, dan sangat sedikit alasan untuk menyukainya.
Daripada mencari palu yang sempurna dan paku yang sempurna, temukan rumah yang sempurna untuk dibangun dan kemudian temukan alat yang tepat ... yang membutuhkan pengalaman.
Penting juga untuk diingat bahwa dalam pemrograman sistem, apa yang ditakutkan Alan Kay bukanlah "OOP murni" sebenarnya adalah kekuatan C ++. Untuk masing-masing ...
sumber
Dalam pandangan saya, ini bukan masalah definisi sebagai masalah kegunaan.
Objek adalah abstraksi yang dimaksudkan untuk membuatnya lebih mudah untuk membaca, menulis, dan alasan tentang program yang kompleks. Untuk seorang programmer praktis, apakah suatu bahasa memenuhi semua kriteria definisi formal tertentu "berorientasi objek" (tampaknya ada beberapa yang bersaing!) Tidak benar-benar sama pentingnya dengan apakah alat yang ditawarkannya cocok untuk dipikirkan. program Anda dalam hal objek yang dikatakan - yaitu, benar-benar menuai manfaat produktivitas yang seharusnya dari OOP.
Dalam C ++, objek adalah abstraksi yang sangat bocor , sering memaksa programmer untuk bertengkar dengan masalah-masalah buruk terkait dengan bagaimana objek-objek itu terstruktur dalam memori - masalah yang lebih mengingatkan pada pengkodean dalam C langsung daripada bahasa OOP lainnya. Misalnya, C ++ Jawaban yang Sering Diajukan menawarkan kritik ini (antara lain):
C ++ berorientasi objek, tetapi tidak menyenangkan dan tidak lengkap: penggunanya harus mencurahkan banyak upaya untuk memastikan data mereka benar-benar berperilaku seperti objek "nyata" daripada bit yang salah. Yang mengatakan, banyak kode telah ditulis dalam C + + selama masa pakainya, sebagian besar menggunakan kelas dan pengiriman dinamis, jadi itu jelas sesuatu yang dapat Anda gunakan untuk OOP praktis.
sumber
Ada alasan mengapa Graham Lee paling banyak mendapat dukungan di sini. Untuk mengulangi, tampaknya kelas C ++ tidak benar-benar objek dalam arti tidak melakukan passing pesan. Saya pikir inilah yang membuat banyak orang tersandung ketika mereka mempelajari C ++ atau oop. Orang-orang diberitahu bahwa berorientasi objek adalah 'ini' dan kemudian diberitahu bahwa C ++ melakukannya secara berbeda. Yah C ++ tidak pernah melakukan OOP secara berbeda. Jika Anda berpikir dengan cara ini Anda tidak akan pernah menghargai kelas C ++ untuk apa yang dimaksudkan untuk mereka dan itu adalah bahwa mereka hanya merupakan perbaikan paradigma prosedural dengan memasukkan abstraksi, dan perilaku dinamis. Jadi kelas-kelas C ++ pada dasarnya prosedural, mereka hanya meningkatkan paradigma prosedural, atau lebih tepatnya mereka adalah versi yang lebih maju dari sebuah struct C.
sumber
Steve Yegge mengatakan yang terbaik :
Sistem objek dalam C ++ sangat terprogram dan tetap pada waktu kompilasi, sehingga sangat jauh dari gagasan asli OOP yang melibatkan pesan-lewat, introspeksi, refleksi, pengiriman dinamis, dan pengikatan lambat, antara lain. Satu-satunya kesamaan C ++ dan Smalltalk adalah sedikit kosakata.
sumber