Saya cukup baru dalam rekayasa perangkat lunak, dan sebagai latihan belajar saya menulis permainan catur. Teman saya melihatnya dan menunjukkan bahwa kode saya terlihat seperti
for (int i = 0; i < 8; i++){
for (int j = 0; j < 8; j++){
sementara dia bersikeras bahwa itu seharusnya terjadi
for (int i = 0; i < CHESS_CONST; i++){
for (int j = 0; j < CHESS_CONST; j++){
dengan beberapa nama simbol yang lebih baik yang tidak bisa saya pikirkan saat ini.
Sekarang tentu saja saya tahu umumnya menghindari menggunakan angka ajaib, tapi saya merasa seperti itu
- jumlah ini tidak akan pernah berubah;
- namanya tidak bisa deskriptif karena nomor tersebut digunakan di banyak tempat di seluruh kode; dan
- siapa pun yang melalui kode sumber untuk program catur harus cukup tahu tentang catur untuk mengetahui apa tujuan 8 catur itu,
benar-benar tidak perlu untuk konstanta simbolis.
Jadi apa yang kalian pikirkan? Apakah ini berlebihan, atau haruskah saya pergi dengan konvensi dan menggunakan simbol?
coding-style
coding-standards
cokelat jahat
sumber
sumber
i
danj
untuk variabel loop. Saya tidak bisa seumur hidup saya mencari tahu mana yang seharusnya mewakili peringkat dan mana yang seharusnya mewakili file. Peringkat berkisar dari 1..8 dan file berkisar dari a .. h, tetapi dalam kasus Anda, keduanyai
danj
berkisar dari 0..7, sehingga tidak membantu saya melihat mana yang mana. Apakah ada krisis kekurangan surat internasional yang tidak saya ketahui, atau apa salahnya mengubah nama mereka menjadirank
danfile
?foreach(var rank in Ranks)
. Saya juga akan mempertimbangkan untuk menggabungkan kedua loop menjadi satu di mana setiap elemen adalah tuple (peringkat, file).Jawaban:
IMHO teman Anda benar dalam menggunakan nama simbolis, meskipun saya pikir nama pasti lebih deskriptif (seperti
BOARD_WIDTH
bukanCHESS_CONST
).Bahkan ketika nomor tidak akan pernah berubah selama masa program, mungkin ada tempat lain di program Anda di mana nomor 8 akan terjadi dengan makna yang berbeda. Mengganti "8" dengan
BOARD_WIDTH
dimanapun lebar papan dimaksud, dan menggunakan nama simbolis lain ketika hal yang berbeda dimaksudkan membuat makna yang berbeda ini eksplisit, jelas dan keseluruhan program Anda lebih mudah dibaca dan dipelihara. Ini memungkinkan Anda juga untuk melakukan pencarian global atas program Anda (atau pencarian simbol terbalik, jika lingkungan Anda menyediakannya) jika Anda perlu dengan cepat mengidentifikasi semua tempat dalam kode yang bergantung pada lebar papan.Lihat juga posting SE.SE ini sebelumnya untuk diskusi bagaimana (atau bagaimana tidak) memilih nama untuk angka.
Sebagai catatan tambahan, karena dibahas di sini di komentar : jika, dalam kode program nyata Anda, penting jika variabel
i
merujuk ke baris danj
kolom papan, atau sebaliknya, maka disarankan untuk memilih nama variabel yang buat perbedaannya jelas, sepertirow
dancol
. Manfaat dari nama-nama tersebut adalah, mereka membuat kode yang salah terlihat salah.sumber
Ok, berikut beberapa komentar yang saya miliki:
Menyingkirkan angka ajaib adalah ide bagus. Ada konsep yang dikenal sebagai KERING, yang sering salah diartikan, tetapi idenya adalah Anda tidak menduplikasi pengetahuan konsep-konsep dalam proyek Anda. Jadi, jika Anda memiliki kelas yang disebut ChessBoard, Anda bisa menyimpan konstanta yang disebut BOARD_SIZE atau ChessBoard.SIZE terlampir padanya. Dengan cara ini ada satu sumber tunggal untuk informasi ini. Juga, ini membantu keterbacaan nanti:
Bahkan jika angkanya tidak pernah berubah, program Anda bisa dibilang lebih baik. Setiap orang yang membacanya mengetahui lebih banyak informasi tentang apa yang dilakukan kode.
Nama yang buruk lebih buruk daripada tidak ada nama, tetapi itu tidak berarti bahwa sesuatu tidak boleh disebutkan namanya. Cukup ganti namanya. Jangan membuang bayi dengan air mandi. : p Nama dapat deskriptif selama Anda memahami dengan baik apa yang dijelaskan. Kemudian, konsep itu dapat digunakan untuk banyak hal yang berbeda.
sumber
Yang benar-benar Anda inginkan adalah menghilangkan referensi ad nauseum ke konstanta, apakah itu diberi nama atau kosong:
Jika Anda benar-benar akan memperbanyak konstanta dengan mengulang loop seperti itu dan yang lainnya, yang terbaik adalah tetap melakukannya
8
.8
menggambarkan diri sendiri; itu bukan makro yang berarti sesuatu yang lain.You Ain't Never Gonna (TM) mengubahnya menjadi program catur 9x9 dan jika Anda melakukannya, proliferasi 8 tidak akan menjadi kesulitan utama.
Kita dapat mencari 150.000 basis kode baris untuk token 8, dan mengklasifikasikan kejadian mana artinya dalam hitungan detik.
Jauh lebih penting adalah memodulasi kode sehingga pengetahuan catur terkonsentrasi di tempat sesedikit mungkin. Lebih baik untuk memiliki satu, dua, mungkin tiga modul khusus catur di mana 8 literal terjadi, daripada tiga puluh tujuh modul dicampur dengan tanggung jawab spesifik catur, merujuk 8 melalui nama simbolis.
Ketika atau jika konstanta 8 ini menjadi sumber ketegangan dalam program Anda, Anda dapat dengan mudah memperbaikinya saat itu. Perbaiki masalah nyata yang sedang terjadi sekarang. Jika Anda tidak merasa terhambat oleh angka 8 itu, pergilah dengan naluri itu.
Misalkan di masa depan Anda ingin mendukung dimensi papan alternatif. Dalam hal itu, loop tersebut harus berubah apakah mereka menggunakan konstanta bernama atau
8
, karena dimensi akan diambil oleh beberapa ekspresi sepertiboard.width
danboard.height
. Jika sudah,BOARD_SIZE
alih - alih8
, tempat-tempat ini akan lebih mudah ditemukan. Jadi itu kurang usaha. Namun, Anda tidak boleh lupa tentang upaya penggantian8
denganBOARD_SIZE
di tempat pertama. Upaya keseluruhan tidak lebih rendah. Membuat satu lulus melalui kode untuk perubahan8
untukBOARD_SIZE
, dan kemudian lain untuk mendukung dimensi alternatif, tidak lebih murah daripada hanya pergi dari8
dukungan dimensi alternatif.Kita juga dapat melihat ini dari analisis risiko / manfaat yang murni dingin, obyektif. Program ini memiliki konstanta kosong di dalamnya sekarang. Jika ini digantikan oleh konstanta, tidak ada manfaatnya; programnya identik. Dengan perubahan apa pun, ada risiko yang bukan nol. Dalam hal ini kecil. Namun, tidak ada risiko yang harus diambil tanpa manfaat. Untuk "menjual" perubahan dalam menghadapi alasan ini, kita harus berhipotesis manfaat: manfaat masa depan yang akan membantu dengan program yang berbeda: versi masa depan dari program yang tidak ada sekarang. Jika program semacam itu sedang direncanakan, hipotesis ini dan alasannya yang terkait adalah bonafid dan harus ditanggapi dengan serius.
Misalnya, jika Anda beberapa hari lagi menambahkan kode yang akan semakin memperbanyak konstanta ini, Anda mungkin ingin menghapusnya. Jika instance konstanta itu kira-kira semua instance yang pernah ada maka mengapa repot-repot.
Jika Anda pernah bekerja pada perangkat lunak komersial, argumen ROI juga akan berlaku. Jika suatu program tidak menjual, dan mengubah beberapa nomor kode-keras menjadi konstanta tidak akan meningkatkan penjualan, Anda tidak akan dikompensasikan dengan upaya tersebut. Perubahan tidak memiliki pengembalian investasi waktu. Argumen ROI menggeneralisasi di luar uang. Anda menulis sebuah program, menginvestasikan waktu dan usaha, dan mendapatkan sesuatu dari itu: itu pengembalian Anda, "R" Anda. Jika dengan melakukan perubahan itu sendiri, Anda mendapatkan lebih banyak dari "R" itu, apa pun itu, maka dengan segala cara. Jika Anda memiliki beberapa rencana untuk pengembangan lebih lanjut, dan perubahan itu meningkatkan "R" Anda, lagi. Jika perubahan itu tidak memiliki "R" yang dapat langsung atau dapat Anda lakukan, lupakan saja.
sumber
8
BUKAN menggambarkan diri sendiri, itu angka yang bisa berarti apa saja. Dan mungkin mereka ingin melakukan permainan catur 9x9, mengapa tidak? Jika Anda memiliki 150.000 baris kode, tidak mungkin Anda dapat menghafal arti setiap8
kode, dan bahkan jika Anda bisa, mengapa Anda melakukannya? Itu hanya banyak kerumitan ekstra. Sejauh modularisasi, mengganti8
dengan sesuatu sepertiNUM_RANKS
tidak merusak modularitas, pada kenyataannya, itu membantu karena membuat kode lebih mudah untuk bermain-main.8
denganBOARD_SIZE
di tempat pertama" - Waktu yang Anda habiskan meneliti kode Anda mencoba untuk mencari tahu apa yang masing8
- masing lakukan dalam program Anda beberapa bulan dari sekarang kemungkinan besar akan melebihi waktu yang dihabiskan untuk mengganti8
dengan konstanta tingkat modul yang bermakna.