Karena cukup banyak bahasa pemrograman dinamis memiliki fitur mengetik bebek , dan mereka juga dapat membuka dan memodifikasi metode kelas atau contoh kapan saja (seperti Ruby dan Python ), maka ...
Pertanyaan 1) Apa perlunya kelas dalam bahasa yang dinamis? Mengapa bahasa dirancang sedemikian rupa untuk menggunakan kelas sebagai semacam "template" alih-alih melakukannya dengan cara prototipe dan hanya menggunakan objek?
Juga JavaScript berbasis prototipe, tetapi CoffeeScript (versi JavaScript yang disempurnakan) memilih cara berbasis kelas. Dan itu berjalan sama untuk Lua (berbasis prototipe) dan MoonScript (berbasis kelas). Selain itu, ada kelas di ES 6. Jadi ...
Pertanyaan 2) Apakah ini menunjukkan bahwa jika Anda mencoba untuk meningkatkan bahasa berbasis prototipe, antara lain, Anda harus mengubahnya ke berbasis kelas? Jika tidak, mengapa itu dirancang seperti itu?
class
kata kunci pada standar ECMAScript berikutnya (ECMAScript 6). Dukungan untuk kelas dalam JavaScript telah direncanakan sejak lama. Sekarang untuk apa itu - kelas hanya gula sintaksis, alasan yang lebih mudah tentang model untuk objek dari jenis yang sama. Ini dengan cara ini di JS dan ini dengan cara di Python dan bahasa dinamis lainnya.Jawaban:
Bahasa OO pertama (meskipun itu tidak disebut "OO"), Simula, tidak memiliki warisan. Warisan ditambahkan dalam Simula-67, dan didasarkan pada kelas.
Sekitar waktu yang sama, Alan Kay mulai bekerja pada idenya tentang paradigma pemrograman baru, yang kemudian dia beri nama "Orientasi Objek". Dia benar-benar menyukai warisan dan ingin memilikinya dalam bahasanya, tetapi dia juga sangat tidak suka kelas. Namun, dia tidak dapat menemukan cara untuk memiliki warisan tanpa kelas, dan karena itu dia memutuskan bahwa dia tidak menyukai kelas lebih daripada dia menyukai warisan dan merancang versi pertama Smalltalk, Smalltalk-72 tanpa kelas dan dengan demikian tanpa warisan.
Beberapa bulan kemudian, Dan Ingalls datang dengan desain kelas, di mana kelas itu sendiri adalah objek, yaitu contoh dari metaclasses. Alan Kay menemukan desain ini sedikit kurang menarik daripada yang lama, sehingga Smalltalk-74 dirancang dengan kelas dan dengan warisan berdasarkan kelas.
Setelah Smalltalk-74, Alan Kay merasa bahwa Smalltalk bergerak ke arah yang salah dan tidak benar-benar mewakili apa yang dimaksud dengan OO, dan ia mengusulkan agar tim meninggalkan Smalltalk dan mulai segar, tetapi ia kalah suara. Dengan demikian mengikuti Smalltalk-76, Smalltalk-80 (versi pertama Smalltalk akan dirilis kepada peneliti), dan akhirnya Smalltalk-80 V2.0 (versi pertama akan dirilis secara komersial, dan versi yang menjadi dasar untuk ANSI Smalltalk) .
Karena Simula-67 dan Smalltalk-80 dianggap sebagai kakek-nenek dari semua bahasa OO, hampir semua bahasa yang mengikuti, secara acak menyalin desain kelas dan pewarisan berdasarkan kelas. Beberapa tahun kemudian, ketika ide-ide lain seperti warisan didasarkan pada mixin, bukan kelas, dan delegasi berdasarkan objek bukan warisan berdasarkan kelas yang muncul, warisan berbasis kelas sudah menjadi terlalu mengakar.
Cukup menarik, bahasa Alan Kay saat ini didasarkan pada delegasi prototipe.
sumber
Banyak programmer lebih suka bekerja dengan kelas. Ini adalah konsep yang sangat mudah dipahami yang merupakan model yang baik dari proses pemikiran manusia tentang dunia (yaitu, kita secara naluriah menghubungkan objek nyata dengan kelompok abstrak barang-barang yang kita anggap milik mereka, yang merupakan kelas) . Juga, kelas membuat alasan tentang jenis objek lebih mudah: dalam bahasa berbasis kelas, menerapkan prinsip-prinsip seperti substitusi Liskov lebih sederhana daripada dalam bahasa di mana kita hanya memiliki objek yang mungkin memiliki metode yang berbeda, atau yang tipenya bahkan dapat berubah pada saat dijalankan , seperti halnya dalam JavaScript.
Perhatikan bahwa bahkan dalam JavaScript, banyak sekali kode hanya menggunakan fasilitas prototipe untuk meniru kelas. Ini sebagian besar karena banyak programmer lebih suka berpikir seperti itu.
Ada juga alasan lain mengapa bahasa berbasis kelas lebih disukai: lebih mudah untuk mengkompilasinya ke kode yang efisien. JavaScript VMs yang paling efisien secara efektif membuat kelas untuk mewakili jenis objek JavaScript saat metode dan prototipe mereka berubah. Lihat deskripsi implementasi V8 ini untuk alasan mengapa hal ini dilakukan.
sumber
GOTO
s dan register berarti bahwa melepaskan semua abstraksi dan menulis secara langsung hampir pasti lebih mudah, dan karena itu mungkin akan berakhir dengan JIT yang perlu menghabiskan lebih sedikit waktu untuk menyusun kode. Ini tugas kompiler untuk mendukung abstraksi level yang lebih tinggi.Saya pernah mendengar bahwa pada proyek-proyek besar, di mana tim orang bekerja bersama pada kode yang sama, bahwa bahasa yang fleksibel (di mana Anda dapat memodifikasi properti dan metode objek selama waktu berjalan) adalah kebebasan yang tidak diinginkan oleh anggota tim lain untuk Anda memiliki.
Mereka ingin tahu, ketika mereka berhadapan dengan suatu objek, bahwa objek tersebut akan bertindak seperti cetak biru katakan, dan bukan cara morf yang beberapa pengembang ambisius memutuskan untuk mengubahnya untuk menyelesaikan tugasnya sendiri.
Jadi, satu-satunya alasan saya bisa membayangkan, bahwa seseorang tidak ingin fleksibilitas yang ditawarkan oleh bahasa dinamis yang mengagumkan ini, adalah karena mereka ingin menyederhanakan pengembangan tim, debugging, dan dokumentasi otomatis.
Secara pribadi, saya telah mengembangkan aplikasi dalam kedua metodologi, dan saya menyelesaikan berbagai hal dengan lebih cepat dengan bahasa yang dinamis. Saya tidak menggunakan kerangka kerja ini yang dirancang untuk mengubah bahasa dinamis saya kembali menjadi bahasa berbasis kelas lagi. Hal-hal semacam itu merupakan kemunduran bagi selera saya.
sumber
Jadi yang dia katakan di sini adalah bahwa OO adalah tentang membuat kotak hitam yang menanggapi pesan. Di satu sisi REST adalah sistem OO utama dalam hal itu menggunakan kata kerja (yaitu pesan) dan sumber daya (yaitu kotak buram yang berisi beberapa data).
Jadi pertanyaan mengapa beberapa berbasis kelas dan yang lain berdasarkan prototipe kehilangan titik bahwa itu benar-benar tidak masalah, mereka berdua hanyalah implementasi. Sistem yang hanya menggunakan pengiriman pesan alih-alih panggilan metode sama seperti OO seperti dua contoh yang Anda sebutkan.
sumber