Saat menulis beberapa fungsi, saya menemukan kata kunci const dalam parameter seperti ini:
void MyClass::myFunction(const MyObject& obj,const string& s1,const string& s2,const string& s3){
}
sering menyebabkan pemisahan baris menjadi 2 baris dalam IDE atau vim, jadi saya ingin menghapus semua kata kunci const dalam parameter:
void MyClass::myFunction(MyObject& obj,string& s1,string& s2,string& s3){
}
apakah itu alasan yang sah untuk tidak menggunakan const? Apakah dapat dipertahankan untuk menjaga objek parameter tidak berubah secara manual?
c++
coding-style
const
ggrr
sumber
sumber
const
Anda memiliki petunjuk kuat bahwa Anda tidak perlu repot-repot bagaimana itu dapat diubah dalam fungsi.Jawaban:
Keterbacaan adalah alasan yang valid untuk belajar menggunakan spasi putih:
Terletak di sana parameter tidak akan bingung dengan tubuh fungsi. Dengan menempatkan mereka pada baris yang berbeda, Anda tidak perlu memposisikan ulang ketika Anda mengubah nama
myFunction
menjadi sesuatu yang lebih deskriptif. Tidak mengubah posisi parameter ketika mereka belum berubah adalah sesuatu yang akan dihargai oleh pengguna alat kontrol sumber.const
berarti sesuatu. Jangan membuangnya hanya karena Anda kehabisan ruang dan ide. Keterbacaan adalah raja tetapi melanggar hal-hal dalam namanya hanya menyerah.sumber
(
, dan jika itu yang terjadi maka Anda mungkin harus memposisikan ulang mereka jika panjang nama fungsi kelas + berubah lebih dari sekitar 4 karakter. Jadi, jika Anda ingin tidak harus melakukan itu, tambahkan sejumlah tingkat lekukan, bukan angka yang tergantung pada panjang nama fungsi. Saya akan merekomendasikan 1 level, jawaban ini menggunakan 6, tetapi setiap nomor tetap mencapai tujuan yang dinyatakan :-)Sebenarnya, masalah keterbacaan jelas mengarah ke arah lain. Pertama, Anda dapat dengan mudah menyelesaikan run-on line Anda dengan menggunakan spasi . Tetapi menghapus
const
tidak hanya membuat garis lebih pendek, itu benar-benar mengubah arti dari program.Herb Sutter merujuk
const
pada referensiconst
sebagai yang paling pentingconst
karena referensi untukconst
dapat mengikat untuk sementara dan memperpanjang masa pakainya. Referensi nilai nonconst
-tidak bisa, Anda memerlukan variabel terpisah.Apa artinya ini bagi kegunaan adalah bahwa Anda harus memperkenalkan semua variabel sementara ini hanya untuk dapat memanggil fungsi Anda. Itu tidak bagus untuk dibaca, karena variabel-variabel ini tidak ada artinya dan hanya ada karena tanda tangan Anda salah.
sumber
const
itu merujukconst
ke yang lainconst
dan apaconst
yang memang paling pentingconst
const&
daripada merujukconst
sebagai kata benda (-fase) di sanaJawaban sederhana adalah "tidak".
Jawaban panjangnya adalah bahwa
const
kata kunci adalah bagian dari kontrak yang ditawarkan fungsi; itu memberitahu Anda bahwa argumen tidak akan diubah. Saat Anda menghapusconst
jaminan itu keluar dari jendela. Ingatlah bahwa Anda tidak dapat secara wajar menjaga ketegaran (atau properti lainnya) dari sesuatu yang menggunakan dokumentasi, konvensi, atau pedoman - jika ketegaran tidak ditegakkan oleh kompiler, seseorang akan berpikir bahwa mereka dapat membuat pekerjaan mereka lebih mudah jika mereka mengutak-atik parameter "hanya sedikit". Mempertimbangkan:Terlepas dari kenyataan bahwa versi terakhir lebih ringkas, itu juga memberikan kontrak yang lebih kuat, dan memungkinkan kompiler membantu Anda mempertahankan niat Anda. Yang pertama tidak melakukan apa pun untuk mencegah
fna(Foo&)
fungsi memodifikasi parameter yang Anda berikan.Seperti dalam jawaban @CandiedOrange, Anda dapat menggunakan spasi putih untuk meletakkan kode dan meningkatkan keterbacaan.
sumber
Menghapus
const
kata kunci menghilangkan keterbacaan karenaconst
mengkomunikasikan informasi kepada pembaca dan kompiler.Mengurangi panjang kode horizontal itu baik (tidak ada yang suka menggulir ke samping) tetapi ada lebih
const
dari sekadar teks. Anda dapat menulis ulang:Yang tidak mengubah kontrak tetapi memenuhi kebutuhan untuk mengurangi panjang garis. Sungguh saya akan menganggap potongan di atas kurang dapat dibaca dan akan memilih untuk menggunakan lebih banyak ruang putih seperti yang telah disebutkan dalam jawaban CandiedOrange.
const
adalah fungsi dari kode itu sendiri. Anda tidak akan menjadikan fungsi sebagai non-anggota untuk menghapusMyClass::
bagian dari deklarasi, jadi jangan hapusconst
sumber
MObj
dan apastr
, dan tentu saja mengangkat alis. Ini terutama aneh untuk jenis yang namanya Anda sudah memiliki kontrol atas: Misalnya Kenapa kau tidak hanya namaMyObject
sepertiMObj
untuk memulai dengan?Tidak. Mengabaikan
const
dapat mengubah fungsionalitas, kehilangan perlindungan,const
dan berpotensi membuat kode yang kurang efisien.Daripada menghabiskan waktu memformat kode secara manual
Gunakan alat pemformatan otomatis . Tulis fungsi sesuai persyaratan fungsionalnya dan biarkan pemformatan otomatis menangani presentasi. Menyesuaikan pemformatan secara manual tidak seefisien menggunakan pemformatan otomatis dan menggunakan waktu yang disimpan untuk meningkatkan aspek kode lainnya.
sumber
Selama mungkin lebih baik untuk menjaga agar konst terlihat. Ini meningkatkan pemeliharaan kode banyak (tidak ada dugaan untuk melihat apakah metode ini mengubah argumen saya).
Jika saya melihat banyak argumen dalam suatu metode, itu memaksa saya untuk mempertimbangkan pembuatan jaron berbasis proyek (Matriks, Karyawan, Persegi Panjang, Akun) yang akan jauh lebih pendek, lebih mudah dipahami (menghilangkan daftar panjang argumen untuk metode).
sumber
typedef Point * LPPOINT
dantypedef const Point * LPCPOINT
, meskipun sangat menjengkelkan, masih membawa makna tersirat, karena konsisten dengan harapan langsung dalam konteks. Tetapi tidak pernah dalam kasus umum; itu hanya pengecualian aneh yang bisa saya pikirkan.