Saya tahu javascript menggunakan mengetik bebek dan pada awalnya saya pikir ini akan membuat polimorfisme mudah dibandingkan dengan bahasa yang sangat diketik seperti C #. Tapi sekarang fungsi saya yang mengambil argumen dipenuhi dengan hal-hal seperti:
if(myObj.hasSomeProperty())
atau
if(myObj.hasSomeMethod())
atau
if(isNumber(myParam))
dll.
Ini benar-benar jelek bagiku. Saya berasal dari latar belakang C # dan saya menemukan antarmuka yang didefinisikan jauh lebih baik.
Saya bertanya-tanya apakah saya salah mencoba menerapkan strategi yang efektif dalam bahasa yang diketik secara statis dan ada beberapa cara yang lebih baik untuk melakukan ini dalam javascript?
Saya tahu saya tidak bisa memeriksa, tetapi melacak kesalahan waktu javascript dapat menjadi mimpi buruk karena tidak selalu terjadi di mana kesalahan sebenarnya terjadi dalam kode.
sumber
Jawaban:
Sederhana: jangan selalu memeriksa properti dan metode.
Di Ruby, apa yang Anda panggil disebut "mengetik ayam". Dalam bahasa yang diketik secara dinamis, Anda hanya percaya bahwa penelepon memberikan Anda objek yang cocok. Adalah tugas si penelepon untuk menghormati sisi kontraknya.
Anda membingungkan banyak poros ortogonal untuk mengetik di sini. Ada empat sumbu ortogonal untuk mengetik:
Karena Anda menyebutkan C #: sebagian besar diketik secara statis, tetapi mendukung pengetikan dinamis melalui jenis
dynamic
itu, sebagian besar diketik secara nominal, tetapi tipe anonim menggunakan pengetikan struktural, dan pola sintaksis (seperti sintaksis pemahaman kueri LINQ) dapat diperdebatkan sebagai bebek -typed atau diketik secara struktural, sebagian besar diketik secara eksplisit tetapi mendukung pengetikan implisit untuk argumen tipe umum dan variabel lokal (walaupun case variabel lokal agak aneh dibandingkan dengan kebanyakan bahasa lain, karena Anda tidak bisa meninggalkan tipenya saja, Anda harus berikan tipe pseudo eksplisitvar
, dengan kata lain, jika Anda menginginkan tipe implisit, Anda harus mengatakannya secara eksplisit). Apakah C # diketik dengan kuat atau lemah adalah masalah definisi dua istilah yang Anda gunakan, bagaimanapun, perhatikan bahwa mungkin ada banyak kesalahan tipe runtime di C #, terutama karena kovarians array yang tidak aman.Debugging bukanlah keterampilan yang mudah dipelajari. Namun, ada teknik untuk memudahkan debugging, misalnya Saff Squeeze adalah teknik yang dijelaskan oleh Kent Beck yang menggunakan tes dan refactoring untuk debugging:
sumber
IComparer<T>.Compare(T, T)
hanya jelas dari dokumentasi, bukan jenisnya. Dan di mana dalam jenisjava.util.Collections.binarySearch(java.util.List<T>)
apakah dikatakan bahwa ...Memang, praktik tipikal adalah tidak memeriksa. Dan, ya, ini berarti Anda akan mendapatkan kesalahan javascript yang dilaporkan di tempat lain dari masalah sebenarnya. Namun dalam praktiknya, saya tidak menemukan ini menjadi masalah besar.
Ketika bekerja di javascript, saya terus menguji apa yang saya tulis. Pada sebagian besar kode, saya memiliki unit test yang berjalan secara otomatis setiap kali saya menyimpan editor saya. Ketika sesuatu yang tidak terduga terjadi, saya segera tahu. Saya memiliki area kode yang sangat kecil di mana saya mungkin melakukan kesalahan, karena hampir selalu hal terakhir yang saya sentuh yang memiliki kesalahan.
Ketika saya mendapatkan kesalahan runtime, saya setidaknya punya jejak stack, dan dalam kasus kesalahan di browser saya punya kemampuan untuk pergi ke tingkat jejak stack dan memeriksa variabel. Biasanya mudah untuk melacak kembali dari mana nilai buruk berasal, dan dengan demikian melacaknya kembali ke masalah semula.
Jika Anda seperti saya ketika saya menulis terutama dalam bahasa yang diketik secara statis, saya menulis blok kode yang lebih besar sebelum pengujian dan saya tidak memiliki praktik melacak nilai dari mana asalnya. Pemrograman dalam bahasa seperti javascript berbeda, Anda harus menggunakan keterampilan yang berbeda. Saya menduga pemrograman seperti itu tampaknya jauh lebih sulit, karena itu bukan keterampilan yang telah Anda kembangkan bekerja dalam bahasa lain seperti C #.
Karena itu, saya pikir ada banyak yang bisa dikatakan untuk tipe eksplisit. Mereka bagus untuk dokumentasi dan menangkap kesalahan lebih awal. Saya pikir di masa depan kita akan melihat peningkatan adopsi hal-hal seperti Flow dan Typecript yang menambahkan memeriksa jenis statis ke javascript.
sumber
Saya pikir Anda melakukan hal yang benar, Anda hanya perlu menemukan gaya yang akan lebih menyenangkan mata Anda. Berikut ini beberapa ide:
Alih-alih
if(myObj.hasSomeProperty())
Anda bisa menggunakanif( myobj.prop !== undefined )
. Ini, BTW hanya akan berfungsi dalam mode non-ketat, dalam mode ketat yang harus Anda gunakanif( typeof myobj.prop !== 'undefined' )
.Anda dapat menurunkan beberapa pengecekan tipe ke validator terpisah. Ini memiliki manfaat untuk dapat melewati validasi setelah antarmuka matang, misalnya mulai dari
if( is_valid( myobject ))
mana .is_valid
if( !DEBUG ) return true;
Terkadang masuk akal untuk mengkloning input ke dalam bentuk kanonik, dalam hal ini Anda dapat mengumpulkan berbagai target validasi ke dalam fungsi / objek kloning. Untuk exmaple, di
my_data = Data( myobj, otherstuff )
dalamData
konstruktor bisa nyaman menjalankan semua berbagai validasi di tempat yang sentral.Anda bisa menggunakan beberapa pustaka yang akan (dengan kinerja tinggi) merampingkan validasi tipe Anda menjadi sesuatu yang lebih elegan. Bahkan jika Anda tidak akan mengambil rute ini dalam jangka panjang, Anda mungkin merasa nyaman untuk membawa Anda dengan lancar ke gaya Anda sendiri. Beberapa contoh termasuk xtype.js , ketik-cek , validator.js , dll.
sumber