Inilah masalah pemrograman / bahasa yang ingin saya dengarkan.
Kami telah mengembangkan konvensi yang diikuti oleh sebagian besar programmer yang bukan merupakan bagian dari sintaks bahasa tetapi berfungsi untuk membuat kode lebih mudah dibaca. Ini tentu saja selalu merupakan masalah perdebatan, tetapi setidaknya ada beberapa konsep inti yang menurut sebagian besar programmer menyenangkan. Memberi nama variabel Anda dengan tepat, memberi nama secara umum, membuat baris Anda tidak terlalu panjang, menghindari fungsi panjang, enkapsulasi, hal-hal itu.
Namun, ada masalah yang saya belum menemukan orang mengomentari dan mungkin saja yang terbesar dari kelompok itu. Masalah argumen menjadi anonim saat Anda memanggil suatu fungsi.
Fungsi berasal dari matematika di mana f (x) memiliki makna yang jelas karena fungsi memiliki definisi yang jauh lebih ketat yang biasanya dilakukannya dalam pemrograman. Fungsi murni dalam matematika dapat melakukan jauh lebih sedikit daripada yang mereka bisa dalam pemrograman dan mereka adalah alat yang jauh lebih elegan, mereka biasanya hanya mengambil satu argumen (yang biasanya angka) dan mereka selalu mengembalikan satu nilai (juga biasanya angka). Jika suatu fungsi mengambil banyak argumen, mereka hampir selalu hanya merupakan dimensi ekstra dari domain fungsi. Dengan kata lain, satu argumen tidak lebih penting daripada yang lain. Mereka secara eksplisit dipesan, tentu, tetapi selain itu, mereka tidak memiliki pemesanan semantik.
Namun dalam pemrograman, kami memiliki lebih banyak fungsi mendefinisikan kebebasan, dan dalam hal ini saya berpendapat itu bukan hal yang baik. Situasi umum, Anda memiliki fungsi yang didefinisikan seperti ini
func DrawRectangleClipped (rectToDraw, fillColor, clippingRect) {}
Melihat definisi tersebut, jika fungsinya ditulis dengan benar, sangat jelas apa itu. Saat memanggil fungsi, Anda bahkan mungkin memiliki beberapa keajaiban penyelesaian intellisense / kode yang terjadi di IDE / editor Anda yang akan memberi tahu Anda apa argumen selanjutnya. Tapi tunggu. Jika saya membutuhkannya ketika saya benar-benar menulis panggilan, bukankah ada sesuatu yang kita lewatkan di sini? Orang yang membaca kode tidak memiliki manfaat dari IDE dan kecuali mereka melompat ke definisi, mereka tidak tahu yang mana dari dua persegi panjang yang dilewati karena argumen digunakan untuk apa.
Masalahnya bahkan lebih jauh dari itu. Jika argumen kami berasal dari beberapa variabel lokal, mungkin ada situasi di mana kita bahkan tidak tahu apa argumen kedua karena kita hanya melihat nama variabel. Ambil contoh baris kode ini
DrawRectangleClipped(deserializedArray[0], deserializedArray[1], deserializedArray[2])
Ini dikurangi ke berbagai luasan dalam bahasa yang berbeda tetapi bahkan dalam bahasa yang diketik dengan ketat dan bahkan jika Anda memberi nama variabel Anda dengan masuk akal, Anda bahkan tidak menyebutkan jenis variabelnya ketika Anda meneruskannya ke fungsi.
Seperti biasanya dengan pemrograman, ada banyak solusi potensial untuk masalah ini. Banyak sudah diterapkan dalam bahasa populer. Parameter yang dinamai dalam C # misalnya. Namun, semua yang saya tahu memiliki kelemahan signifikan. Memberi nama setiap parameter pada setiap panggilan fungsi tidak mungkin menghasilkan kode yang dapat dibaca. Hampir terasa seperti mungkin kita mengatasi kemungkinan yang diberikan oleh pemrograman teks biasa. Kami telah pindah dari teks HANYA di hampir setiap area, namun kami masih kode yang sama. Informasi lebih lanjut diperlukan untuk ditampilkan dalam kode? Tambahkan lebih banyak teks. Ngomong-ngomong, ini menjadi sedikit singgung jadi saya akan berhenti di sini.
Satu balasan yang saya dapatkan pada potongan kode kedua adalah bahwa Anda mungkin akan terlebih dahulu membongkar array ke beberapa variabel bernama dan kemudian menggunakannya tetapi nama variabel dapat berarti banyak hal dan cara namanya tidak selalu memberi tahu Anda cara seharusnya. ditafsirkan dalam konteks fungsi yang disebut. Dalam lingkup lokal, Anda mungkin memiliki dua persegi panjang bernama leftRectangle dan rightRectangle karena itulah yang mereka wakili secara semantik, tetapi tidak perlu diperluas ke apa yang mereka wakili ketika diberikan ke suatu fungsi.
Bahkan, jika variabel Anda dinamai dalam konteks fungsi yang dipanggil daripada Anda memperkenalkan informasi kurang dari Anda berpotensi dengan panggilan fungsi dan pada tingkat tertentu jika memang mengarah ke kode kode yang lebih buruk. Jika Anda memiliki prosedur yang menghasilkan persegi panjang yang Anda simpan di rectForClipping dan kemudian prosedur lain yang menyediakan rectForDrawing, maka panggilan sebenarnya ke DrawRectangleClipped hanyalah upacara. Baris yang berarti tidak ada yang baru dan ada agar komputer tahu apa yang sebenarnya Anda inginkan meskipun Anda sudah menjelaskannya dengan penamaan Anda. Ini bukan hal yang baik.
Saya benar-benar ingin mendengar perspektif baru tentang ini. Saya yakin saya bukan orang pertama yang menganggap ini masalah, jadi bagaimana cara mengatasinya?