Saya tidak pernah mengerti pernyataan seperti ini. Sejujurnya, bahkan jika Anda mendeklarasikan tipe kembalinya suatu fungsi, Anda dapat dan akan melupakannya setelah Anda menulis banyak baris kode, dan Anda masih harus kembali ke baris di mana ia dinyatakan menggunakan fungsi pencarian dari editor teks Anda untuk memeriksanya.
Ini bukan tentang Anda lupa jenis pengembalian - ini akan selalu terjadi. Ini tentang alat yang dapat memberi tahu Anda bahwa Anda lupa jenis pengembalian.
Sebagai tambahan, karena fungsi dideklarasikan dengan tipe funcname()...
, tipe whitout mengetahui Anda harus mencari di setiap baris di mana fungsi dipanggil, karena Anda hanya tahu funcname
, sementara dalam Python dan sejenisnya Anda hanya bisa mencari def funcname
atau function funcname
yang hanya terjadi sekali , di deklarasi.
Ini adalah masalah sintaksis, yang sama sekali tidak terkait dengan pengetikan statis.
Sintaks keluarga C memang tidak ramah ketika Anda ingin mencari deklarasi tanpa memiliki alat khusus yang Anda inginkan. Bahasa lain tidak memiliki masalah ini. Lihat sintaks deklarasi Rust:
fn funcname(a: i32) -> i32
Terlebih lagi, dengan REPL itu sepele untuk menguji fungsi untuk itu jenis kembali dengan input yang berbeda, sementara dengan bahasa yang diketik secara statis Anda akan perlu menambahkan beberapa baris kode dan mengkompilasi ulang semuanya hanya untuk mengetahui jenis yang dideklarasikan.
Bahasa apa pun dapat diartikan dan bahasa apa pun dapat memiliki REPL.
Jadi, selain untuk mengetahui jenis pengembalian fungsi yang jelas bukan poin kuat dari bahasa yang diketik secara statis, bagaimana pengetikan statis sangat membantu dalam proyek yang lebih besar?
Saya akan menjawab secara abstrak.
Suatu program terdiri dari berbagai operasi dan operasi-operasi tersebut disusun sebagaimana adanya karena beberapa asumsi yang dibuat pengembang.
Beberapa asumsi implisit dan beberapa eksplisit. Beberapa asumsi menyangkut operasi di dekat mereka, beberapa menyangkut operasi jauh dari mereka. Suatu asumsi lebih mudah untuk diidentifikasi ketika diekspresikan secara eksplisit dan sedekat mungkin ke tempat-tempat di mana nilai kebenarannya penting.
Bug adalah manifestasi dari asumsi yang ada dalam program tetapi tidak berlaku untuk beberapa kasus. Untuk melacak bug, kita perlu mengidentifikasi asumsi yang salah. Untuk menghapus bug, kita harus menghapus asumsi itu dari program atau mengubah sesuatu sehingga asumsi itu benar-benar berlaku.
Saya ingin mengelompokkan asumsi menjadi dua jenis.
Jenis pertama adalah asumsi yang mungkin atau mungkin tidak berlaku, tergantung pada input program. Untuk mengidentifikasi asumsi yang salah dari jenis ini, kita perlu mencari di ruang semua kemungkinan input program. Dengan menggunakan tebakan dan pemikiran rasional, kita dapat mempersempit masalahnya dan mencari di ruang yang jauh lebih kecil. Tetapi tetap saja, ketika sebuah program tumbuh sedikit, ruang input awalnya tumbuh pada tingkat yang sangat besar - ke titik di mana ia dapat dianggap tak terbatas untuk semua tujuan praktis.
Jenis kedua adalah asumsi yang pasti berlaku untuk semua input, atau pasti salah untuk semua input. Ketika kami mengidentifikasi asumsi semacam ini sebagai salah, kita bahkan tidak perlu menjalankan program atau menguji input apa pun. Ketika kami mengidentifikasi asumsi semacam ini sebagai benar, kami memiliki satu tersangka yang kurang perlu dipedulikan ketika kami melacak bug ( apa pun bug ). Oleh karena itu, ada nilai dalam memiliki asumsi sebanyak mungkin milik jenis ini.
Untuk menempatkan asumsi dalam kategori kedua (selalu benar atau selalu salah, terlepas dari input), kami membutuhkan jumlah informasi minimum yang tersedia di tempat asumsi tersebut dibuat. Di seluruh kode sumber program, informasi menjadi basi cukup cepat (misalnya, banyak kompiler tidak melakukan analisis antar-prosedur, yang membuat panggilan apa pun menjadi batas keras bagi sebagian besar informasi). Kami membutuhkan cara agar informasi yang diperlukan tetap segar (valid dan terdekat).
Salah satu caranya adalah memiliki sumber informasi ini sedekat mungkin dengan tempat di mana itu akan dikonsumsi, tetapi itu tidak praktis untuk sebagian besar kasus penggunaan. Cara lain adalah dengan mengulangi informasi berulang kali, memperbarui relevansinya di seluruh kode sumber.
Seperti yang sudah bisa Anda tebak, tipe statis persis seperti itu - suar informasi jenis yang tersebar di seluruh kode sumber. Informasi itu dapat digunakan untuk menempatkan sebagian besar asumsi tentang ketepatan jenis dalam kategori kedua, yang berarti bahwa hampir semua operasi dapat diklasifikasikan sebagai selalu benar atau selalu salah sehubungan dengan kompatibilitas jenis.
Ketika jenis kami tidak benar, analisis menghemat waktu kami dengan membawa bug ke perhatian kami lebih awal daripada terlambat. Ketika jenis kami benar, analisis menghemat waktu kami dengan memastikan bahwa ketika bug terjadi, kami dapat segera mengesampingkan kesalahan jenis.