Beberapa waktu yang lalu saya banyak memprogram dalam ADA, dan itu normal untuk menyebutkan argumen ketika menjalankan fungsi - SomeObject.DoSomething (SomeParameterName => someValue);
Sekarang C # mendukung argumen bernama, saya berpikir untuk kembali ke kebiasaan ini dalam situasi di mana mungkin tidak jelas apa arti argumen.
Anda mungkin berpendapat bahwa itu harus selalu jelas apa artinya argumen, tetapi jika Anda memiliki argumen boolean, dan penelepon menyampaikan "benar" atau "salah" maka kualifikasi nilai dengan nama membuat situs panggilan lebih mudah dibaca.
contentFetcher.DownloadNote (catatan, manual: true);
Saya kira saya bisa membuat Enums daripada menggunakan benar atau salah (Manual, Otomatis dalam kasus ini).
Apa yang Anda pikirkan sesekali menggunakan argumen bernama untuk membuat kode lebih mudah dibaca?
sumber
Jawaban:
Ini disarankan dalam pengembangan C ++, dan Stroustrup membahasnya dalam "Desain dan Evolusi C ++", halaman 153 dan selanjutnya. Proposal ini dibentuk dengan baik, dan mengacu pada pengalaman sebelumnya dengan Ada. Itu tidak diadopsi.
Alasan terbesar adalah bahwa tidak ada yang ingin mendorong fungsi dengan sejumlah besar parameter. Setiap fitur tambahan dalam bahasa memerlukan biaya, dan tidak ada keinginan untuk menambahkan fitur untuk membuatnya lebih mudah untuk menulis program yang buruk.
Itu juga menimbulkan pertanyaan tentang apa nama parameter kanonik itu, khususnya dalam header file kode konvensional. Beberapa organisasi memiliki nama parameter yang lebih panjang dan lebih deskriptif dalam file .h, dan lebih pendek dan lebih mudah untuk mengetik nama dalam file .cpp (ganti akhiran file yang diinginkan). Membutuhkan hal yang sama akan menjadi biaya tambahan pada kompilasi, dan menggabungkan nama-nama di antara file sumber dapat menyebabkan bug halus.
Itu juga dapat ditangani dengan menggunakan objek daripada panggilan fungsi. Alih-alih panggilan GetWindow dengan selusin parameter, buat kelas Window dengan selusin variabel pribadi, dan tambahkan setter yang diperlukan. Dengan merantai setter, mungkin untuk menulis sesuatu seperti
my_window.SetColor(green).SetBorder(true).SetBorderSize(3);
. Mungkin juga memiliki fungsi yang berbeda dengan standar berbeda yang memanggil fungsi yang benar-benar berfungsi.Jika Anda hanya khawatir tentang efek dokumentasi
contentFetcher.DownloadNote(note, manual : true);
, Anda selalu dapat menulis sesuatu seperticontentFetcher.DownloadNote(note, /* manual */ true);
, jadi itu bahkan tidak sangat membantu dalam dokumentasi.sumber
Saya pikir ini masalah membuat kode buruk lebih mudah dibaca, daripada "praktik terbaik".
Memiliki metode (atau kontraktor) yang mengambil 20 parameter adalah "bau buruk" dan kemungkinan disebabkan oleh masalah dalam desain Anda. Namun jika saya terpaksa bekerja pada kode ketika metode mengambil banyak parameter, maka parameter bernama membuat kode kurang sulit untuk dipahami.
Ketika metode hanya memiliki 1 atau 2 parameter dan jelas dari nama metode apa parameternya, kemudian bernama parameter tidak menambahkan apa pun. Ini adalah kasus ideal untuk masuk
Jika semua kode yang Anda kerjakan ditulis sebagai par pada buku " kode bersih ", maka Anda akan menggunakan sangat sedikit untuk parameter bernama, namun kita hidup di dunia nyata.
sumber
void TrackDataChange(Data oldData, Data newData)
Saya setuju bahwa menambahkan nama parameter membuatnya lebih mudah dibaca. Namun, sebagian besar buku yang saya baca tampaknya menganggap beralih boolean sebagai praktik yang buruk. Saya terkadang melakukan ini:
Itu memang memberi Anda lebih banyak fleksibilitas saat menerapkan API Anda. Ini juga memungkinkan Anda untuk mengontrol case di mana Anda memiliki beberapa switch boolean, tetapi tidak semuanya aktif pada saat yang sama.
sumber
Saya sangat percaya pada parameter bernama dalam situasi di mana jenis dan semantik tidak jelas dari nama metode. Pengalaman saya adalah bahwa beberapa orang membaca dokumentasi.
Yang sedang dikatakan, parameter bernama tidak boleh menjadi alternatif untuk membuat daftar argumen yang masuk akal, menggunakan objek pembantu (untuk "mengikat" bersama argumen terkait semantik), dan menggunakan enumerasi jika relevan.
sumber
Saya pikir ini lebih berguna dalam bahasa non-OO, di mana Anda mungkin memiliki satu fungsi yang harus melakukan sesuatu dalam beberapa cara yang sedikit berbeda, dan cara menentukan apa yang harus dilakukan didasarkan pada nilai parameter. Di dunia OOP, kita hanya akan membebani fungsi, tetapi ketika itu tidak mungkin maka Anda akhirnya melewati sekelompok bendera (atau sekelompok nilai, dan apakah mereka dilewati adalah bendera).
Saya pikir itu lebih mudah dibaca, sampai batas tertentu; tetapi seperti yang telah disebutkan orang lain, memiliki banyak parameter adalah bau kode, jadi saya tidak melihat banyak digunakan untuk ini dalam bahasa berorientasi objek seperti C #.
sumber