Jadi profesor saya memberikan umpan balik pada proyek yang saya kerjakan. Dia merapat beberapa tanda untuk kode ini:
if (comboVendor.SelectedIndex == 0) {
createVendor cv = new createVendor();
cv.ShowDialog();
loadVendors();
}
Ini ada di dalam penangan "indeks yang diubah". Ini digunakan ketika pengguna ingin membuat vendor baru, opsi teratas saya (indeks 0, yang tidak pernah berubah) membuka dialog "Buat Vendor baru". Jadi isi kotak kombo saya akhirnya tampak seperti ini:
Create New Vendor...
Existing Vendor
Existing Vendor 2
Existing Vendor 3
Masalahnya adalah dengan kode baris pertama:
if (comboVendor.SelectedIndex == 0)
Dia mengklaim bahwa 0 harus berupa konstanta, dan benar-benar merapat pada saya karena itu. Dia mengklaim saya seharusnya tidak menggunakan literal dalam kode saya sama sekali.
Masalahnya, saya tidak mengerti mengapa saya ingin membuat kode itu dalam situasi itu konstan. Indeks itu tidak akan pernah berubah, juga bukan sesuatu yang perlu Anda ubah. Sepertinya pemborosan memori untuk menyimpan satu 0 dalam memori yang digunakan untuk situasi yang sangat spesifik dan tidak pernah berubah.
-1
dalamstr.indexOf(substr) != -1
untuk "str
mengandungsubstr
" dibenarkan secara prefek. Tapi di sini, arti dari 0 tidak jelas (apa hubungannya dengan menciptakan vendor baru?) Atau benar-benar konstan (bagaimana jika cara membuat vendor baru berubah?).int.Zero
sebagai gantinya untuk membuatnya senang :)Jawaban:
Cara sebenarnya yang benar untuk melakukan ini dalam C # adalah dengan tidak bergantung pada pemesanan ComboItems sama sekali .
sumber
Urutan di kotak kombo bisa berubah. Bagaimana jika Anda menambahkan opsi lain seperti "Buat Vendor Khusus ..." sebelum "Buat Penjual Baru ..."
Keuntungan menggunakan konstanta adalah jika ada banyak metode yang bergantung pada urutan kotak kombo, Anda hanya perlu mengubah konstanta dan tidak semua metode jika ini memang berubah.
Menggunakan konstanta juga lebih mudah dibaca daripada literal.
Sebagian besar bahasa yang dikompilasi akan menggantikan konstanta pada waktu kompilasi, sehingga tidak ada penalti kinerja.
sumber
Situasi yang Anda gambarkan ini adalah panggilan penilaian, secara pribadi saya tidak akan menggunakannya jika hanya digunakan sekali dan sudah dapat dibaca.
Namun jawaban sebenarnya adalah bahwa dia memilih ini untuk memberi Anda pelajaran.
Jangan lupa bahwa dia adalah seorang profesor, tugasnya adalah mengajarkan Anda coding dan praktik terbaik.
Saya akan mengatakan dia melakukan pekerjaan yang cukup bagus sebenarnya.
Tentu dia mungkin terlihat agak absolut, tetapi saya yakin Anda akan berpikir lagi sebelum menggunakan angka ajaib.
Juga dia cukup di bawah kulit Anda untuk bergabung dengan komunitas online tentang programmer hanya untuk mencari tahu apa yang dianggap praktik terbaik dalam situasi ini.
Angkat topi untuk profesor Anda.
sumber
Fakta bahwa Anda harus menjelaskan itu membuktikan mengapa Anda harus menggunakan konstanta. Jika Anda memperkenalkan konstanta seperti
NEW_VENDOR_DIALOG
, kode Anda akan lebih jelas. Selain itu, kompiler mengoptimalkan konstanta, sehingga tidak akan ada perubahan dalam kinerja.Tulis program untuk pemrogram, bukan kompiler. Kecuali jika Anda secara khusus mencoba mengoptimalkan mikro, yang tampaknya tidak seperti Anda.
sumber
Saya setuju. Penggunaan nol di sini adalah "sihir". Bayangkan Anda membaca kode ini untuk pertama kalinya. Anda tidak tahu mengapa nol itu istimewa, dan literal tidak memberi tahu Anda mengapa nol itu istimewa. Jika sebaliknya Anda berkata
if(comboVendor.SelectedIndex == CreateNewVendorIndex)
maka menjadi sangat jelas bagi pembaca pertama kali apa arti kode tersebut.Itu posisi yang ekstrem; posisi yang realistis adalah untuk mengatakan bahwa penggunaan literal adalah bendera merah yang menunjukkan bahwa kode mungkin tidak sejelas mungkin. Terkadang itu tepat.
Bahwa itu tidak akan pernah berubah adalah alasan yang bagus untuk membuatnya konstan . Itu sebabnya konstanta disebut konstanta; karena mereka tidak pernah berubah.
Sangat? Anda tidak dapat melihat setiap situasi di mana seseorang mungkin ingin mengubah urutan hal-hal dalam kotak combo?
Fakta bahwa Anda dapat melihat alasan mengapa ini mungkin berubah di masa depan adalah alasan yang baik untuk tidak menjadikannya konstan. Alih-alih itu harus berupa bidang bilangan bulat statis tidak-baca yang konstan. Konstanta harus berupa kuantitas yang dijamin tetap sama untuk sepanjang masa . Pi dan jumlah atom emas adalah konstanta yang baik. Nomor versi tidak; mereka mengubah setiap versi. Harga emas jelas merupakan konstanta yang mengerikan; itu berubah setiap detik. Hanya membuat hal-hal konstan yang tidak pernah berubah .
Sekarang kita sampai pada inti permasalahan.
Ini mungkin adalah baris paling penting dalam pertanyaan Anda karena ini menunjukkan bahwa Anda memiliki pemahaman yang sangat cacat tentang (1) memori, dan (2) optimasi. Anda di sekolah untuk belajar, dan sekarang akan menjadi saat yang tepat untuk mendapatkan pemahaman yang benar tentang dasar-dasarnya. Bisakah Anda jelaskan secara terperinci mengapa Anda percaya bahwa "itu adalah pemborosan memori untuk menjaga satu nol dalam memori"? Pertama, mengapa Anda percaya bahwa mengoptimalkan penggunaan empat byte memori dalam proses dengan setidaknya dua miliar byte penyimpanan yang dapat dialamatkan oleh pengguna relevan? Kedua, tepatnya sumber daya apa yang Anda bayangkan sedang dikonsumsi di sini ? Apa yang Anda maksud dengan "memori" yang dikonsumsi?
Saya tertarik pada jawaban atas pertanyaan-pertanyaan ini pertama karena itu adalah kesempatan bagi Anda untuk belajar bagaimana pemahaman Anda tentang optimasi dan manajemen memori tidak benar, dan kedua karena saya selalu ingin tahu mengapa pemula percaya hal-hal aneh, sehingga saya dapat merancang alat yang lebih baik untuk memimpin mereka untuk memiliki keyakinan yang benar.
sumber
Dia benar. Kamu benar. Anda salah.
Dia benar, secara konseptual, bahwa angka ajaib harus dihindari. Konstanta membuat kode lebih mudah dibaca dengan menambahkan konteks pada arti angka tersebut. Di masa mendatang ketika seseorang membaca kode Anda, mereka tahu mengapa nomor tertentu digunakan. Dan jika Anda perlu mengubah nilai di suatu tempat di telepon, jauh lebih baik untuk mengubahnya di satu tempat daripada mencoba memburu di mana-mana di mana nomor tertentu digunakan.
Yang sedang berkata, Anda benar. Dalam kasus khusus ini, saya benar-benar tidak berpikir konstanta dijamin. Anda mencari item pertama dalam daftar, yang selalu nol. Tidak akan pernah menjadi 23. Atau -pi. Anda secara khusus mencari nol. Saya benar-benar tidak berpikir Anda perlu mengacaukan kode dengan membuatnya konstan.
Anda salah, meskipun, dengan asumsi konstanta dibawa-bawa sebagai variabel, 'menggunakan memori'. Sebuah konstanta ada untuk manusia dan kompiler. Ini memberitahu kompiler untuk meletakkan nilai itu di tempat itu selama kompilasi, di mana Anda seharusnya meletakkan angka literal. Dan bahkan jika itu membawa konstan dalam memori, untuk semua kecuali aplikasi yang paling menuntut, hilangnya efisiensi bahkan tidak bisa diukur. Khawatir tentang penggunaan memori integer tunggal pasti jatuh ke 'optimasi prematur'.
sumber
Saya akan mengganti
0
dengan konstanta untuk memperjelas artinya, sepertiNewVendorIndex
. Anda tidak pernah tahu apakah pesanan Anda akan berubah.sumber
Itu adalah preferensi total profesor Anda. Biasanya, Anda hanya menggunakan konstanta jika literal akan digunakan beberapa kali, Anda ingin memperjelas kepada pembaca apa tujuan dari baris tersebut, atau literal Anda mungkin akan berubah di masa depan, dan Anda hanya ingin mengubah di satu tempat. Namun, untuk semester ini, profesor adalah bos, jadi saya akan melakukannya mulai sekarang di kelas itu.
Pelatihan yang bagus untuk dunia usaha? Sangat Mungkin.
sumber
Sejujurnya, sementara saya tidak berpikir kode Anda adalah praktik terbaik, sarannya terus terang sedikit aneh.
Praktik yang lebih umum untuk .NET combobox adalah memberikan item "Pilih .." nilai kosong, sedangkan item sebenarnya memiliki nilai yang bermakna, lalu lakukan:
daripada
sumber
Dia tidak salah untuk menekankan nilai menggunakan konstanta dan Anda tidak salah dalam menggunakan literal. Kecuali dia telah menekankan bahwa ini adalah gaya pengkodean yang diharapkan, Anda tidak boleh kehilangan nilai karena menggunakan literal karena mereka tidak berbahaya. Saya telah melihat literal yang digunakan di semua tempat berkali-kali dalam kode komersial.
Maksudnya bagus. Ini mungkin caranya agar Anda mengetahui manfaat konstanta:
1-Mereka melindungi kode Anda sampai batas tertentu dari gangguan yang tidak disengaja
2-Seperti @DeadMG mengatakan dalam jawabannya, jika nilai literal yang sama digunakan di banyak tempat itu mungkin muncul dengan nilai yang berbeda secara tidak sengaja - Jadi konstanta menjaga konsistensi.
3-Constants mempertahankan tipe, jadi Anda tidak perlu menggunakan sesuatu seperti 0F berarti nol.
4-Untuk kemudahan membaca, COBOL menggunakan NOL sebagai kata yang disediakan untuk nilai nol (tetapi juga memungkinkan Anda untuk menggunakan nol literal) - Jadi, memberi nilai nama kadang-kadang bermanfaat, misalnya: (Sumber: ms-Konstants
atau seperti dalam kasus Anda (seperti yang ditunjukkan pada jawaban @Michael Krussel)
sumber
int weeks = 52
, tidak ada 52 minggu per tahun. Ada 52.142857142857146 minggu dalam setahun, dan itulah angka yang harus Anda pertahankan. Tentu saja, satu-satunya hal yang benar-benar konstan di seluruh rangkaian konstanta itu adalah jumlah bulan.Anda hanya perlu meletakkannya dalam konstanta jika memiliki derivasi yang kompleks, atau jika sering diulang. Lain, literal baik-baik saja. Menempatkan segala sesuatu dalam sebuah konstanta adalah total berlebihan.
sumber
Sebenarnya, seperti yang disebutkan, bagaimana jika posisinya berubah? Apa yang bisa / harus Anda lakukan adalah menggunakan kode, daripada mengandalkan indeks.
Jadi, ketika Anda membuat daftar pilih Anda berakhir dengan seperti html
Kemudian, alih-alih memeriksa
selectedIndex === 0
, periksa bahwa nilainya adalahCREATECODE
dalam konstanta dan akan digunakan untuk kedua tes ini, dan saat membuat daftar pilih.sumber
Saya akan menyingkirkannya sama sekali. Masukkan saja tombol buat di sebelah daftar kotak kombo. Klik dua kali item dalam daftar untuk mengedit, atau klik tombol. Tidak memiliki fungsi baru yang terkubur dalam kotak kombo. Kemudian angka ajaib dihapus sama sekali.
Secara umum setiap angka literal dalam kode harus didefinisikan sebagai konstanta untuk menempatkan konteks di sekitar angka tersebut. Apa artinya nol? Dalam hal ini 0 = NEW_VENDOR. Dalam kasus lain, itu mungkin berarti sesuatu yang berbeda, jadi itu selalu merupakan ide yang baik untuk keterbacaan dan pemeliharaan untuk menempatkan beberapa konteks di sekitarnya.
sumber
Seperti yang orang lain katakan, Anda harus menggunakan beberapa metode selain nomor indeks untuk mengidentifikasi item kotak kombo yang sesuai dengan tindakan yang diberikan; atau, Anda dapat menemukan indeks dengan beberapa logika program dan menyimpannya dalam sebuah variabel.
Alasan saya menulis adalah untuk menanggapi komentar Anda tentang "penggunaan memori". Dalam C #, seperti dalam kebanyakan bahasa, konstanta "dilipat" oleh kompiler. Misalnya, kompilasi program berikut, dan periksa IL. Anda akan menemukan bahwa semua angka itu bahkan tidak membuatnya menjadi IL, apalagi memori komputer:
IL yang dihasilkan:
Jadi, apakah Anda menggunakan konstanta, literal, atau satu kilobita kode menggunakan aritmatika konstan, nilainya diperlakukan secara harfiah dalam IL.
Poin terkait: Pelipatan konstan berlaku untuk string literal. Banyak yang percaya bahwa panggilan seperti ini menyebabkan penggabungan string yang tidak perlu dan tidak efisien:
Tapi lihat IL:
Intinya: Operator pada ekspresi konstan menghasilkan ekspresi konstan, dan kompilator melakukan semua perhitungan; itu tidak mempengaruhi kinerja run-time.
sumber