Selamat! Anda baru saja mengelilingi dunia bahasa pemrograman / sistem ketik, tiba di sisi lain dunia dari mana Anda pergi. Anda baru saja mendarat di perbatasan bahasa dinamis / objek berbasis prototipe!
Banyak bahasa dinamis (mis. JavaScript, PHP, Python) memungkinkan seseorang untuk memperluas atau mengubah properti objek saat runtime.
Bentuk ekstrim dari ini adalah bahasa berbasis prototipe seperti Self atau JavaScript. Mereka tidak memiliki kelas, secara tegas. Anda dapat melakukan hal-hal yang terlihat seperti pemrograman berbasis kelas, berorientasi objek dengan pewarisan, tetapi aturannya sangat santai dibandingkan dengan bahasa berbasis kelas yang lebih tajam seperti Java dan C #.
Langauges seperti PHP dan Python hidup di jalan tengah. Mereka memiliki sistem reguler berbasis kelas idiomatik. Tetapi atribut objek dapat ditambahkan, diubah, atau dihapus saat runtime - walaupun dengan beberapa batasan (seperti "kecuali untuk tipe bawaan") yang tidak Anda temukan di JavaScript.
Pertukaran besar bagi dinamisme ini adalah kinerja. Lupakan seberapa kuat atau lemahnya bahasa itu diketik, atau seberapa baik dapat dikompilasi ke kode mesin. Objek dinamis harus direpresentasikan sebagai peta / kamus fleksibel, bukan struct sederhana. Ini menambahkan overhead ke setiap akses objek. Beberapa program berusaha keras untuk mengurangi overhead ini (misalnya dengan penugasan phantom kwarg dan kelas berbasis slot di Python), tetapi overhead tambahan biasanya hanya setara untuk kursus dan harga tiket masuk.
Kembali ke desain Anda, Anda mencangkok kemampuan untuk memiliki properti dinamis ke subset dari kelas Anda. A Productdapat memiliki atribut variabel; mungkin suatu Invoiceatau Orderakan dan tidak bisa. Itu bukan cara yang buruk untuk pergi. Ini memberi Anda fleksibilitas untuk memiliki variasi di mana Anda membutuhkannya, sambil tetap dalam bahasa yang ketat dan sistem jenis. Di sisi bawah, Anda bertanggung jawab untuk mengelola properti fleksibel tersebut, dan Anda mungkin harus melakukannya melalui mekanisme yang terlihat sedikit berbeda dari atribut yang lebih asli. p.prop('tensile_strength')bukannya p.tensile_strength, misalnya, dan p.set_prop('tensile_strength', 104.4)bukannyap.tensile_strength = 104.4. Tetapi saya telah bekerja dengan dan membangun banyak program dalam Pascal, Ada, C, Java dan bahkan bahasa dinamis yang menggunakan akses pengambil-penyetel untuk tipe atribut non-standar; pendekatannya jelas bisa diterapkan.
Oleh karena itu, ketegangan antara tipe statis dan dunia yang sangat bervariasi ini sangat umum. Masalah analog sering terlihat ketika merancang skema database, terutama untuk penyimpanan data relasional dan pra-relasional. Kadang-kadang ditangani dengan membuat "baris super" yang berisi cukup banyak fleksibilitas untuk menampung atau menentukan gabungan dari semua variasi yang dibayangkan, kemudian memasukkan semua data yang masuk ke dalam bidang tersebut. The WordPress wp_postsmeja , misalnya, memiliki bidang-bidang seperti comment_count, ping_status, post_parentdan post_date_gmtyang hanya menarik dalam kondisi tertentu, dan bahwa dalam prakteknya sering kosong. Pendekatan lain adalah, seperti tabel normalisasiwp_options , sangat mirip dengan AndaPropertykelas. Meskipun memerlukan manajemen yang lebih eksplisit, item di dalamnya jarang kosong. Database berorientasi objek dan dokumen (misalnya MongoDB) seringkali lebih mudah berurusan dengan perubahan opsi, karena mereka dapat membuat dan mengatur atribut dengan cukup banyak.